You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by gn...@apache.org on 2010/08/26 15:55:36 UTC
svn commit: r989693 - in
/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console:
Main.java jline/Console.java
Author: gnodet
Date: Thu Aug 26 13:55:36 2010
New Revision: 989693
URL: http://svn.apache.org/viewvc?rev=989693&view=rev
Log:
Fixes https://issues.apache.org/jira/browse/KARAF-166
Modified:
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/Main.java
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java
Modified: karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/Main.java
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/Main.java?rev=989693&r1=989692&r2=989693&view=diff
==============================================================================
--- karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/Main.java (original)
+++ karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/Main.java Thu Aug 26 13:55:36 2010
@@ -18,12 +18,7 @@
*/
package org.apache.karaf.shell.console;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.PrintStream;
+import java.io.*;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
@@ -45,6 +40,7 @@ import org.apache.karaf.shell.console.jl
import org.fusesource.jansi.AnsiConsole;
import org.osgi.service.command.CommandSession;
import org.osgi.service.command.Function;
+import org.osgi.service.threadio.ThreadIO;
public class Main {
private String application = System.getProperty("karaf.name", "root");
@@ -55,7 +51,14 @@ public class Main {
main.run(args);
}
+ /**
+ * Use this method when the shell is being executed as a top level shell.
+ *
+ * @param args
+ * @throws Exception
+ */
public void run(String args[]) throws Exception {
+
ThreadIOImpl threadio = new ThreadIOImpl();
threadio.start();
@@ -73,45 +76,58 @@ public class Main {
args = a;
}
- Enumeration<URL> urls = cl.getResources(getDiscoveryResource());
- while (urls.hasMoreElements()) {
- URL url = urls.nextElement();
- BufferedReader r = new BufferedReader(new InputStreamReader(url.openStream()));
- String line = r.readLine();
- while (line != null) {
- line = line.trim();
- if (line.length() > 0 && line.charAt(0) != '#') {
- final Class<Action> actionClass = (Class<Action>) cl.loadClass(line);
- try {
- Command cmd = actionClass.getAnnotation(Command.class);
- Function function = new AbstractCommand() {
- @Override
- protected Action createNewAction() throws Exception {
- return actionClass.newInstance();
- }
- };
- commandProcessor.addCommand(cmd.scope(), function, cmd.name());
- } catch (Exception e) {
- }
- }
- line = r.readLine();
+ discoverCommands(commandProcessor, cl);
+
+ InputStream in = unwrap(System.in);
+ PrintStream out = wrap(unwrap(System.out));
+ PrintStream err = wrap(unwrap(System.err));
+ run(commandProcessor, args, in, out, err);
+
+ // TODO: do we need to stop the threadio that was started?
+ // threadio.stop();
+ }
+
+ /**
+ * Use this method when the shell is being executed as a command
+ * of another shell.
+ *
+ * @param parent
+ * @param args
+ * @throws Exception
+ */
+ public void run(CommandSession parent, String args[]) throws Exception {
+
+ CommandShellImpl commandProcessor = new CommandShellImpl();
+ // TODO: find out what the down side of not using a real ThreadIO implementation is.
+ commandProcessor.setThreadio(new ThreadIO(){
+ public void setStreams(InputStream in, PrintStream out, PrintStream err) {
}
- r.close();
+ public void close() {
+ }
+ });
+ commandProcessor.setConverter(new Support());
+
+ ClassLoader cl = Main.class.getClassLoader();
+ if (args.length > 0 && args[0].startsWith("--classpath=")) {
+ String base = args[0].substring("--classpath=".length());
+ List<URL> urls = getFiles(new File(base));
+ cl = new URLClassLoader(urls.toArray(new URL[urls.size()]), cl);
+ String[] a = new String[args.length - 1];
+ System.arraycopy(args, 1, a, 0, a.length);
+ args = a;
}
+ discoverCommands(commandProcessor, cl);
- TerminalFactory terminalFactory = new TerminalFactory();
+ InputStream in = parent.getKeyboard();
+ PrintStream out = parent.getConsole();
+ PrintStream err = parent.getConsole();
+ run(commandProcessor, args, in, out, err);
+ }
- InputStream in = unwrap(System.in);
- PrintStream out = unwrap(System.out);
- PrintStream err = unwrap(System.err);
+ private void run(final CommandShellImpl commandProcessor, String[] args, final InputStream in, final PrintStream out, final PrintStream err) throws Exception {
+ TerminalFactory terminalFactory = new TerminalFactory();
Terminal terminal = terminalFactory.getTerminal();
- Console console = new Console(commandProcessor,
- in,
- wrap(out),
- wrap(err),
- terminal,
- null,
- null) {
+ Console console = new Console(commandProcessor, in, out, err, terminal, null, null) {
@Override
protected Properties loadBrandingProperties() {
return super.loadBrandingProperties();
@@ -150,6 +166,35 @@ public class Main {
return "META-INF/services/org/apache/karaf/shell/commands";
}
+ private void discoverCommands(CommandShellImpl commandProcessor, ClassLoader cl) throws IOException, ClassNotFoundException {
+ Enumeration<URL> urls = cl.getResources("META-INF/services/org/apache/karaf/shell/commands");
+ while (urls.hasMoreElements()) {
+ URL url = urls.nextElement();
+ BufferedReader r = new BufferedReader(new InputStreamReader(url.openStream()));
+ String line = r.readLine();
+ while (line != null) {
+ line = line.trim();
+ if (line.length() > 0 && line.charAt(0) != '#') {
+ final Class<Action> actionClass = (Class<Action>) cl.loadClass(line);
+ try {
+ Command cmd = actionClass.getAnnotation(Command.class);
+ Function function = new AbstractCommand() {
+ @Override
+ protected Action createNewAction() throws Exception {
+ return actionClass.newInstance();
+ }
+ };
+ commandProcessor.addCommand(cmd.scope(), function, cmd.name());
+ } catch (Exception e) {
+ }
+ }
+ line = r.readLine();
+ }
+ r.close();
+ }
+ }
+
+
public String getApplication() {
return application;
}
Modified: karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java?rev=989693&r1=989692&r2=989693&view=diff
==============================================================================
--- karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java (original)
+++ karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java Thu Aug 26 13:55:36 2010
@@ -67,7 +67,7 @@ public class Console implements Runnable
private BlockingQueue<Integer> queue;
private boolean interrupt;
private Thread pipe;
- private boolean running;
+ volatile private boolean running;
private Runnable closeCallback;
private Terminal terminal;
private InputStream consoleInput;
@@ -131,7 +131,6 @@ public class Console implements Runnable
//System.err.println("Closing");
running = false;
pipe.interrupt();
- Thread.interrupted();
}
public void run()
@@ -211,6 +210,7 @@ public class Console implements Runnable
}
}
}
+ close();
//System.err.println("Exiting console...");
if (closeCallback != null)
{