You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by jb...@apache.org on 2016/08/22 09:30:17 UTC

[19/50] [abbrv] karaf git commit: [KARAF-4639] Add job control in the console

[KARAF-4639] Add job control in the console

Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/69c3880a
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/69c3880a
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/69c3880a

Branch: refs/heads/master
Commit: 69c3880ab62e10e6e24fc1fbe9daaa4b5adb4d7f
Parents: ddd7c91
Author: Guillaume Nodet <gn...@apache.org>
Authored: Thu Jul 28 17:38:37 2016 +0200
Committer: Jean-Baptiste Onofr� <jb...@apache.org>
Committed: Mon Aug 22 11:29:20 2016 +0200

----------------------------------------------------------------------
 .../base/src/main/resources/resources/bin/karaf |  6 ++
 .../shell/impl/console/ConsoleSessionImpl.java  | 47 +++++++++++++++-
 .../shell/impl/console/SessionFactoryImpl.java  | 58 ++++++++++++++++++++
 3 files changed, 110 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/69c3880a/assemblies/features/base/src/main/resources/resources/bin/karaf
----------------------------------------------------------------------
diff --git a/assemblies/features/base/src/main/resources/resources/bin/karaf b/assemblies/features/base/src/main/resources/resources/bin/karaf
index 0040859..5a0487a 100755
--- a/assemblies/features/base/src/main/resources/resources/bin/karaf
+++ b/assemblies/features/base/src/main/resources/resources/bin/karaf
@@ -510,8 +510,14 @@ run() {
     done
 }
 
+nothing() {
+   # nothing to do here
+   a=a
+}
+
 main() {
     init
+    trap 'nothing' SIGTSTP
     run "$@"
 }
 

http://git-wip-us.apache.org/repos/asf/karaf/blob/69c3880a/shell/core/src/main/java/org/apache/karaf/shell/impl/console/ConsoleSessionImpl.java
----------------------------------------------------------------------
diff --git a/shell/core/src/main/java/org/apache/karaf/shell/impl/console/ConsoleSessionImpl.java b/shell/core/src/main/java/org/apache/karaf/shell/impl/console/ConsoleSessionImpl.java
index 2a10396..c246530 100644
--- a/shell/core/src/main/java/org/apache/karaf/shell/impl/console/ConsoleSessionImpl.java
+++ b/shell/core/src/main/java/org/apache/karaf/shell/impl/console/ConsoleSessionImpl.java
@@ -29,10 +29,12 @@ import java.nio.file.Paths;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.apache.felix.gogo.api.Job;
+import org.apache.felix.gogo.api.Job.Status;
 import org.apache.felix.service.command.CommandProcessor;
 import org.apache.felix.service.command.CommandSession;
 import org.apache.felix.service.command.Converter;
