Repository: karaf
Updated Branches:
  refs/heads/master f03731719 -> dffc30f75


KARAF-2772 Move ConsoleFactory to separate package, simplify interface


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/c724c426
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/c724c426
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/c724c426

Branch: refs/heads/master
Commit: c724c4263a62c0bbf0a96b13782e6336e15ce5e4
Parents: 79cf409
Author: Christian Schneider <[email protected]>
Authored: Fri Feb 21 21:10:00 2014 +0100
Committer: Christian Schneider <[email protected]>
Committed: Fri Feb 21 21:10:00 2014 +0100

----------------------------------------------------------------------
 shell/console/pom.xml                           |  1 +
 .../karaf/shell/console/ConsoleFactory.java     | 35 --------
 .../shell/console/factory/ConsoleFactory.java   | 30 +++++++
 .../impl/jline/ConsoleFactoryService.java       | 63 +++-----------
 .../console/impl/jline/DelayedStarted.java      |  8 +-
 .../console/impl/jline/LocalConsoleManager.java | 86 +++++++++++---------
 .../impl/SecuredCommandProcessorImpl.java       |  5 +-
 .../org/apache/karaf/shell/util/ShellUtil.java  | 15 ++++
 .../OSGI-INF/blueprint/karaf-console.xml        |  6 +-
 .../karaf/shell/ssh/ShellFactoryImpl.java       | 23 +++---
 .../resources/OSGI-INF/blueprint/shell-ssh.xml  | 14 +---
 .../karaf/webconsole/gogo/GogoPlugin.java       | 35 ++++----
 .../OSGI-INF/blueprint/webconsole-gogo.xml      |  6 +-
 13 files changed, 148 insertions(+), 179 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/shell/console/pom.xml
----------------------------------------------------------------------
diff --git a/shell/console/pom.xml b/shell/console/pom.xml
index f7bd2f5..7b6b65d 100644
--- a/shell/console/pom.xml
+++ b/shell/console/pom.xml
@@ -155,6 +155,7 @@
                             
org.apache.karaf.shell.console.commands;version=2.3.0,
                                
org.apache.karaf.shell.console.completer;version=${project.version},
                             
org.apache.karaf.shell.console.completer;version=2.3.0,
+                            
org.apache.karaf.shell.console.factory;version=${project.version},
                             
org.apache.karaf.shell.inject;version=${project.version},
                                
org.apache.karaf.shell.util;version=${project.version},
                             org.apache.karaf.shell.util;version=2.3.0,

http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/shell/console/src/main/java/org/apache/karaf/shell/console/ConsoleFactory.java
----------------------------------------------------------------------
diff --git 
a/shell/console/src/main/java/org/apache/karaf/shell/console/ConsoleFactory.java
 
b/shell/console/src/main/java/org/apache/karaf/shell/console/ConsoleFactory.java
deleted file mode 100644
index f3ac066..0000000
--- 
a/shell/console/src/main/java/org/apache/karaf/shell/console/ConsoleFactory.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.shell.console;
-
-import java.io.InputStream;
-import java.io.PrintStream;
-
-import javax.security.auth.Subject;
-
-import jline.Terminal;
-
-import org.apache.felix.service.command.CommandProcessor;
-import org.apache.felix.service.threadio.ThreadIO;
-
-public interface ConsoleFactory {
-    Console create(CommandProcessor processor, ThreadIO threadIO, InputStream 
in, PrintStream out, PrintStream err, final Terminal term, String encoding, 
Runnable closeCallback);
-    Console createLocal(CommandProcessor processor, ThreadIO threadIO, 
Terminal terminal, String encoding, Runnable closeCallback);
-    void startConsoleAs(Console console, Subject subject, String threadName);
-}

http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/shell/console/src/main/java/org/apache/karaf/shell/console/factory/ConsoleFactory.java
----------------------------------------------------------------------
diff --git 
a/shell/console/src/main/java/org/apache/karaf/shell/console/factory/ConsoleFactory.java
 
