001    /*
002     * Copyright (C) 2012 eXo Platform SAS.
003     *
004     * This is free software; you can redistribute it and/or modify it
005     * under the terms of the GNU Lesser General Public License as
006     * published by the Free Software Foundation; either version 2.1 of
007     * the License, or (at your option) any later version.
008     *
009     * This software is distributed in the hope that it will be useful,
010     * but WITHOUT ANY WARRANTY; without even the implied warranty of
011     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012     * Lesser General Public License for more details.
013     *
014     * You should have received a copy of the GNU Lesser General Public
015     * License along with this software; if not, write to the Free
016     * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
017     * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
018     */
019    
020    package org.crsh.lang.script;
021    
022    import org.crsh.command.CommandInvoker;
023    import org.crsh.command.NoSuchCommandException;
024    import org.crsh.command.ShellCommand;
025    import org.crsh.repl.REPLSession;
026    import org.crsh.command.pipeline.PipeLine;
027    import org.crsh.text.Chunk;
028    
029    import java.util.LinkedList;
030    import java.util.regex.Pattern;
031    
032    /**
033     * A factory for a pipeline.
034     */
035    public class PipeLineFactory {
036    
037      /** . */
038      final String line;
039    
040      /** . */
041      final String name;
042    
043      /** . */
044      final String rest;
045    
046      /** . */
047      final PipeLineFactory next;
048    
049      public String getLine() {
050        return line;
051      }
052    
053      public PipeLineFactory getNext() {
054        return next;
055      }
056    
057      public PipeLineFactory(String line, PipeLineFactory next) {
058    
059        Pattern p = Pattern.compile("^\\s*(\\S+)");
060        java.util.regex.Matcher m = p.matcher(line);
061        String name = null;
062        String rest = null;
063        if (m.find()) {
064          name = m.group(1);
065          rest = line.substring(m.end());
066        }
067    
068        //
069        this.name = name;
070        this.rest = rest;
071        this.line = line;
072        this.next = next;
073      }
074    
075      public CommandInvoker<Void, Chunk> create(REPLSession session) throws NoSuchCommandException {
076    
077        //
078        LinkedList<CommandInvoker> pipes = new LinkedList<CommandInvoker>();
079        for (PipeLineFactory current = this;current != null;current = current.next) {
080          CommandInvoker commandInvoker = null;
081          if (current.name != null) {
082            ShellCommand command = session.getCommand(current.name);
083            if (command != null) {
084              commandInvoker = command.resolveInvoker(current.rest);
085            }
086          }
087          if (commandInvoker == null) {
088            throw new NoSuchCommandException(current.name);
089          }
090          pipes.add(commandInvoker);
091        }
092    
093        //
094        return new PipeLine(pipes.toArray(new CommandInvoker[pipes.size()]));
095      }
096    
097      public PipeLineFactory getLast() {
098        if (next != null) {
099          return next.getLast();
100        }
101        return this;
102      }
103    }