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