Search in sources :

Example 1 with CommandSessionImpl

use of org.apache.felix.gogo.runtime.CommandSessionImpl in project felix by apache.

the class Shell method gosh.

public Object gosh(CommandSession currentSession, String[] argv) throws Exception {
    final String[] usage = { "gosh - execute script with arguments in a new session", "  args are available as session variables $1..$9 and $args.", "Usage: gosh [OPTIONS] [script-file [args..]]", "  -c --command             pass all remaining args to sub-shell", "     --nointeractive       don't start interactive session", "     --nohistory           don't save the command history", "     --login               login shell (same session, reads etc/gosh_profile)", "  -s --noshutdown          don't shutdown framework when script completes", "  -x --xtrace              echo commands before execution", "  -? --help                show help", "If no script-file, an interactive shell is started, type $D to exit." };
    Options opt = Options.compile(usage).setOptionsFirst(true).parse(argv);
    List<String> args = opt.args();
    boolean login = opt.isSet("login");
    boolean interactive = !opt.isSet("nointeractive");
    if (opt.isSet("help")) {
        opt.usage(System.err);
        if (login && !opt.isSet("noshutdown")) {
            shutdown();
        }
        return null;
    }
    if (opt.isSet("command") && args.isEmpty()) {
        throw opt.usageError("option --command requires argument(s)");
    }
    CommandSession session;
    if (login) {
        session = currentSession;
    } else {
        session = createChildSession(currentSession);
    }
    if (opt.isSet("xtrace")) {
        session.put("echo", true);
    }
    Terminal terminal = getTerminal(session);
    session.put(Shell.VAR_CONTEXT, context);
    session.put(Shell.VAR_PROCESSOR, processor);
    session.put(Shell.VAR_SESSION, session);
    session.put("#TERM", (Function) (s, arguments) -> terminal.getType());
    session.put("#COLUMNS", (Function) (s, arguments) -> terminal.getWidth());
    session.put("#LINES", (Function) (s, arguments) -> terminal.getHeight());
    session.put("#PWD", (Function) (s, arguments) -> s.currentDir().toString());
    if (!opt.isSet("nohistory")) {
        session.put(LineReader.HISTORY_FILE, Paths.get(System.getProperty("user.home"), ".gogo.history"));
    }
    if (tio != null) {
        PrintWriter writer = terminal.writer();
        PrintStream out = new PrintStream(new OutputStream() {

            @Override
            public void write(int b) throws IOException {
                write(new byte[] { (byte) b }, 0, 1);
            }

            public void write(byte[] b, int off, int len) throws IOException {
                writer.write(new String(b, off, len));
            }

            public void flush() throws IOException {
                writer.flush();
            }

            public void close() throws IOException {
                writer.close();
            }
        });
        tio.setStreams(terminal.input(), out, out);
    }
    try {
        LineReader reader;
        if (args.isEmpty() && interactive) {
            CompletionEnvironment completionEnvironment = new CompletionEnvironment() {

                @Override
                public Map<String, List<CompletionData>> getCompletions() {
                    return Shell.getCompletions(session);
                }

                @Override
                public Set<String> getCommands() {
                    return Shell.getCommands(session);
                }

                @Override
                public String resolveCommand(String command) {
                    return Shell.resolve(session, command);
                }

                @Override
                public String commandName(String command) {
                    int idx = command.indexOf(':');
                    return idx >= 0 ? command.substring(idx + 1) : command;
                }

                @Override
                public Object evaluate(LineReader reader, ParsedLine line, String func) throws Exception {
                    session.put(Shell.VAR_COMMAND_LINE, line);
                    return session.execute(func);
                }
            };
            reader = LineReaderBuilder.builder().terminal(terminal).variables(((CommandSessionImpl) session).getVariables()).completer(new org.jline.builtins.Completers.Completer(completionEnvironment)).highlighter(new Highlighter(session)).parser(new Parser()).expander(new Expander(session)).build();
            reader.setOpt(LineReader.Option.AUTO_FRESH_LINE);
            session.put(Shell.VAR_READER, reader);
            session.put(Shell.VAR_COMPLETIONS, new HashMap());
        } else {
            reader = null;
        }
        if (login || interactive) {
            URI uri = baseURI.resolve("etc/" + profile);
            if (!new File(uri).exists()) {
                URL url = getClass().getResource("/ext/" + profile);
                if (url == null) {
                    url = getClass().getResource("/" + profile);
                }
                uri = (url == null) ? null : url.toURI();
            }
            if (uri != null) {
                source(session, uri.toString());
            }
        }
        Object result = null;
        if (args.isEmpty()) {
            if (interactive) {
                result = runShell(session, terminal, reader);
            }
        } else {
            CharSequence program;
            if (opt.isSet("command")) {
                StringBuilder buf = new StringBuilder();
                for (String arg : args) {
                    if (buf.length() > 0) {
                        buf.append(' ');
                    }
                    buf.append(arg);
                }
                program = buf;
            } else {
                URI script = session.currentDir().toUri().resolve(args.remove(0));
                // set script arguments
                session.put("0", script);
                session.put("args", args);
                for (int i = 0; i < args.size(); ++i) {
                    session.put(String.valueOf(i + 1), args.get(i));
                }
                program = readScript(script);
            }
            result = session.execute(program);
        }
        if (login && interactive && !opt.isSet("noshutdown")) {
            if (terminal != null) {
                terminal.writer().println("gosh: stopping framework");
                terminal.flush();
            }
            shutdown();
        }
        return result;
    } finally {
        if (tio != null) {
            tio.close();
        }
    }
}
Also used : Job(org.apache.felix.service.command.Job) LineReaderBuilder(org.jline.reader.LineReaderBuilder) URL(java.net.URL) Status(org.apache.felix.service.command.Job.Status) Descriptor(org.apache.felix.service.command.Descriptor) CommandSession(org.apache.felix.service.command.CommandSession) ParsedLine(org.jline.reader.ParsedLine) Map(java.util.Map) CommandProxy(org.apache.felix.gogo.runtime.CommandProxy) URI(java.net.URI) Method(java.lang.reflect.Method) Options(org.jline.builtins.Options) PrintWriter(java.io.PrintWriter) LineReader(org.jline.reader.LineReader) CharBuffer(java.nio.CharBuffer) Set(java.util.Set) Reader(java.io.Reader) CompletionEnvironment(org.jline.builtins.Completers.CompletionEnvironment) List(java.util.List) EndOfFileException(org.jline.reader.EndOfFileException) Annotation(java.lang.annotation.Annotation) Entry(java.util.Map.Entry) Function(org.apache.felix.service.command.Function) CommandSessionImpl(org.apache.felix.gogo.runtime.CommandSessionImpl) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) SignalHandler(org.jline.terminal.Terminal.SignalHandler) CompletionData(org.jline.builtins.Completers.CompletionData) URLConnection(java.net.URLConnection) Reflective(org.apache.felix.gogo.runtime.Reflective) Terminal(org.jline.terminal.Terminal) OutputStream(java.io.OutputStream) PrintStream(java.io.PrintStream) Parameter(org.apache.felix.service.command.Parameter) Closure(org.apache.felix.gogo.runtime.Closure) CommandProcessor(org.apache.felix.service.command.CommandProcessor) Iterator(java.util.Iterator) AttributedStyle(org.jline.utils.AttributedStyle) IOException(java.io.IOException) Field(java.lang.reflect.Field) InputStreamReader(java.io.InputStreamReader) File(java.io.File) ThreadIO(org.apache.felix.service.threadio.ThreadIO) Converter(org.apache.felix.service.command.Converter) TreeMap(java.util.TreeMap) AttributedStringBuilder(org.jline.utils.AttributedStringBuilder) Paths(java.nio.file.Paths) Signal(org.jline.terminal.Terminal.Signal) UserInterruptException(org.jline.reader.UserInterruptException) InputStream(java.io.InputStream) Options(org.jline.builtins.Options) AttributedStringBuilder(org.jline.utils.AttributedStringBuilder) HashMap(java.util.HashMap) OutputStream(java.io.OutputStream) URI(java.net.URI) URL(java.net.URL) LineReader(org.jline.reader.LineReader) ParsedLine(org.jline.reader.ParsedLine) List(java.util.List) ArrayList(java.util.ArrayList) PrintWriter(java.io.PrintWriter) PrintStream(java.io.PrintStream) IOException(java.io.IOException) CompletionEnvironment(org.jline.builtins.Completers.CompletionEnvironment) Terminal(org.jline.terminal.Terminal) CommandSession(org.apache.felix.service.command.CommandSession) File(java.io.File)

Aggregations

File (java.io.File)1 IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 InputStreamReader (java.io.InputStreamReader)1 OutputStream (java.io.OutputStream)1 PrintStream (java.io.PrintStream)1 PrintWriter (java.io.PrintWriter)1 Reader (java.io.Reader)1 Annotation (java.lang.annotation.Annotation)1 Field (java.lang.reflect.Field)1 Method (java.lang.reflect.Method)1 URI (java.net.URI)1 URL (java.net.URL)1 URLConnection (java.net.URLConnection)1 CharBuffer (java.nio.CharBuffer)1 Paths (java.nio.file.Paths)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 Iterator (java.util.Iterator)1 List (java.util.List)1