Search in sources :

Example 6 with LineReader

use of org.jline.reader.LineReader 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)

Example 7 with LineReader

use of org.jline.reader.LineReader in project SpongeVanilla by SpongePowered.

the class MixinConsoleHandler method onRun.

@Inject(method = "run", at = @At("HEAD"), cancellable = true, remap = false)
private void onRun(CallbackInfo ci) {
    final Terminal terminal = TerminalConsoleAppender.getTerminal();
    if (terminal != null) {
        LineReader reader = LineReaderBuilder.builder().appName("SpongeVanilla").terminal(terminal).completer(new ConsoleCommandCompleter(this.server)).build();
        reader.unsetOpt(LineReader.Option.INSERT_TAB);
        TerminalConsoleAppender.setReader(reader);
        try {
            String line;
            while (!this.server.isServerStopped() && this.server.isServerRunning()) {
                try {
                    line = reader.readLine("> ");
                } catch (EndOfFileException e) {
                    // Continue reading after EOT
                    continue;
                }
                if (line == null) {
                    break;
                }
                line = line.trim();
                if (!line.isEmpty()) {
                    this.server.addPendingCommand(line, this.server);
                }
            }
        } catch (UserInterruptException e) {
            this.server.initiateShutdown();
        } finally {
            TerminalConsoleAppender.setReader(null);
        }
        ci.cancel();
    }
}
Also used : ConsoleCommandCompleter(org.spongepowered.server.console.ConsoleCommandCompleter) EndOfFileException(org.jline.reader.EndOfFileException) LineReader(org.jline.reader.LineReader) UserInterruptException(org.jline.reader.UserInterruptException) Terminal(org.jline.terminal.Terminal) Inject(org.spongepowered.asm.mixin.injection.Inject)

Example 8 with LineReader

use of org.jline.reader.LineReader in project LanternServer by LanternPowered.

the class ConsoleManager method start.

public void start() {
    final Terminal terminal = TerminalConsoleAppender.getTerminal();
    if (terminal != null) {
        final LineReader reader = LineReaderBuilder.builder().appName(this.pluginContainer.getName()).terminal(terminal).completer(new ConsoleCommandCompleter()).build();
        reader.unsetOpt(Option.INSERT_TAB);
        reader.setVariable(LineReader.HISTORY_FILE, this.consoleHistoryFile);
        TerminalConsoleAppender.setReader(reader);
    }
    active = true;
    final Thread thread = new Thread(this::readCommandTask, "console");
    thread.setDaemon(true);
    thread.start();
    this.scheduler.createAsyncExecutor(this.pluginContainer).scheduleAtFixedRate(this::saveHistory, 120, 120, TimeUnit.SECONDS);
}
Also used : LineReader(org.jline.reader.LineReader) Terminal(org.jline.terminal.Terminal)

Example 9 with LineReader

use of org.jline.reader.LineReader in project LanternServer by LanternPowered.

the class ConsoleManager method readCommandTask.

/**
 * This task handles the commands that are executed through the console.
 */
private void readCommandTask() {
    final LineReader lineReader = TerminalConsoleAppender.getReader();
    final Supplier<String> consoleReader;
    if (lineReader != null) {
        consoleReader = () -> {
            try {
                return lineReader.readLine("> ");
            } catch (EndOfFileException e) {
                return null;
            }
        };
    } else {
        this.logger.info("Falling back to non jline console.");
        final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        consoleReader = () -> {
            try {
                return reader.readLine();
            } catch (IOException e) {
                return null;
            }
        };
    }
    final SpongeExecutorService executor = this.scheduler.createSyncExecutor(this.pluginContainer);
    try {
        String command;
        while (active) {
            command = consoleReader.get();
            if (command != null) {
                command = command.trim();
                if (!command.isEmpty()) {
                    final String runCommand = command.startsWith("/") ? command.substring(1) : command;
                    executor.execute(() -> this.commandManager.process(LanternConsoleSource.INSTANCE, runCommand));
                }
            }
        }
    } catch (UserInterruptException e) {
        // Already set the reader to null, to avoid printing a new line
        TerminalConsoleAppender.setReader(null);
        // When a user interrupts the console, for example Ctrl-C
        // Shutdown the server
        executor.execute(() -> Lantern.getServer().shutdown());
    }
}
Also used : EndOfFileException(org.jline.reader.EndOfFileException) InputStreamReader(java.io.InputStreamReader) LineReader(org.jline.reader.LineReader) BufferedReader(java.io.BufferedReader) IOException(java.io.IOException) SpongeExecutorService(org.spongepowered.api.scheduler.SpongeExecutorService) UserInterruptException(org.jline.reader.UserInterruptException)

Aggregations

LineReader (org.jline.reader.LineReader)9 Terminal (org.jline.terminal.Terminal)7 EndOfFileException (org.jline.reader.EndOfFileException)5 UserInterruptException (org.jline.reader.UserInterruptException)5 IOException (java.io.IOException)3 ArrayList (java.util.ArrayList)3 ParsedLine (org.jline.reader.ParsedLine)3 InputStreamReader (java.io.InputStreamReader)2 PrintStream (java.io.PrintStream)2 Path (java.nio.file.Path)2 Candidate (org.jline.reader.Candidate)2 BufferedReader (java.io.BufferedReader)1 File (java.io.File)1 InputStream (java.io.InputStream)1 OutputStream (java.io.OutputStream)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