b/shell/console/src/main/java/org/apache/karaf/shell/console/factory/ConsoleFactory.java
new file mode 100644
index 0000000..cf16648
--- /dev/null
+++ 
b/shell/console/src/main/java/org/apache/karaf/shell/console/factory/ConsoleFactory.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.karaf.shell.console.factory;
+
+import java.io.InputStream;
+import java.io.PrintStream;
+
+import jline.Terminal;
+
+import org.apache.karaf.shell.console.Console;
+
+public interface ConsoleFactory {
+    Console create(InputStream in, PrintStream out, PrintStream err, final 
Terminal term, String encoding, Runnable closeCallback);
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleFactoryService.java
----------------------------------------------------------------------
diff --git 
a/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleFactoryService.java
 
b/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleFactoryService.java
index 93a0b95..2bb853a 100644
--- 
a/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleFactoryService.java
+++ 
b/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleFactoryService.java
@@ -21,23 +21,20 @@ package org.apache.karaf.shell.console.impl.jline;
 import java.io.InputStream;
 import java.io.PrintStream;
 import java.lang.management.ManagementFactory;
-import java.security.PrivilegedAction;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Properties;
 
-import javax.security.auth.Subject;
-
 import jline.Terminal;
 
 import org.apache.felix.service.command.CommandProcessor;
 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.jaas.boot.principal.UserPrincipal;
 import org.apache.karaf.jaas.modules.JaasHelper;
 import org.apache.karaf.shell.console.Console;
-import org.apache.karaf.shell.console.ConsoleFactory;
+import org.apache.karaf.shell.console.factory.ConsoleFactory;
+import org.apache.karaf.shell.util.ShellUtil;
 import org.osgi.framework.BundleContext;
 
 public class ConsoleFactoryService implements ConsoleFactory {
@@ -50,27 +47,23 @@ public class ConsoleFactoryService implements 
ConsoleFactory {
 
     private final BundleContext bundleContext;
 
-    public ConsoleFactoryService(BundleContext bc) {
+    private CommandProcessor processor;
+
+    private ThreadIO threadIO;
+
+    public ConsoleFactoryService(BundleContext bc, CommandProcessor processor, 
ThreadIO threadIO) {
         bundleContext = bc;
+        this.processor = processor;
+        this.threadIO = threadIO;
     }
     
     @Override
-    public Console createLocal(CommandProcessor processor, ThreadIO threadIO, 
final Terminal terminal, String encoding, Runnable closeCallback) {
-        return create(processor,
-                threadIO,
-                StreamWrapUtil.reWrapIn(terminal, System.in), 
-                StreamWrapUtil.reWrap(System.out), 
-                StreamWrapUtil.reWrap(System.err), 
-                terminal,
-                encoding,
-                closeCallback);
-    }
-
-    @Override
-    public Console create(CommandProcessor processor, ThreadIO threadIO, 
InputStream in, PrintStream out, PrintStream err, final Terminal terminal,
+    public Console create(InputStream in, PrintStream out, PrintStream err, 
final Terminal terminal,
             String encoding, Runnable closeCallback) {
         ConsoleImpl console = new ConsoleImpl(processor, threadIO, in, out, 
err, terminal, encoding, closeCallback, bundleContext);
         CommandSession session = console.getSession();
+        
+        session.put("USER", ShellUtil.getCurrentUserName());
         session.put("APPLICATION", System.getProperty("karaf.name", "root"));
         session.put("#LINES", new Function() {
             public Object execute(CommandSession session, List<Object> 
arguments) throws Exception {
@@ -102,37 +95,5 @@ public class ConsoleFactoryService implements 
ConsoleFactory {
             session.put(key, System.getProperty(key));
         }
     }
-    
-    @Override
-    public void startConsoleAs(final Console console, final Subject subject, 
String consoleType) {
-        final String userName = getUserName(subject);
-        new Thread(console, "Karaf Console " + consoleType + " user " + 
userName) {
-            @Override
-            public void run() {
-                if (subject != null) {
-                    CommandSession session = console.getSession();
-                    session.put("USER", userName);
-                    JaasHelper.doAs(subject, new PrivilegedAction<Object>() {
-                        public Object run() {
-                            doRun();
-                            return null;
-                        }
-                    });
-                } else {
-                    doRun();
-                }
-            }
-            protected void doRun() {
-                super.run();
-            }
-        }.start();
-    }
 
-    private String getUserName(final Subject subject) {
-        if (subject != null && subject.getPrincipals().iterator().hasNext()) {
-            return 
subject.getPrincipals(UserPrincipal.class).iterator().next().getName();
-        } else {
-            return null;
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/DelayedStarted.java
----------------------------------------------------------------------
diff --git 
a/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/DelayedStarted.java
 
b/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/DelayedStarted.java
index a874fb1..87fb284 100644
--- 
a/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/DelayedStarted.java
+++ 
b/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/DelayedStarted.java
@@ -36,10 +36,10 @@ class DelayedStarted extends Thread implements 
FrameworkListener {
        private final Runnable console;
        private final BundleContext bundleContext;
 
-    DelayedStarted(Runnable console, BundleContext bundleContext, InputStream 
in) {
-        super("Karaf Shell Console Thread");
-               this.console = console;
-               this.bundleContext = bundleContext;
+    DelayedStarted(Runnable console, String name, BundleContext bundleContext, 
InputStream in) {
+        super(name);
+        this.console = console;
+        this.bundleContext = bundleContext;
         this.in = in;
         int defaultStartLevel = 
Integer.parseInt(System.getProperty(Constants.FRAMEWORK_BEGINNING_STARTLEVEL));
         int startLevel = 
bundleContext.getBundle(0).adapt(FrameworkStartLevel.class).getStartLevel();

http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java
----------------------------------------------------------------------
diff --git 
a/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java
 
b/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java
index 9ea2f96..906a9ad 100644
--- 
a/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java
+++ 
b/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java
@@ -19,50 +19,42 @@
 package org.apache.karaf.shell.console.impl.jline;
 
 import java.nio.charset.Charset;
+import java.security.PrivilegedAction;
 
 import javax.security.auth.Subject;
 
 import jline.Terminal;
-import org.apache.felix.service.command.CommandProcessor;
+
 import org.apache.felix.service.command.CommandSession;
-import org.apache.felix.service.threadio.ThreadIO;
 import org.apache.karaf.jaas.boot.principal.RolePrincipal;
 import org.apache.karaf.jaas.boot.principal.UserPrincipal;
+import org.apache.karaf.jaas.modules.JaasHelper;
 import org.apache.karaf.shell.console.Console;
-import org.apache.karaf.shell.console.ConsoleFactory;
+import org.apache.karaf.shell.console.factory.ConsoleFactory;
+import org.apache.karaf.shell.util.ShellUtil;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class LocalConsoleManager {
 
-    private static final Logger LOGGER = 
LoggerFactory.getLogger(LocalConsoleManager.class);
-
     private ConsoleFactory consoleFactory;
     private BundleContext bundleContext;
     private TerminalFactory terminalFactory;
     private Console console;
     private boolean start;
     private final int defaultStartLevel;
-    private CommandProcessor commandProcessor;
-    private ThreadIO threadIO;
-    private ServiceRegistration registration;
+    private ServiceRegistration<?> registration;
 
     public LocalConsoleManager(boolean start, 
             String defaultStartLevel,
             BundleContext bundleContext, 
             TerminalFactory terminalFactory, 
-            ConsoleFactory consoleFactory,
-            CommandProcessor commandProcessor,
-            ThreadIO threadIO) throws Exception {
+            ConsoleFactory consoleFactory) throws Exception {
         this.start = start;
         this.defaultStartLevel = Integer.parseInt(defaultStartLevel);
         this.bundleContext = bundleContext;
         this.terminalFactory = terminalFactory;
         this.consoleFactory = consoleFactory;
-        this.commandProcessor = commandProcessor;
-        this.threadIO = threadIO;
         start();
     }
 
@@ -70,18 +62,10 @@ public class LocalConsoleManager {
         if (!start) {
             return;
         }
-        final Subject subject = new Subject();
-        subject.getPrincipals().add(new UserPrincipal("karaf"));
-
-        String roles = System.getProperty("karaf.local.roles");
-        if (roles != null) {
-            for (String role : roles.split("[,]")) {
-                subject.getPrincipals().add(new RolePrincipal(role.trim()));
-            }
-        }
+        
 
         final Terminal terminal = terminalFactory.getTerminal();
-        Runnable callback = new Runnable() {
+        final Runnable callback = new Runnable() {
             public void run() {
                 try {
                     bundleContext.getBundle(0).stop();
@@ -90,6 +74,35 @@ public class LocalConsoleManager {
                 }
             }
         };
+
+        
+        final Subject subject = createLocalKarafSubject();    
+        this.console = JaasHelper.<Console>doAs(subject, new 
PrivilegedAction<Console>() {
+            public Console run() {
+                String encoding = getEncoding();
+                console = consoleFactory.create(
+                                      StreamWrapUtil.reWrapIn(terminal, 
System.in), 
+                                      StreamWrapUtil.reWrap(System.out), 
+                                      StreamWrapUtil.reWrap(System.err),
+                                      terminal, 
+                                      encoding, 
+                                      callback);
+                String name = "Karaf local console user " + 
ShellUtil.getCurrentUserName();
+                boolean delayconsole = 
Boolean.parseBoolean(System.getProperty("karaf.delay.console"));
+                if (delayconsole) {
+                    DelayedStarted watcher = new DelayedStarted(console, name, 
bundleContext, System.in);
+                    new Thread(watcher).start();
+                } else {
+                    new Thread(console, name).start();
+                }
+                return console;
+            }
+        });
+        registration = bundleContext.registerService(CommandSession.class, 
console.getSession(), null);
+
+    }
+
+    private String getEncoding() {
         String ctype = System.getenv("LC_CTYPE");
         String encoding = ctype;
         if (encoding != null && encoding.indexOf('.') > 0) {
@@ -97,23 +110,20 @@ public class LocalConsoleManager {
         } else {
             encoding = System.getProperty("input.encoding", 
Charset.defaultCharset().name());
         }
-        this.console = consoleFactory.createLocal(this.commandProcessor, 
this.threadIO, terminal, encoding, callback);
+        return encoding;
+    }
 
-        registration = bundleContext.registerService(CommandSession.class, 
console.getSession(), null);
+    private Subject createLocalKarafSubject() {
+        final Subject subject = new Subject();
+        subject.getPrincipals().add(new UserPrincipal("karaf"));
 
-        Runnable consoleStarter = new Runnable() {
-            public void run() {
-                consoleFactory.startConsoleAs(console, subject, "Local");
+        String roles = System.getProperty("karaf.local.roles");
+        if (roles != null) {
+            for (String role : roles.split("[,]")) {
+                subject.getPrincipals().add(new RolePrincipal(role.trim()));
             }
-        };
-        
-        boolean delayconsole = 
Boolean.parseBoolean(System.getProperty("karaf.delay.console"));
-        if (delayconsole) {
-            DelayedStarted watcher = new DelayedStarted(consoleStarter, 
bundleContext, System.in);
-            new Thread(watcher).start();
-        } else {
-            consoleStarter.run();
         }
+        return subject;
     }
 
     public void stop() throws Exception {

http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/shell/console/src/main/java/org/apache/karaf/shell/security/impl/SecuredCommandProcessorImpl.java
----------------------------------------------------------------------
diff --git 
a/shell/console/src/main/java/org/apache/karaf/shell/security/impl/SecuredCommandProcessorImpl.java
 
b/shell/console/src/main/java/org/apache/karaf/shell/security/impl/SecuredCommandProcessorImpl.java
index 84224c4..bb47d74 100644
--- 
a/shell/console/src/main/java/org/apache/karaf/shell/security/impl/SecuredCommandProcessorImpl.java
+++ 
b/shell/console/src/main/java/org/apache/karaf/shell/security/impl/SecuredCommandProcessorImpl.java
@@ -25,6 +25,7 @@ import org.apache.felix.service.command.Converter;
 import org.apache.felix.service.command.Function;
 import org.apache.felix.service.threadio.ThreadIO;
 import org.apache.karaf.jaas.boot.principal.RolePrincipal;
+import org.apache.karaf.shell.util.ShellUtil;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Filter;
 import org.osgi.framework.InvalidSyntaxException;
@@ -32,6 +33,8 @@ import org.osgi.framework.ServiceReference;
 import org.osgi.util.tracker.ServiceTracker;
 
 import javax.security.auth.Subject;
+
+import java.nio.file.attribute.UserPrincipal;
 import java.security.AccessControlContext;
 import java.security.AccessController;
 import java.util.ArrayList;
@@ -62,7 +65,7 @@ public class SecuredCommandProcessorImpl extends 
CommandProcessorImpl {
 
         Set<RolePrincipal> rolePrincipals = 
sub.getPrincipals(RolePrincipal.class);
         if (rolePrincipals.size() == 0)
-            throw new SecurityException("Current user has no associated 
roles.");
+            throw new SecurityException("Current user " + 
ShellUtil.getCurrentUserName() + " has no associated roles.");
 
         // TODO cater for custom roles
         StringBuilder sb = new StringBuilder();

http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/shell/console/src/main/java/org/apache/karaf/shell/util/ShellUtil.java
----------------------------------------------------------------------
diff --git 
a/shell/console/src/main/java/org/apache/karaf/shell/util/ShellUtil.java 
b/shell/console/src/main/java/org/apache/karaf/shell/util/ShellUtil.java
index 388a0a6..e8a1d6a 100644
--- a/shell/console/src/main/java/org/apache/karaf/shell/util/ShellUtil.java
+++ b/shell/console/src/main/java/org/apache/karaf/shell/util/ShellUtil.java
@@ -26,8 +26,13 @@ import static 
org.apache.karaf.shell.commands.ansi.SimpleAnsi.INTENSITY_NORMAL;
 import java.net.MalformedURLException;
 import java.net.URI;
 import java.net.URL;
+import java.security.AccessControlContext;
+import java.security.AccessController;
+
+import javax.security.auth.Subject;
 
 import org.apache.felix.service.command.CommandSession;
+import org.apache.karaf.jaas.boot.principal.UserPrincipal;
 import org.apache.karaf.shell.commands.CommandException;
 import org.apache.karaf.shell.console.SessionProperties;
 import org.osgi.framework.Bundle;
@@ -171,4 +176,14 @@ public class ShellUtil {
         }
     }
 
+    public static String getCurrentUserName() {
+        AccessControlContext acc = AccessController.getContext();
+        final Subject subject = Subject.getSubject(acc);
+        if (subject != null && 
subject.getPrincipals(UserPrincipal.class).iterator().hasNext()) {
+            return 
subject.getPrincipals(UserPrincipal.class).iterator().next().getName();
+        } else {
+            return null;
+        }
+    }
+    
 }

http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml
----------------------------------------------------------------------
diff --git 
a/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml 
b/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml
index bbe0c5b..f8b8837 100644
--- a/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml
+++ b/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml
@@ -31,8 +31,10 @@
 
     <bean id="consoleFactoryService" 
class="org.apache.karaf.shell.console.impl.jline.ConsoleFactoryService">
         <argument ref="blueprintBundleContext"/>
+        <argument ref="commandProcessor"/>
+        <argument ref="threadIO"/>
     </bean>
-    <service interface="org.apache.karaf.shell.console.ConsoleFactory" 
ref="consoleFactoryService"/>
+    <service interface="org.apache.karaf.shell.console.factory.ConsoleFactory" 
ref="consoleFactoryService"/>
 
     <bean id="consoleFactory" 
class="org.apache.karaf.shell.console.impl.jline.LocalConsoleManager"
           destroy-method="stop">
@@ -41,8 +43,6 @@
         <argument ref="blueprintBundleContext"/>
         <argument ref="terminalFactory"/>
         <argument ref="consoleFactoryService"/>
-        <argument ref="commandProcessor"/>
-        <argument ref="threadIO"/>
     </bean>
 
     <bean id="converters" 
class="org.apache.karaf.shell.console.impl.Converters">

http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellFactoryImpl.java
----------------------------------------------------------------------
diff --git 
a/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellFactoryImpl.java 
b/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellFactoryImpl.java
index 08bf0d8..657193b 100644
--- a/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellFactoryImpl.java
+++ b/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellFactoryImpl.java
@@ -24,18 +24,18 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.PrintStream;
+import java.security.PrivilegedAction;
 import java.util.Map;
 
 import javax.security.auth.Subject;
 
 import jline.Terminal;
 
-import org.apache.felix.service.command.CommandProcessor;
 import org.apache.felix.service.command.CommandSession;
+import org.apache.karaf.jaas.modules.JaasHelper;
 import org.apache.karaf.shell.console.Console;
-import org.apache.karaf.shell.console.ConsoleFactory;
-import org.apache.felix.service.command.Function;
-import org.apache.felix.service.threadio.ThreadIO;
+import org.apache.karaf.shell.console.factory.ConsoleFactory;
+import org.apache.karaf.shell.util.ShellUtil;
 import org.apache.sshd.common.Factory;
 import org.apache.sshd.server.Command;
 import org.apache.sshd.server.Environment;
@@ -49,14 +49,10 @@ import org.osgi.service.blueprint.container.ReifiedType;
  * Shell.
  */
 public class ShellFactoryImpl implements Factory<Command> {
-    private CommandProcessor commandProcessor;
     private ConsoleFactory consoleFactory;
-    private ThreadIO threadIO;
 
-    public ShellFactoryImpl(CommandProcessor commandProcessor, ConsoleFactory 
consoleFactory, ThreadIO threadIO) {
-        this.commandProcessor = commandProcessor;
+    public ShellFactoryImpl(ConsoleFactory consoleFactory) {
         this.consoleFactory = consoleFactory;
-        this.threadIO = threadIO;
     }
 
     public Command create() {
@@ -110,13 +106,18 @@ public class ShellFactoryImpl implements Factory<Command> 
{
                 if (encoding != null && encoding.indexOf('.') > 0) {
                     encoding = encoding.substring(encoding.indexOf('.') + 1);
                 }
-                Console console = consoleFactory.create(commandProcessor, 
threadIO, in,
+                final Console console = consoleFactory.create(in,
                         lfToCrLfPrintStream(out), lfToCrLfPrintStream(err), 
terminal, encoding, destroyCallback);
                 final CommandSession session = console.getSession();
                 for (Map.Entry<String, String> e : env.getEnv().entrySet()) {
                     session.put(e.getKey(), e.getValue());
                 }
-                consoleFactory.startConsoleAs(console, subject, "ssh");
+                JaasHelper.doAs(subject, new PrivilegedAction<Object>() {
+                    public Object run() {
+                        new Thread(console, "Karaf ssh console user " + 
ShellUtil.getCurrentUserName()).start();
+                        return null;
+                    }
+                });
             } catch (Exception e) {
                 throw (IOException) new IOException("Unable to start 
shell").initCause(e);
             }

http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml
----------------------------------------------------------------------
diff --git a/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml 
b/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml
index fc63ceb..7a58288 100644
--- a/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml
+++ b/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml
@@ -24,13 +24,11 @@
            default-activation="lazy">
 
     <type-converters>
-        <bean class="org.apache.karaf.shell.ssh.ShellFactoryImpl" 
factory-method="getConverter" >
-               
-        </bean>
+        <bean class="org.apache.karaf.shell.ssh.ShellFactoryImpl" 
factory-method="getConverter" />
         <bean class="org.apache.karaf.shell.ssh.UserAuthFactoriesFactory" 
factory-method="getConverter" />
     </type-converters>
     
-    <reference id="consoleFactory" 
interface="org.apache.karaf.shell.console.ConsoleFactory" />
+    <reference id="consoleFactory" 
interface="org.apache.karaf.shell.console.factory.ConsoleFactory" />
 
     <ext:property-placeholder placeholder-prefix="$[" placeholder-suffix="]">
         <ext:default-properties>
@@ -93,9 +91,7 @@
         </property>
         <property name="shellFactory">
             <bean class="org.apache.karaf.shell.ssh.ShellFactoryImpl">
-               <argument ref="commandProcessor"/>
                <argument ref="consoleFactory"/>
-                <argument ref="threadIO"/>
             </bean>
         </property>
         <property name="commandFactory">
@@ -148,10 +144,6 @@
         <property name="idleTimeout" value="${sshIdleTimeout}"/>
     </bean>
 
-    <reference id="commandProcessor" 
interface="org.apache.felix.service.command.CommandProcessor">
-    </reference>
-
-    <reference id="threadIO" 
interface="org.apache.felix.service.threadio.ThreadIO">
-    </reference>
+    <reference id="commandProcessor" 
interface="org.apache.felix.service.command.CommandProcessor"/>
 
 </blueprint>

http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/GogoPlugin.java
----------------------------------------------------------------------
diff --git 
a/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/GogoPlugin.java
 
b/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/GogoPlugin.java
index 077c31b..dcfb00d 100644
--- 
a/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/GogoPlugin.java
+++ 
b/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/GogoPlugin.java
@@ -40,11 +40,10 @@ import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.apache.felix.service.command.CommandProcessor;
-import org.apache.felix.service.threadio.ThreadIO;
-import org.apache.karaf.shell.console.Console;
-import org.apache.karaf.shell.console.ConsoleFactory;
 import org.apache.felix.webconsole.AbstractWebConsolePlugin;
+import org.apache.karaf.jaas.boot.principal.UserPrincipal;
+import org.apache.karaf.shell.console.Console;
+import org.apache.karaf.shell.console.factory.ConsoleFactory;
 import org.osgi.framework.BundleContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -62,9 +61,7 @@ public class GogoPlugin extends AbstractWebConsolePlugin {
     public static final int TERM_HEIGHT = 39;
 
     private BundleContext bundleContext;
-    private CommandProcessor commandProcessor;
     private ConsoleFactory consoleFactory;
-    private ThreadIO threadIO;
 
     @Override
     protected boolean isHtmlRequest(HttpServletRequest request) {
@@ -75,18 +72,10 @@ public class GogoPlugin extends AbstractWebConsolePlugin {
         this.bundleContext = bundleContext;
     }
 
-    public void setCommandProcessor(CommandProcessor commandProcessor) {
-        this.commandProcessor = commandProcessor;
-    }
-
     public void setConsoleFactory(ConsoleFactory consoleFactory) {
         this.consoleFactory = consoleFactory;
     }
 
-    public void setThreadIO(ThreadIO threadIO) {
-        this.threadIO = threadIO;
-    }
-
     public void start() {
         super.activate(bundleContext);
         this.logger.info(LABEL + " plugin activated");
@@ -195,19 +184,15 @@ public class GogoPlugin extends AbstractWebConsolePlugin {
                 in = new PipedOutputStream();
                 out = new PipedInputStream();
                 PrintStream pipedOut = new PrintStream(new 
PipedOutputStream(out), true);
-
-                AccessControlContext acc = AccessController.getContext();
-                final Subject subject = Subject.getSubject(acc);
                 
-                Console console = consoleFactory.create(commandProcessor,
-                        threadIO,
+                Console console = consoleFactory.create(
                         new PipedInputStream(in),
                         pipedOut,
                         pipedOut,
                         new WebTerminal(TERM_WIDTH, TERM_HEIGHT),
                         null,
                         null);
-                consoleFactory.startConsoleAs(console, subject, "Web");
+                new Thread(console, "Karaf web console user " + 
getCurrentUserName()).start();
             } catch (IOException e) {
                 e.printStackTrace();
                 throw e;
@@ -217,6 +202,16 @@ public class GogoPlugin extends AbstractWebConsolePlugin {
             }
             new Thread(this).start();
         }
+        
+        private String getCurrentUserName() {
+            AccessControlContext acc = AccessController.getContext();
+            final Subject subject = Subject.getSubject(acc);
+            if (subject != null && 
subject.getPrincipals().iterator().hasNext()) {
+                return 
subject.getPrincipals(UserPrincipal.class).iterator().next().getName();
+            } else {
+                return null;
+            }
+        }
 
         public boolean isClosed() {
             return closed;

http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml
----------------------------------------------------------------------
diff --git 
a/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml 
b/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml
index 9a17021..79fc42c 100644
--- a/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml
+++ b/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml
@@ -19,13 +19,9 @@
 -->
 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"; 
default-activation="lazy">
 
-    <reference id="commandProcessor" 
interface="org.apache.felix.service.command.CommandProcessor" />
-       <reference id="consoleFactory" 
interface="org.apache.karaf.shell.console.ConsoleFactory"/>
-    <reference id="threadIO" 
interface="org.apache.felix.service.threadio.ThreadIO" />
+       <reference id="consoleFactory" 
interface="org.apache.karaf.shell.console.factory.ConsoleFactory"/>
 
     <bean id="gogoPlugin" class="org.apache.karaf.webconsole.gogo.GogoPlugin" 
init-method="start" destroy-method="stop">
-        <property name="commandProcessor" ref="commandProcessor" />
-        <property name="threadIO" ref="threadIO" />
         <property name="bundleContext" ref="blueprintBundleContext" />
         <property name="consoleFactory" ref="consoleFactory"/>
     </bean>

Reply via email to