Author: gnodet Date: Fri Nov 29 16:56:18 2013 New Revision: 1546608 URL: http://svn.apache.org/r1546608 Log: [KARAF-2594] The use of inheritable thread locals in ThreadIO can cause problems
Modified: karaf/trunk/pom.xml karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/ConsoleFactory.java karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/Main.java karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleFactoryService.java 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/console/impl/jline/LocalConsoleManager.java karaf/trunk/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml karaf/trunk/shell/console/src/test/java/org/apache/karaf/shell/console/ExampleSubclassMain.java karaf/trunk/shell/console/src/test/java/org/apache/karaf/shell/console/impl/jline/ConsoleImplTest.java karaf/trunk/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellFactoryImpl.java karaf/trunk/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml karaf/trunk/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/GogoPlugin.java karaf/trunk/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml Modified: karaf/trunk/pom.xml URL: http://svn.apache.org/viewvc/karaf/trunk/pom.xml?rev=1546608&r1=1546607&r2=1546608&view=diff ============================================================================== --- karaf/trunk/pom.xml (original) +++ karaf/trunk/pom.xml Fri Nov 29 16:56:18 2013 @@ -149,7 +149,7 @@ <felix.configadmin.version>1.8.0</felix.configadmin.version> <felix.fileinstall.version>3.2.6</felix.fileinstall.version> <felix.framework.version>4.2.1</felix.framework.version> - <felix.gogo.version>0.10.0</felix.gogo.version> + <felix.gogo.version>0.11.0-SNAPSHOT</felix.gogo.version> <felix.plugin.version>2.4.0</felix.plugin.version> <felix.utils.version>1.4.0</felix.utils.version> <felix.webconsole.version>4.2.0</felix.webconsole.version> Modified: karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/ConsoleFactory.java URL: http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/ConsoleFactory.java?rev=1546608&r1=1546607&r2=1546608&view=diff ============================================================================== --- karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/ConsoleFactory.java (original) +++ karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/ConsoleFactory.java Fri Nov 29 16:56:18 2013 @@ -26,9 +26,10 @@ 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, InputStream in, PrintStream out, PrintStream err, final Terminal term, String encoding, Runnable closeCallback); - Console createLocal(CommandProcessor processor, Terminal terminal, String encoding, Runnable closeCallback); + 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); } Modified: karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/Main.java URL: http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/Main.java?rev=1546608&r1=1546607&r2=1546608&view=diff ============================================================================== --- karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/Main.java (original) +++ karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/Main.java Fri Nov 29 16:56:18 2013 @@ -70,7 +70,7 @@ public class Main { InputStream in = unwrap(System.in); PrintStream out = wrap(unwrap(System.out)); PrintStream err = wrap(unwrap(System.err)); - run(commandProcessor, args, in, out, err); + run(commandProcessor, threadio, args, in, out, err); // TODO: do we need to stop the threadio that was started? // threadio.stop(); @@ -84,7 +84,7 @@ public class Main { * @param args * @throws Exception */ - public void run(CommandSession parent, String args[]) throws Exception { + public void run(CommandSession parent, ThreadIO threadIO, String args[]) throws Exception { // TODO: find out what the down side of not using a real ThreadIO implementation is. CommandProcessorImpl commandProcessor = new CommandProcessorImpl(new ThreadIO() { @@ -98,10 +98,10 @@ public class Main { InputStream in = parent.getKeyboard(); PrintStream out = parent.getConsole(); PrintStream err = parent.getConsole(); - run(commandProcessor, args, in, out, err); + run(commandProcessor, threadIO, args, in, out, err); } - private void run(CommandProcessorImpl commandProcessor, String[] args, InputStream in, PrintStream out, PrintStream err) throws Exception { + private void run(CommandProcessorImpl commandProcessor, ThreadIO threadIO, String[] args, InputStream in, PrintStream out, PrintStream err) throws Exception { StringBuilder sb = new StringBuilder(); String classpath = null; boolean batch = false; @@ -155,10 +155,10 @@ public class Main { discoverCommands(commandProcessor, cl); - run(commandProcessor, sb.toString(), in, out, err); + run(commandProcessor, threadIO, sb.toString(), in, out, err); } - private void run(final CommandProcessorImpl commandProcessor, String command, final InputStream in, final PrintStream out, final PrintStream err) throws Exception { + private void run(final CommandProcessorImpl commandProcessor, ThreadIO threadIO, String command, final InputStream in, final PrintStream out, final PrintStream err) throws Exception { if (command.length() > 0) { @@ -194,7 +194,7 @@ public class Main { final TerminalFactory terminalFactory = new TerminalFactory(); final Terminal terminal = terminalFactory.getTerminal(); - ConsoleImpl console = createConsole(commandProcessor, in, out, err, terminal); + ConsoleImpl console = createConsole(commandProcessor, threadIO, in, out, err, terminal); CommandSession session = console.getSession(); session.put("USER", user); session.put("APPLICATION", application); @@ -229,8 +229,8 @@ public class Main { * @return * @throws Exception */ - protected ConsoleImpl createConsole(CommandProcessorImpl commandProcessor, InputStream in, PrintStream out, PrintStream err, Terminal terminal) throws Exception { - return new ConsoleImpl(commandProcessor, in, out, err, terminal, null, null, null); + protected ConsoleImpl createConsole(CommandProcessorImpl commandProcessor, ThreadIO threadIO, InputStream in, PrintStream out, PrintStream err, Terminal terminal) throws Exception { + return new ConsoleImpl(commandProcessor, threadIO, in, out, err, terminal, null, null, null); } /** Modified: karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleFactoryService.java URL: http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleFactoryService.java?rev=1546608&r1=1546607&r2=1546608&view=diff ============================================================================== --- karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleFactoryService.java (original) +++ karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleFactoryService.java Fri Nov 29 16:56:18 2013 @@ -32,6 +32,7 @@ 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.shell.console.Console; import org.apache.karaf.shell.console.ConsoleFactory; @@ -46,8 +47,9 @@ public class ConsoleFactoryService imple } @Override - public Console createLocal(CommandProcessor processor, final Terminal terminal, String encoding, Runnable closeCallback) { - return create(processor, + 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), @@ -57,9 +59,9 @@ public class ConsoleFactoryService imple } @Override - public Console create(CommandProcessor processor, InputStream in, PrintStream out, PrintStream err, final Terminal terminal, + public Console create(CommandProcessor processor, ThreadIO threadIO, InputStream in, PrintStream out, PrintStream err, final Terminal terminal, String encoding, Runnable closeCallback) { - ConsoleImpl console = new ConsoleImpl(processor, in, out, err, terminal, encoding, closeCallback, bundleContext); + ConsoleImpl console = new ConsoleImpl(processor, threadIO, in, out, err, terminal, encoding, closeCallback, bundleContext); CommandSession session = console.getSession(); session.put("APPLICATION", System.getProperty("karaf.name", "root")); session.put("#LINES", new Function() { 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=1546608&r1=1546607&r2=1546608&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 Fri Nov 29 16:56:18 2013 @@ -43,6 +43,7 @@ import jline.console.history.PersistentH import org.apache.felix.service.command.CommandProcessor; import org.apache.felix.service.command.CommandSession; import org.apache.felix.service.command.Converter; +import org.apache.felix.service.threadio.ThreadIO; import org.apache.karaf.shell.console.CloseShellException; import org.apache.karaf.shell.console.CommandSessionHolder; import org.apache.karaf.shell.console.Completer; @@ -65,6 +66,7 @@ public class ConsoleImpl implements Cons private static final Logger LOGGER = LoggerFactory.getLogger(Console.class); protected CommandSession session; + protected ThreadIO threadIO; private ConsoleReader reader; private BlockingQueue<Integer> queue; private boolean interrupt; @@ -81,6 +83,7 @@ public class ConsoleImpl implements Cons private final BundleContext bundleContext; public ConsoleImpl(CommandProcessor processor, + ThreadIO threadIO, InputStream in, PrintStream out, PrintStream err, @@ -88,6 +91,7 @@ public class ConsoleImpl implements Cons String encoding, Runnable closeCallback, BundleContext bc) { + this.threadIO = threadIO; this.in = in; this.out = out; this.err = err; @@ -172,40 +176,45 @@ public class ConsoleImpl implements Cons } public void run() { - SecuredCommandProcessorImpl secCP = createSecuredCommandProcessor(); - thread = Thread.currentThread(); - CommandSessionHolder.setSession(session); - running = true; - pipe.start(); - Properties brandingProps = Branding.loadBrandingProperties(terminal); - welcome(brandingProps); - setSessionProperties(brandingProps); - String scriptFileName = System.getProperty(SHELL_INIT_SCRIPT); - executeScript(scriptFileName); - while (running) { - try { - String command = readAndParseCommand(); - if (command == null) { + try { + threadIO.setStreams(consoleInput, out, err); + SecuredCommandProcessorImpl secCP = createSecuredCommandProcessor(); + thread = Thread.currentThread(); + CommandSessionHolder.setSession(session); + running = true; + pipe.start(); + Properties brandingProps = Branding.loadBrandingProperties(terminal); + welcome(brandingProps); + setSessionProperties(brandingProps); + String scriptFileName = System.getProperty(SHELL_INIT_SCRIPT); + executeScript(scriptFileName); + while (running) { + try { + String command = readAndParseCommand(); + if (command == null) { + break; + } + //session.getConsole().println("Executing: " + line); + Object result = session.execute(command); + if (result != null) { + session.getConsole().println(session.format(result, Converter.INSPECT)); + } + } catch (InterruptedIOException e) { + //System.err.println("^C"); + // TODO: interrupt current thread + } catch (InterruptedException e) { + //interrupt current thread + } catch (CloseShellException e) { break; + } catch (Throwable t) { + ShellUtil.logException(session, t); } - //session.getConsole().println("Executing: " + line); - Object result = session.execute(command); - if (result != null) { - session.getConsole().println(session.format(result, Converter.INSPECT)); - } - } catch (InterruptedIOException e) { - //System.err.println("^C"); - // TODO: interrupt current thread - } catch (InterruptedException e) { - //interrupt current thread - } catch (CloseShellException e) { - break; - } catch (Throwable t) { - ShellUtil.logException(session, t); } + secCP.close(); + close(true); + } finally { + threadIO.close(); } - secCP.close(); - close(true); } SecuredCommandProcessorImpl createSecuredCommandProcessor() { Modified: karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java URL: http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java?rev=1546608&r1=1546607&r2=1546608&view=diff ============================================================================== --- karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java (original) +++ karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java Fri Nov 29 16:56:18 2013 @@ -25,6 +25,7 @@ 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.shell.console.Console; @@ -45,6 +46,7 @@ public class LocalConsoleManager { private boolean start; private final int defaultStartLevel; private CommandProcessor commandProcessor; + private ThreadIO threadIO; private ServiceRegistration registration; public LocalConsoleManager(boolean start, @@ -52,13 +54,15 @@ public class LocalConsoleManager { BundleContext bundleContext, TerminalFactory terminalFactory, ConsoleFactory consoleFactory, - CommandProcessor commandProcessor) throws Exception { + CommandProcessor commandProcessor, + ThreadIO threadIO) 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(); } @@ -93,7 +97,7 @@ public class LocalConsoleManager { } else { encoding = System.getProperty("input.encoding", Charset.defaultCharset().name()); } - this.console = consoleFactory.createLocal(this.commandProcessor, terminal, encoding, callback); + this.console = consoleFactory.createLocal(this.commandProcessor, this.threadIO, terminal, encoding, callback); registration = bundleContext.registerService(CommandSession.class, console.getSession(), null); Modified: karaf/trunk/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml URL: http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml?rev=1546608&r1=1546607&r2=1546608&view=diff ============================================================================== --- karaf/trunk/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml (original) +++ karaf/trunk/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml Fri Nov 29 16:56:18 2013 @@ -27,6 +27,7 @@ </ext:property-placeholder> <reference id="commandProcessor" interface="org.apache.felix.service.command.CommandProcessor"/> + <reference id="threadIO" interface="org.apache.felix.service.threadio.ThreadIO" /> <bean id="consoleFactoryService" class="org.apache.karaf.shell.console.impl.jline.ConsoleFactoryService"> <argument ref="blueprintBundleContext"/> @@ -41,6 +42,7 @@ <argument ref="terminalFactory"/> <argument ref="consoleFactoryService"/> <argument ref="commandProcessor"/> + <argument ref="threadIO"/> </bean> <bean id="converters" class="org.apache.karaf.shell.console.impl.Converters"> Modified: karaf/trunk/shell/console/src/test/java/org/apache/karaf/shell/console/ExampleSubclassMain.java URL: http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/test/java/org/apache/karaf/shell/console/ExampleSubclassMain.java?rev=1546608&r1=1546607&r2=1546608&view=diff ============================================================================== --- karaf/trunk/shell/console/src/test/java/org/apache/karaf/shell/console/ExampleSubclassMain.java (original) +++ karaf/trunk/shell/console/src/test/java/org/apache/karaf/shell/console/ExampleSubclassMain.java Fri Nov 29 16:56:18 2013 @@ -21,6 +21,7 @@ import java.io.PrintStream; import jline.Terminal; import org.apache.felix.gogo.runtime.CommandProcessorImpl; +import org.apache.felix.service.threadio.ThreadIO; import org.apache.karaf.shell.console.impl.Main; import org.apache.karaf.shell.console.impl.jline.ConsoleImpl; @@ -45,8 +46,8 @@ public class ExampleSubclassMain extends } @Override - protected ConsoleImpl createConsole(CommandProcessorImpl commandProcessor, InputStream in, PrintStream out, PrintStream err, Terminal terminal) throws Exception { - return new ConsoleImpl(commandProcessor, in, out, err, terminal, null, null, null) { + protected ConsoleImpl createConsole(CommandProcessorImpl commandProcessor, ThreadIO threadIO, InputStream in, PrintStream out, PrintStream err, Terminal terminal) throws Exception { + return new ConsoleImpl(commandProcessor, threadIO, in, out, err, terminal, null, null, null) { /** * If you don't overwrite, then karaf will use the welcome message found in the Modified: karaf/trunk/shell/console/src/test/java/org/apache/karaf/shell/console/impl/jline/ConsoleImplTest.java URL: http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/test/java/org/apache/karaf/shell/console/impl/jline/ConsoleImplTest.java?rev=1546608&r1=1546607&r2=1546608&view=diff ============================================================================== --- karaf/trunk/shell/console/src/test/java/org/apache/karaf/shell/console/impl/jline/ConsoleImplTest.java (original) +++ karaf/trunk/shell/console/src/test/java/org/apache/karaf/shell/console/impl/jline/ConsoleImplTest.java Fri Nov 29 16:56:18 2013 @@ -31,6 +31,7 @@ import java.security.PrivilegedAction; import javax.security.auth.Subject; import org.apache.felix.gogo.api.CommandSessionListener; +import org.apache.felix.gogo.runtime.threadio.ThreadIOImpl; import org.apache.felix.service.command.CommandProcessor; import org.apache.felix.service.command.CommandSession; import org.apache.felix.service.command.Converter; @@ -73,7 +74,7 @@ public class ConsoleImplTest { }).anyTimes(); EasyMock.replay(bc); - final ConsoleImpl console = new ConsoleImpl(null, System.in, System.out, System.err, null, "UTF-8", null, bc); + final ConsoleImpl console = new ConsoleImpl(null, new ThreadIOImpl(), System.in, System.out, System.err, null, "UTF-8", null, bc); assertTrue(console.session instanceof DelegateSession); console.session.put("foo", "bar"); Modified: karaf/trunk/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellFactoryImpl.java URL: http://svn.apache.org/viewvc/karaf/trunk/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellFactoryImpl.java?rev=1546608&r1=1546607&r2=1546608&view=diff ============================================================================== --- karaf/trunk/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellFactoryImpl.java (original) +++ karaf/trunk/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellFactoryImpl.java Fri Nov 29 16:56:18 2013 @@ -34,6 +34,8 @@ import org.apache.felix.service.command. import org.apache.felix.service.command.CommandSession; 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.sshd.common.Factory; import org.apache.sshd.server.Command; import org.apache.sshd.server.Environment; @@ -49,10 +51,12 @@ import org.osgi.service.blueprint.contai public class ShellFactoryImpl implements Factory<Command> { private CommandProcessor commandProcessor; private ConsoleFactory consoleFactory; + private ThreadIO threadIO; - public ShellFactoryImpl(CommandProcessor commandProcessor, ConsoleFactory consoleFactory) { + public ShellFactoryImpl(CommandProcessor commandProcessor, ConsoleFactory consoleFactory, ThreadIO threadIO) { this.commandProcessor = commandProcessor; this.consoleFactory = consoleFactory; + this.threadIO = threadIO; } public Command create() { @@ -106,7 +110,7 @@ public class ShellFactoryImpl implements if (encoding != null && encoding.indexOf('.') > 0) { encoding = encoding.substring(encoding.indexOf('.') + 1); } - Console console = consoleFactory.create(commandProcessor, in, + Console console = consoleFactory.create(commandProcessor, threadIO, in, lfToCrLfPrintStream(out), lfToCrLfPrintStream(err), terminal, encoding, destroyCallback); final CommandSession session = console.getSession(); for (Map.Entry<String, String> e : env.getEnv().entrySet()) { Modified: karaf/trunk/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml URL: http://svn.apache.org/viewvc/karaf/trunk/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml?rev=1546608&r1=1546607&r2=1546608&view=diff ============================================================================== --- karaf/trunk/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml (original) +++ karaf/trunk/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml Fri Nov 29 16:56:18 2013 @@ -83,6 +83,7 @@ <bean class="org.apache.karaf.shell.ssh.ShellFactoryImpl"> <argument ref="commandProcessor"/> <argument ref="consoleFactory"/> + <argument ref="threadIO"/> </bean> </property> <property name="commandFactory"> @@ -138,4 +139,7 @@ <reference id="commandProcessor" interface="org.apache.felix.service.command.CommandProcessor"> </reference> + <reference id="threadIO" interface="org.apache.felix.service.threadio.ThreadIO"> + </reference> + </blueprint> Modified: karaf/trunk/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/GogoPlugin.java URL: http://svn.apache.org/viewvc/karaf/trunk/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/GogoPlugin.java?rev=1546608&r1=1546607&r2=1546608&view=diff ============================================================================== --- karaf/trunk/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/GogoPlugin.java (original) +++ karaf/trunk/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/GogoPlugin.java Fri Nov 29 16:56:18 2013 @@ -39,6 +39,7 @@ import javax.servlet.http.HttpServletReq import javax.servlet.http.HttpServletResponse; import org.apache.felix.service.command.CommandProcessor; +import org.apache.felix.service.threadio.ThreadIO; import org.apache.karaf.jaas.boot.principal.UserPrincipal; import org.apache.karaf.shell.console.Console; import org.apache.karaf.shell.console.ConsoleFactory; @@ -62,6 +63,7 @@ public class GogoPlugin extends Abstract private BundleContext bundleContext; private CommandProcessor commandProcessor; private ConsoleFactory consoleFactory; + private ThreadIO threadIO; @Override protected boolean isHtmlRequest(HttpServletRequest request) { @@ -80,6 +82,10 @@ public class GogoPlugin extends Abstract this.consoleFactory = consoleFactory; } + public void setThreadIO(ThreadIO threadIO) { + this.threadIO = threadIO; + } + public void start() { super.activate(bundleContext); this.logger.info(LABEL + " plugin activated"); @@ -192,6 +198,7 @@ public class GogoPlugin extends Abstract final Subject subject = new Subject(); subject.getPrincipals().add(new UserPrincipal("karaf")); Console console = consoleFactory.create(commandProcessor, + threadIO, new PipedInputStream(in), pipedOut, pipedOut, Modified: karaf/trunk/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml URL: http://svn.apache.org/viewvc/karaf/trunk/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml?rev=1546608&r1=1546607&r2=1546608&view=diff ============================================================================== --- karaf/trunk/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml (original) +++ karaf/trunk/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml Fri Nov 29 16:56:18 2013 @@ -21,9 +21,11 @@ <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" /> <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>