@@ -260,6 +262,28 @@ public class ConsoleSessionImpl implements Session {
             Properties brandingProps = Branding.loadBrandingProperties(terminal);
             welcome(brandingProps);
             setSessionProperties(brandingProps);
+
+            AtomicBoolean reading = new AtomicBoolean();
+
+            session.setJobListener((job, previous, current) -> {
+                if (previous == Status.Background || current == Status.Background
+                        || previous == Status.Suspended || current == Status.Suspended) {
+                    int width = terminal.getWidth();
+                    String status = current.name().toLowerCase();
+                    jlineTerminal.writer().write(getStatusLine(job, width, status));
+                    jlineTerminal.flush();
+                    if (reading.get()) {
+                        reader.redrawLine();
+                        reader.redisplay();
+                    }
+                }
+            });
+            jlineTerminal.handle(Signal.TSTP, s -> {
+                Job current = session.foregroundJob();
+                if (current != null) {
+                    current.suspend();
+                }
+            });
             jlineTerminal.handle(Signal.INT, s -> {
                 Job current = session.foregroundJob();
                 if (current != null) {
@@ -271,7 +295,13 @@ public class ConsoleSessionImpl implements Session {
             executeScript(scriptFileName);
             while (running) {
                 try {
-                    String command = reader.readLine(getPrompt());
+                    reading.set(true);
+                    String command;
+                    try {
+                        command = reader.readLine(getPrompt());
+                    } finally {
+                        reading.set(false);
+                    }
                     Object result = session.execute(command);
                     if (result != null) {
                         session.getConsole().println(session.format(result, Converter.INSPECT));
@@ -294,6 +324,21 @@ public class ConsoleSessionImpl implements Session {
         }
     }
 
+    private String getStatusLine(Job job, int width, String status) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < width - 1; i++) {
+            sb.append(' ');
+        }
+        sb.append('\r');
+        sb.append("[").append(job.id()).append("]  ");
+        sb.append(status);
+        for (int i = status.length(); i < "background".length(); i++) {
+            sb.append(' ');
+        }
+        sb.append("  ").append(job.command()).append("\n");
+        return sb.toString();
+    }
+
     @Override
     public Object execute(CharSequence commandline) throws Exception {
         String command = CommandLineParser.parse(this, commandline.toString());

http://git-wip-us.apache.org/repos/asf/karaf/blob/69c3880a/shell/core/src/main/java/org/apache/karaf/shell/impl/console/SessionFactoryImpl.java
----------------------------------------------------------------------
diff --git a/shell/core/src/main/java/org/apache/karaf/shell/impl/console/SessionFactoryImpl.java b/shell/core/src/main/java/org/apache/karaf/shell/impl/console/SessionFactoryImpl.java
index c238aa0..77997fa 100644
--- a/shell/core/src/main/java/org/apache/karaf/shell/impl/console/SessionFactoryImpl.java
+++ b/shell/core/src/main/java/org/apache/karaf/shell/impl/console/SessionFactoryImpl.java
@@ -21,12 +21,19 @@ package org.apache.karaf.shell.impl.console;
 import java.io.InputStream;
 import java.io.PrintStream;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.Objects;
+import java.util.function.BiConsumer;
 
+import org.apache.felix.gogo.jline.Builtin;
 import org.apache.felix.gogo.runtime.CommandProcessorImpl;
+import org.apache.felix.service.command.CommandSession;
 import org.apache.felix.service.command.Function;
 import org.apache.felix.service.threadio.ThreadIO;
 import org.apache.karaf.shell.api.console.Command;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Parser;
 import org.apache.karaf.shell.api.console.Registry;
 import org.apache.karaf.shell.api.console.Session;
 import org.apache.karaf.shell.api.console.SessionFactory;
@@ -48,6 +55,9 @@ public class SessionFactoryImpl extends RegistryImpl implements SessionFactory,
         commandProcessor = new CommandProcessorImpl(threadIO);
         register(new ExitCommand());
         new HelpCommand(this);
+        register(new JobCommand("jobs", "List shell jobs", (session, args) -> new Builtin().jobs(session, args)));
+        register(new JobCommand("fg", "Put job in foreground", (session, args) -> new Builtin().fg(session, args)));
+        register(new JobCommand("bg", "Put job in background", (session, args) -> new Builtin().bg(session, args)));
     }
 
     public CommandProcessorImpl getCommandProcessor() {
@@ -137,4 +147,52 @@ public class SessionFactoryImpl extends RegistryImpl implements SessionFactory,
         }
     }
 
+    private class JobCommand implements Command {
+        private final String name;
+        private final String desc;
+        private final BiConsumer<CommandSession, String[]> consumer;
+
+        public JobCommand(String name, String desc, BiConsumer<CommandSession, String[]> consumer) {
+            this.name = name;
+            this.desc = desc;
+            this.consumer = consumer;
+        }
+
+        @Override
+        public String getScope() {
+            return "shell";
+        }
+
+        @Override
+        public String getName() {
+            return name;
+        }
+
+        @Override
+        public String getDescription() {
+            return desc;
+        }
+
+        @Override
+        public Completer getCompleter(boolean scoped) {
+            return null;
+        }
+
+        @Override
+        public Parser getParser() {
+            return null;
+        }
+
+        @Override
+        public Object execute(Session session, List<Object> arguments) throws Exception {
+            CommandSession cmdSession = (CommandSession) session.get(".commandSession");
+            String[] args = new String[arguments.size()];
+            for (int i = 0; i < args.length; i++) {
+                args[i] = Objects.toString(arguments.get(i));
+            }
+            consumer.accept(cmdSession, args);
+            return null;
+        }
+    }
+
 }