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


Reply via email to