You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by cs...@apache.org on 2012/07/04 17:08:27 UTC
svn commit: r1357297 - in /karaf/trunk:
shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/
shell/console/src/main/java/org/apache/karaf/shell/util/ shell/ssh/
shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ util/src/main/java/or...
Author: cschneider
Date: Wed Jul 4 15:08:26 2012
New Revision: 1357297
URL: http://svn.apache.org/viewvc?rev=1357297&view=rev
Log:
KARAF-1506 avoid duplication of exception logging and stream closing
Added:
karaf/trunk/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellCommand.java
karaf/trunk/util/src/main/java/org/apache/karaf/util/StreamUtils.java
Modified:
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleImpl.java
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/util/ShellUtil.java
karaf/trunk/shell/ssh/pom.xml
karaf/trunk/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellCommandFactory.java
Modified: karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleImpl.java
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleImpl.java?rev=1357297&r1=1357296&r2=1357297&view=diff
==============================================================================
--- karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleImpl.java (original)
+++ karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleImpl.java Wed Jul 4 15:08:26 2012
@@ -38,19 +38,17 @@ import jline.Terminal;
import jline.UnsupportedTerminal;
import jline.console.ConsoleReader;
import jline.console.history.PersistentHistory;
-import org.apache.felix.gogo.runtime.CommandNotFoundException;
import org.apache.felix.gogo.runtime.Parser;
import org.apache.felix.service.command.CommandProcessor;
import org.apache.felix.service.command.CommandSession;
import org.apache.felix.service.command.Converter;
-import org.apache.karaf.shell.commands.CommandException;
import org.apache.karaf.shell.console.CloseShellException;
import org.apache.karaf.shell.console.CommandSessionHolder;
import org.apache.karaf.shell.console.Completer;
import org.apache.karaf.shell.console.Console;
import org.apache.karaf.shell.console.SessionProperties;
import org.apache.karaf.shell.console.completer.CommandsCompleter;
-import org.fusesource.jansi.Ansi;
+import org.apache.karaf.shell.util.ShellUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -183,7 +181,7 @@ public class ConsoleImpl implements Cons
}
catch (Throwable t)
{
- logException(t);
+ ShellUtil.logException(session, t);
}
}
close();
@@ -194,42 +192,6 @@ public class ConsoleImpl implements Cons
}
}
- private void logException(Throwable t) {
- try {
- if (t instanceof CommandNotFoundException) {
- LOGGER.debug("Unknown command entered", t);
- } else {
- LOGGER.info("Exception caught while executing command", t);
- }
- session.put(SessionProperties.LAST_EXCEPTION, t);
- if (t instanceof CommandException) {
- session.getConsole().println(((CommandException) t).getNiceHelp());
- } else if (t instanceof CommandNotFoundException) {
- String str = Ansi.ansi()
- .fg(Ansi.Color.RED)
- .a("Command not found: ")
- .a(Ansi.Attribute.INTENSITY_BOLD)
- .a(((CommandNotFoundException) t).getCommand())
- .a(Ansi.Attribute.INTENSITY_BOLD_OFF)
- .fg(Ansi.Color.DEFAULT).toString();
- session.getConsole().println(str);
- }
- if ( getBoolean(SessionProperties.PRINT_STACK_TRACES)) {
- session.getConsole().print(Ansi.ansi().fg(Ansi.Color.RED).toString());
- t.printStackTrace(session.getConsole());
- session.getConsole().print(Ansi.ansi().fg(Ansi.Color.DEFAULT).toString());
- }
- else if (!(t instanceof CommandException) && !(t instanceof CommandNotFoundException)) {
- session.getConsole().print(Ansi.ansi().fg(Ansi.Color.RED).toString());
- session.getConsole().println("Error executing command: "
- + (t.getMessage() != null ? t.getMessage() : t.getClass().getName()));
- session.getConsole().print(Ansi.ansi().fg(Ansi.Color.DEFAULT).toString());
- }
- } catch (Exception ignore) {
- // ignore
- }
- }
-
private String readAndParseCommand() throws IOException {
String command = null;
boolean loop = true;
@@ -290,20 +252,6 @@ public class ConsoleImpl implements Cons
}
}
- protected boolean getBoolean(String name) {
- Object s = session.get(name);
- if (s == null) {
- s = System.getProperty(name);
- }
- if (s == null) {
- return false;
- }
- if (s instanceof Boolean) {
- return (Boolean) s;
- }
- return Boolean.parseBoolean(s.toString());
- }
-
protected void welcome() {
Properties props = Branding.loadBrandingProperties();
String welcome = props.getProperty("welcome");
@@ -455,12 +403,12 @@ public class ConsoleImpl implements Cons
{
return;
}
- else if (c == 4 && !getBoolean(SessionProperties.IGNORE_INTERRUPTS))
+ else if (c == 4 && !ShellUtil.getBoolean(session, SessionProperties.IGNORE_INTERRUPTS))
{
err.println("^D");
return;
}
- else if (c == 3 && !getBoolean(SessionProperties.IGNORE_INTERRUPTS))
+ else if (c == 3 && !ShellUtil.getBoolean(session, SessionProperties.IGNORE_INTERRUPTS))
{
err.println("^C");
reader.getCursorBuffer().clear();
Modified: karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/util/ShellUtil.java
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/util/ShellUtil.java?rev=1357297&r1=1357296&r2=1357297&view=diff
==============================================================================
--- karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/util/ShellUtil.java (original)
+++ karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/util/ShellUtil.java Wed Jul 4 15:08:26 2012
@@ -27,7 +27,11 @@ import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
+import org.apache.felix.gogo.runtime.CommandNotFoundException;
import org.apache.felix.service.command.CommandSession;
+import org.apache.karaf.shell.commands.CommandException;
+import org.apache.karaf.shell.console.SessionProperties;
+import org.fusesource.jansi.Ansi;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
@@ -213,4 +217,54 @@ public class ShellUtil {
}
}
+ public static boolean getBoolean(CommandSession session, String name) {
+ Object s = session.get(name);
+ if (s == null) {
+ s = System.getProperty(name);
+ }
+ if (s == null) {
+ return false;
+ }
+ if (s instanceof Boolean) {
+ return (Boolean) s;
+ }
+ return Boolean.parseBoolean(s.toString());
+ }
+
+ public static void logException(CommandSession session, Throwable t) {
+ try {
+ if (t instanceof CommandNotFoundException) {
+ LOGGER.debug("Unknown command entered", t);
+ } else {
+ LOGGER.info("Exception caught while executing command", t);
+ }
+ session.put(SessionProperties.LAST_EXCEPTION, t);
+ if (t instanceof CommandException) {
+ session.getConsole().println(((CommandException) t).getNiceHelp());
+ } else if (t instanceof CommandNotFoundException) {
+ String str = Ansi.ansi()
+ .fg(Ansi.Color.RED)
+ .a("Command not found: ")
+ .a(Ansi.Attribute.INTENSITY_BOLD)
+ .a(((CommandNotFoundException) t).getCommand())
+ .a(Ansi.Attribute.INTENSITY_BOLD_OFF)
+ .fg(Ansi.Color.DEFAULT).toString();
+ session.getConsole().println(str);
+ }
+ if ( getBoolean(session, SessionProperties.PRINT_STACK_TRACES)) {
+ session.getConsole().print(Ansi.ansi().fg(Ansi.Color.RED).toString());
+ t.printStackTrace(session.getConsole());
+ session.getConsole().print(Ansi.ansi().fg(Ansi.Color.DEFAULT).toString());
+ }
+ else if (!(t instanceof CommandException) && !(t instanceof CommandNotFoundException)) {
+ session.getConsole().print(Ansi.ansi().fg(Ansi.Color.RED).toString());
+ session.getConsole().println("Error executing command: "
+ + (t.getMessage() != null ? t.getMessage() : t.getClass().getName()));
+ session.getConsole().print(Ansi.ansi().fg(Ansi.Color.DEFAULT).toString());
+ }
+ } catch (Exception ignore) {
+ // ignore
+ }
+ }
+
}
Modified: karaf/trunk/shell/ssh/pom.xml
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/ssh/pom.xml?rev=1357297&r1=1357296&r2=1357297&view=diff
==============================================================================
--- karaf/trunk/shell/ssh/pom.xml (original)
+++ karaf/trunk/shell/ssh/pom.xml Wed Jul 4 15:08:26 2012
@@ -71,6 +71,11 @@
<groupId>org.apache.sshd</groupId>
<artifactId>sshd-core</artifactId>
</dependency>
+
+ <dependency>
+ <groupId>org.apache.karaf</groupId>
+ <artifactId>org.apache.karaf.util</artifactId>
+ </dependency>
</dependencies>
<build>
@@ -106,6 +111,9 @@
org.apache.sshd.server.jaas,
*
</Import-Package>
+ <Private-Package>
+ org.apache.karaf.util
+ </Private-Package>
</instructions>
</configuration>
</plugin>
Added: karaf/trunk/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellCommand.java
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellCommand.java?rev=1357297&view=auto
==============================================================================
--- karaf/trunk/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellCommand.java (added)
+++ karaf/trunk/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellCommand.java Wed Jul 4 15:08:26 2012
@@ -0,0 +1,101 @@
+package org.apache.karaf.shell.ssh;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.Map;
+
+import javax.security.auth.Subject;
+
+import org.apache.felix.service.command.CommandProcessor;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.felix.service.command.Converter;
+import org.apache.karaf.shell.util.ShellUtil;
+import org.apache.karaf.util.StreamUtils;
+import org.apache.sshd.server.Command;
+import org.apache.sshd.server.Environment;
+import org.apache.sshd.server.ExitCallback;
+import org.apache.sshd.server.SessionAware;
+import org.apache.sshd.server.session.ServerSession;
+
+public class ShellCommand implements Command, SessionAware {
+
+ private String command;
+ private InputStream in;
+ private OutputStream out;
+ private OutputStream err;
+ private ExitCallback callback;
+ private ServerSession session;
+ private CommandProcessor commandProcessor;
+
+ public ShellCommand(CommandProcessor commandProcessor, String command) {
+ this.commandProcessor = commandProcessor;
+ this.command = command;
+ }
+
+ public void setInputStream(InputStream in) {
+ this.in = in;
+ }
+
+ public void setOutputStream(OutputStream out) {
+ this.out = out;
+ }
+
+ public void setErrorStream(OutputStream err) {
+ this.err = err;
+ }
+
+ public void setExitCallback(ExitCallback callback) {
+ this.callback = callback;
+ }
+
+ public void setSession(ServerSession session) {
+ this.session = session;
+ }
+
+ public void start(final Environment env) throws IOException {
+ try {
+ final CommandSession session = commandProcessor.createSession(in, new PrintStream(out), new PrintStream(err));
+ session.put("SCOPE", "shell:osgi:*");
+ session.put("APPLICATION", System.getProperty("karaf.name", "root"));
+ for (Map.Entry<String,String> e : env.getEnv().entrySet()) {
+ session.put(e.getKey(), e.getValue());
+ }
+ try {
+ Subject subject = this.session != null ? this.session.getAttribute(KarafJaasAuthenticator.SUBJECT_ATTRIBUTE_KEY) : null;
+ Object result;
+ if (subject != null) {
+ try {
+ result = Subject.doAs(subject, new PrivilegedExceptionAction<Object>() {
+ public Object run() throws Exception {
+ return session.execute(command);
+ }
+ });
+ } catch (PrivilegedActionException e) {
+ throw e.getException();
+ }
+ } else {
+ result = session.execute(command);
+ }
+ if (result != null)
+ {
+ session.getConsole().println(session.format(result, Converter.INSPECT));
+ }
+ } catch (Throwable t) {
+ ShellUtil.logException(session, t);
+ }
+ } catch (Exception e) {
+ throw (IOException) new IOException("Unable to start shell").initCause(e);
+ } finally {
+ StreamUtils.close(in, out, err);
+ callback.onExit(0);
+ }
+ }
+
+ public void destroy() {
+ }
+
+}
\ No newline at end of file
Modified: karaf/trunk/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellCommandFactory.java
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellCommandFactory.java?rev=1357297&r1=1357296&r2=1357297&view=diff
==============================================================================
--- karaf/trunk/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellCommandFactory.java (original)
+++ karaf/trunk/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellCommandFactory.java Wed Jul 4 15:08:26 2012
@@ -18,36 +18,12 @@
*/
package org.apache.karaf.shell.ssh;
-import java.io.Closeable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-import java.util.Map;
-import javax.security.auth.Subject;
-
-import org.apache.karaf.shell.commands.CommandException;
-import org.apache.felix.gogo.runtime.CommandNotFoundException;
import org.apache.felix.service.command.CommandProcessor;
-import org.apache.felix.service.command.CommandSession;
-import org.apache.felix.service.command.Converter;
-import org.apache.karaf.shell.console.impl.jline.ConsoleImpl;
import org.apache.sshd.server.Command;
import org.apache.sshd.server.CommandFactory;
-import org.apache.sshd.server.Environment;
-import org.apache.sshd.server.ExitCallback;
-import org.apache.sshd.server.SessionAware;
-import org.apache.sshd.server.session.ServerSession;
-import org.fusesource.jansi.Ansi;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
public class ShellCommandFactory implements CommandFactory {
- private static final Logger LOGGER = LoggerFactory.getLogger(ShellCommandFactory.class);
-
private CommandProcessor commandProcessor;
public void setCommandProcessor(CommandProcessor commandProcessor) {
@@ -55,140 +31,7 @@ public class ShellCommandFactory impleme
}
public Command createCommand(String command) {
- return new ShellCommand(command);
+ return new ShellCommand(commandProcessor, command);
}
- public class ShellCommand implements Command, SessionAware {
-
- private String command;
- private InputStream in;
- private OutputStream out;
- private OutputStream err;
- private ExitCallback callback;
- private ServerSession session;
-
- public ShellCommand(String command) {
- this.command = command;
- }
-
- public void setInputStream(InputStream in) {
- this.in = in;
- }
-
- public void setOutputStream(OutputStream out) {
- this.out = out;
- }
-
- public void setErrorStream(OutputStream err) {
- this.err = err;
- }
-
- public void setExitCallback(ExitCallback callback) {
- this.callback = callback;
- }
-
- public void setSession(ServerSession session) {
- this.session = session;
- }
-
- public void start(final Environment env) throws IOException {
- try {
- final CommandSession session = commandProcessor.createSession(in, new PrintStream(out), new PrintStream(err));
- session.put("SCOPE", "shell:osgi:*");
- session.put("APPLICATION", System.getProperty("karaf.name", "root"));
- for (Map.Entry<String,String> e : env.getEnv().entrySet()) {
- session.put(e.getKey(), e.getValue());
- }
- try {
- Subject subject = this.session != null ? this.session.getAttribute(KarafJaasAuthenticator.SUBJECT_ATTRIBUTE_KEY) : null;
- Object result;
- if (subject != null) {
- try {
- result = Subject.doAs(subject, new PrivilegedExceptionAction<Object>() {
- public Object run() throws Exception {
- return session.execute(command);
- }
- });
- } catch (PrivilegedActionException e) {
- throw e.getException();
- }
- } else {
- result = session.execute(command);
- }
- if (result != null)
- {
- session.getConsole().println(session.format(result, Converter.INSPECT));
- }
- } catch (Throwable t) {
- try {
- if (t instanceof CommandNotFoundException) {
- LOGGER.debug("Unknown command entered", t);
- } else {
- LOGGER.info("Exception caught while executing command", t);
- }
- session.put(ConsoleImpl.LAST_EXCEPTION, t);
- if (t instanceof CommandException) {
- session.getConsole().println(((CommandException) t).getNiceHelp());
- } else if (t instanceof CommandNotFoundException) {
- String str = Ansi.ansi()
- .fg(Ansi.Color.RED)
- .a("Command not found: ")
- .a(Ansi.Attribute.INTENSITY_BOLD)
- .a(((CommandNotFoundException) t).getCommand())
- .a(Ansi.Attribute.INTENSITY_BOLD_OFF)
- .fg(Ansi.Color.DEFAULT).toString();
- session.getConsole().println(str);
- }
- if ( getBoolean(session, ConsoleImpl.PRINT_STACK_TRACES)) {
- session.getConsole().print(Ansi.ansi().fg(Ansi.Color.RED).toString());
- t.printStackTrace(session.getConsole());
- session.getConsole().print(Ansi.ansi().fg(Ansi.Color.DEFAULT).toString());
- }
- else if (!(t instanceof CommandException) && !(t instanceof CommandNotFoundException)) {
- session.getConsole().print(Ansi.ansi().fg(Ansi.Color.RED).toString());
- session.getConsole().println("Error executing command: "
- + (t.getMessage() != null ? t.getMessage() : t.getClass().getName()));
- session.getConsole().print(Ansi.ansi().fg(Ansi.Color.DEFAULT).toString());
- }
- session.getConsole().flush();
- } catch (Exception ignore) {
- // ignore
- }
- }
- } catch (Exception e) {
- throw (IOException) new IOException("Unable to start shell").initCause(e);
- } finally {
- close(in, out, err);
- callback.onExit(0);
- }
- }
-
- public void destroy() {
- }
-
- protected boolean getBoolean(CommandSession session, String name) {
- Object s = session.get(name);
- if (s == null) {
- s = System.getProperty(name);
- }
- if (s == null) {
- return false;
- }
- if (s instanceof Boolean) {
- return (Boolean) s;
- }
- return Boolean.parseBoolean(s.toString());
- }
-
- }
-
- private static void close(Closeable... closeables) {
- for (Closeable c : closeables) {
- try {
- c.close();
- } catch (IOException e) {
- // Ignore
- }
- }
- }
}
Added: karaf/trunk/util/src/main/java/org/apache/karaf/util/StreamUtils.java
URL: http://svn.apache.org/viewvc/karaf/trunk/util/src/main/java/org/apache/karaf/util/StreamUtils.java?rev=1357297&view=auto
==============================================================================
--- karaf/trunk/util/src/main/java/org/apache/karaf/util/StreamUtils.java (added)
+++ karaf/trunk/util/src/main/java/org/apache/karaf/util/StreamUtils.java Wed Jul 4 15:08:26 2012
@@ -0,0 +1,21 @@
+package org.apache.karaf.util;
+
+import java.io.Closeable;
+import java.io.IOException;
+
+public class StreamUtils {
+
+ private StreamUtils() {
+ }
+
+
+ public static void close(Closeable... closeables) {
+ for (Closeable c : closeables) {
+ try {
+ c.close();
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+ }
+}