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;
+ }
+ }
+
}