Author: gnodet
Date: Fri Sep  3 14:13:28 2010
New Revision: 992306

URL: http://svn.apache.org/viewvc?rev=992306&view=rev
Log:
KARAF-171: provides a help command

Added:
    
karaf/trunk/shell/commands/src/main/java/org/apache/karaf/shell/commands/HelpAction.java
Removed:
    
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/commands/Help.java
    
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/completer/SimpleCommandsCompleter.java
Modified:
    
karaf/trunk/shell/commands/src/main/resources/META-INF/services/org/apache/karaf/shell/commands
    
karaf/trunk/shell/commands/src/main/resources/OSGI-INF/blueprint/shell-commands.xml
    
karaf/trunk/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/SimpleCommand.java
    
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/Main.java
    
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java
    
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java
    
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/ConsoleFactory.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/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

Added: 
karaf/trunk/shell/commands/src/main/java/org/apache/karaf/shell/commands/HelpAction.java
URL: 
http://svn.apache.org/viewvc/karaf/trunk/shell/commands/src/main/java/org/apache/karaf/shell/commands/HelpAction.java?rev=992306&view=auto
==============================================================================
--- 
karaf/trunk/shell/commands/src/main/java/org/apache/karaf/shell/commands/HelpAction.java
 (added)
+++ 
karaf/trunk/shell/commands/src/main/java/org/apache/karaf/shell/commands/HelpAction.java
 Fri Sep  3 14:13:28 2010
@@ -0,0 +1,119 @@
+/**
+ *
+ * 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.commands;
+
+import java.io.PrintStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import jline.Terminal;
+import org.apache.felix.gogo.commands.Action;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.basic.AbstractCommand;
+import org.apache.felix.gogo.commands.basic.DefaultActionPreparator;
+import org.apache.felix.gogo.runtime.shell.CommandProxy;
+import org.apache.felix.gogo.runtime.shell.CommandSessionImpl;
+import org.apache.karaf.shell.console.AbstractAction;
+import org.fusesource.jansi.Ansi;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.command.Function;
+
+/**
+ * Displays help on the available commands
+ */
+...@command(scope = "*", name = "help", description = "Displays this help or 
help about a command")
+public class HelpAction extends AbstractAction {
+
+    @Argument(name = "command", required = false, description = "The command 
to get help for")
+    private String command;
+
+    public Object doExecute() throws Exception {
+        if (command == null) {
+            Set<String> names = (Set<String>) session.get(".commands");
+            if (!names.isEmpty()) {
+                Terminal term = (Terminal) session.get(".jline.terminal");
+                PrintStream out = System.out;
+                SortedMap<String,String> commands = new 
TreeMap<String,String>();
+                for (String name : names) {
+                    String description = null;
+                    Function function = (Function) session.get(name);
+                    function = unProxy(function);
+                    if (function instanceof AbstractCommand) {
+                        try {
+                            Method mth = 
AbstractCommand.class.getDeclaredMethod("createNewAction");
+                            mth.setAccessible(true);
+                            Action action = (Action) mth.invoke(function);
+                            Class<? extends Action> clazz = action.getClass();
+                            Command ann = clazz.getAnnotation(Command.class);
+                            description = ann.description();
+                        } catch (Throwable e) {
+                        }
+                        if (name.startsWith("*:")) {
+                            name = name.substring(2);
+                        }
+                        commands.put(name, description);
+                    }
+                }
+                // Post process the commands list
+
+                
out.println(Ansi.ansi().a(Ansi.Attribute.INTENSITY_BOLD).a("COMMANDS").a(Ansi.Attribute.RESET));
+                for (Map.Entry<String,String> entry : commands.entrySet()) {
+                    out.print("        ");
+                    
out.println(Ansi.ansi().a(Ansi.Attribute.INTENSITY_BOLD).a(entry.getKey()).a(Ansi.Attribute.RESET));
+                    if (entry.getValue() != null) {
+                        DefaultActionPreparator.printFormatted("               
 ", entry.getValue(), term != null ? term.getTerminalWidth() : 80, out);
+                    }
+                }
+                out.println();
+            }
+            return null;
+        } else {
+            return session.execute(command + " --help");
+        }
+    }
+
+    protected Function unProxy(Function function) {
+        try {
+            if (function.getClass().getName().contains("CommandProxy")) {
+                Field contextField = 
function.getClass().getDeclaredField("context");
+                Field referenceField = 
function.getClass().getDeclaredField("reference");
+                contextField.setAccessible(true);
+                referenceField.setAccessible(true);
+                BundleContext context = (BundleContext) 
contextField.get(function);
+                ServiceReference reference = (ServiceReference) 
referenceField.get(function);
+                Object target = context.getService(reference);
+                try {
+                    if (target instanceof Function) {
+                        function = (Function) target;
+                    }
+                } finally {
+                    context.ungetService(reference);
+                }
+            }
+        } catch (Throwable t) {
+        }
+        return function;
+    }
+
+}

Modified: 
karaf/trunk/shell/commands/src/main/resources/META-INF/services/org/apache/karaf/shell/commands
URL: 
http://svn.apache.org/viewvc/karaf/trunk/shell/commands/src/main/resources/META-INF/services/org/apache/karaf/shell/commands?rev=992306&r1=992305&r2=992306&view=diff
==============================================================================
--- 
karaf/trunk/shell/commands/src/main/resources/META-INF/services/org/apache/karaf/shell/commands
 (original)
+++ 
karaf/trunk/shell/commands/src/main/resources/META-INF/services/org/apache/karaf/shell/commands
 Fri Sep  3 14:13:28 2010
@@ -4,6 +4,7 @@ org.apache.karaf.shell.commands.EachActi
 org.apache.karaf.shell.commands.EchoAction
 org.apache.karaf.shell.commands.ExecuteAction
 org.apache.karaf.shell.commands.GrepAction
+org.apache.karaf.shell.commands.HelpAction
 org.apache.karaf.shell.commands.HistoryAction
 org.apache.karaf.shell.commands.IfAction
 org.apache.karaf.shell.commands.JavaAction

Modified: 
karaf/trunk/shell/commands/src/main/resources/OSGI-INF/blueprint/shell-commands.xml
URL: 
http://svn.apache.org/viewvc/karaf/trunk/shell/commands/src/main/resources/OSGI-INF/blueprint/shell-commands.xml?rev=992306&r1=992305&r2=992306&view=diff
==============================================================================
--- 
karaf/trunk/shell/commands/src/main/resources/OSGI-INF/blueprint/shell-commands.xml
 (original)
+++ 
karaf/trunk/shell/commands/src/main/resources/OSGI-INF/blueprint/shell-commands.xml
 Fri Sep  3 14:13:28 2010
@@ -20,9 +20,16 @@
 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0";>
 
     <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0";>
+        <command name="*/help">
+            <action class="org.apache.karaf.shell.commands.HelpAction"/>
+        </command>
+
         <command name="shell/cat">
             <action class="org.apache.karaf.shell.commands.CatAction"/>
         </command>
+        <command name="shell/clear">
+            <action class="org.apache.karaf.shell.commands.ClearAction"/>
+        </command>
         <command name="shell/each">
             <action class="org.apache.karaf.shell.commands.EachAction"/>
         </command>
@@ -44,9 +51,6 @@
         <command name="shell/info">
             <action class="org.apache.karaf.shell.commands.InfoAction"/>
         </command>
-        <command name="shell/clear">
-            <action class="org.apache.karaf.shell.commands.ClearAction"/>
-        </command>
         <command name="shell/java">
             <action class="org.apache.karaf.shell.commands.JavaAction"/>
         </command>

Modified: 
karaf/trunk/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/SimpleCommand.java
URL: 
http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/SimpleCommand.java?rev=992306&r1=992305&r2=992306&view=diff
==============================================================================
--- 
karaf/trunk/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/SimpleCommand.java
 (original)
+++ 
karaf/trunk/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/SimpleCommand.java
 Fri Sep  3 14:13:28 2010
@@ -26,6 +26,9 @@ import org.osgi.service.command.Function
 import org.apache.felix.gogo.commands.Action;
 import org.apache.felix.gogo.commands.Command;
 
+/**
+ * A very simple {...@link Function} which creates {...@link Action} based on 
a class name.
+ */
 public class SimpleCommand extends AbstractCommand {
 
     private Class<? extends Action> actionClass;

Modified: 
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/Main.java
URL: 
http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/Main.java?rev=992306&r1=992305&r2=992306&view=diff
==============================================================================
--- 
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/Main.java
 (original)
+++ 
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/Main.java
 Fri Sep  3 14:13:28 2010
@@ -18,7 +18,13 @@
  */
 package org.apache.karaf.shell.console;
 
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.PrintStream;
 import java.lang.reflect.Method;
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -34,8 +40,6 @@ import org.apache.felix.gogo.commands.ba
 import org.apache.felix.gogo.runtime.lang.Support;
 import org.apache.felix.gogo.runtime.shell.CommandShellImpl;
 import org.apache.felix.gogo.runtime.threadio.ThreadIOImpl;
-import org.apache.karaf.shell.console.commands.Help;
-import org.apache.karaf.shell.console.completer.SimpleCommandsCompleter;
 import org.apache.karaf.shell.console.jline.Console;
 import org.apache.karaf.shell.console.jline.TerminalFactory;
 import org.fusesource.jansi.AnsiConsole;
@@ -77,24 +81,12 @@ public class Main {
             args = a;
         }
 
-        final SimpleCommandsCompleter completer = new 
SimpleCommandsCompleter(this);
-
-        // add top level help
-        Command helpCommand = Help.class.getAnnotation(Command.class);
-        Function helpFunction = new AbstractCommand() {
-            @Override
-            protected Action createNewAction() throws Exception {
-                return new Help(completer);
-            }
-        };
-        addCommand(helpCommand, helpFunction, commandProcessor, completer);
-
-        discoverCommands(commandProcessor, cl, completer);
+        discoverCommands(commandProcessor, cl);
 
         InputStream in = unwrap(System.in);
         PrintStream out = wrap(unwrap(System.out));
         PrintStream err = wrap(unwrap(System.err));
-        run(commandProcessor, args, in, out, err, completer);
+        run(commandProcessor, args, in, out, err);
 
         // TODO: do we need to stop the threadio that was started?
         // threadio.stop();
@@ -130,19 +122,18 @@ public class Main {
             args = a;
         }
 
-        SimpleCommandsCompleter completer = new SimpleCommandsCompleter(this);
-        discoverCommands(commandProcessor, cl, completer);
+        discoverCommands(commandProcessor, cl);
 
         InputStream in = parent.getKeyboard();
         PrintStream out = parent.getConsole();
         PrintStream err = parent.getConsole();
-        run(commandProcessor, args, in, out, err, completer);
+        run(commandProcessor, args, in, out, err);
     }
 
-    private void run(final CommandShellImpl commandProcessor, String[] args, 
final InputStream in, final PrintStream out, final PrintStream err, final 
Completer completer) throws Exception {
+    private void run(final CommandShellImpl commandProcessor, String[] args, 
final InputStream in, final PrintStream out, final PrintStream err) throws 
Exception {
         TerminalFactory terminalFactory = new TerminalFactory();
         Terminal terminal = terminalFactory.getTerminal();
-        Console console = createConsole(commandProcessor, in, out, err, 
terminal, completer);
+        Console console = createConsole(commandProcessor, in, out, err, 
terminal);
         CommandSession session = console.getSession();
         session.put("USER", user);
         session.put("APPLICATION", application);
@@ -177,8 +168,8 @@ public class Main {
      * @return
      * @throws Exception
      */
-    protected Console createConsole(CommandShellImpl commandProcessor, 
InputStream in, PrintStream out, PrintStream err, Terminal terminal, Completer 
completer) throws Exception {
-        return new Console(commandProcessor, in, out, err, terminal, 
completer, null);
+    protected Console createConsole(CommandShellImpl commandProcessor, 
InputStream in, PrintStream out, PrintStream err, Terminal terminal) throws 
Exception {
+        return new Console(commandProcessor, in, out, err, terminal, null);
     }
 
     /**
@@ -191,7 +182,7 @@ public class Main {
         return "META-INF/services/org/apache/karaf/shell/commands";
     }
 
-    private void discoverCommands(CommandShellImpl commandProcessor, 
ClassLoader cl, SimpleCommandsCompleter completer) throws IOException, 
ClassNotFoundException {
+    private void discoverCommands(CommandShellImpl commandProcessor, 
ClassLoader cl) throws IOException, ClassNotFoundException {
         Enumeration<URL> urls = cl.getResources(getDiscoveryResource());
         while (urls.hasMoreElements()) {
             URL url = urls.nextElement();
@@ -208,7 +199,7 @@ public class Main {
                             return ((Class<? extends Action>) 
actionClass).newInstance();
                         }
                     };
-                    addCommand(cmd, function, commandProcessor, completer);
+                    addCommand(cmd, function, commandProcessor);
                 }
                 line = r.readLine();
             }
@@ -216,10 +207,9 @@ public class Main {
         }
     }
 
-    protected void addCommand(Command cmd, Function function, CommandShellImpl 
commandProcessor, SimpleCommandsCompleter completer) {
+    protected void addCommand(Command cmd, Function function, CommandShellImpl 
commandProcessor) {
         try {
             commandProcessor.addCommand(cmd.scope(), function, cmd.name());
-            completer.addCommand(cmd, function);
         } catch (Exception e) {
         }
     }

Modified: 
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java
URL: 
http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java?rev=992306&r1=992305&r2=992306&view=diff
==============================================================================
--- 
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java
 (original)
+++ 
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java
 Fri Sep  3 14:13:28 2010
@@ -18,89 +18,97 @@
  */
 package org.apache.karaf.shell.console.completer;
 
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.HashSet;
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 
-import org.apache.karaf.shell.console.Completer;
+import org.apache.felix.gogo.commands.basic.AbstractCommand;
+import org.apache.felix.gogo.runtime.shell.CommandProxy;
+import org.apache.felix.gogo.runtime.shell.CommandSessionImpl;
 import org.apache.karaf.shell.console.CompletableFunction;
-import org.osgi.framework.ServiceReference;
+import org.apache.karaf.shell.console.Completer;
 import org.osgi.framework.BundleContext;
-import org.osgi.service.command.CommandProcessor;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.command.CommandSession;
+import org.osgi.service.command.Function;
 
+/**
+ * Like the {...@link 
org.apache.karaf.shell.console.completer.CommandsCompleter} but does not use 
OSGi but is
+ * instead used from the non-OSGi {...@link 
org.apache.karaf.shell.console.Main}
+ */
 public class CommandsCompleter implements Completer {
 
-    private final Map<ServiceReference, Completer> completers = new 
ConcurrentHashMap<ServiceReference, Completer>();
+    private CommandSession session;
+    private final List<Completer> completers = new ArrayList<Completer>();
+    private final Set<String> commands = new HashSet<String>();
+
+    public CommandsCompleter(CommandSession session) {
+        this.session = session;
+    }
 
-    private BundleContext bundleContext;
 
-    public void setBundleContext(BundleContext bundleContext) {
-        this.bundleContext = bundleContext;
+    public int complete(String buffer, int cursor, List<String> candidates) {
+        checkData();
+        int res = new AggregateCompleter(completers).complete(buffer, cursor, 
candidates);
+        Collections.sort(candidates);
+        return res;
     }
 
-    public void register(ServiceReference reference) {
-        Set<String> functions = getNames(reference);
-        if (functions != null) {
-            List<Completer> cl = new ArrayList<Completer>();
-            cl.add(new StringsCompleter(functions));
-            try {
-                Object function = bundleContext.getService(reference);
-                if (function instanceof CompletableFunction) {
-                    List<Completer> fcl = ((CompletableFunction) 
function).getCompleters();
-                    if (fcl != null) {
-                        for (Completer c : fcl) {
-                            cl.add(c == null ? NullCompleter.INSTANCE : c);
+    protected synchronized void checkData() {
+        Set<String> names = (Set<String>) 
session.get(CommandSessionImpl.COMMANDS);
+        if (!names.equals(commands)) {
+            commands.clear();
+            completers.clear();
+            for (String command : names) {
+                Function function = (Function) session.get(command);
+                function = unProxy(function);
+                if (function instanceof AbstractCommand) {
+                    List<Completer> cl = new ArrayList<Completer>();
+                    cl.add(new StringsCompleter(new String[] { command }));
+                    if (function instanceof CompletableFunction) {
+                        List<Completer> fcl = ((CompletableFunction) 
function).getCompleters();
+                        if (fcl != null) {
+                            for (Completer c : fcl) {
+                                cl.add(c == null ? NullCompleter.INSTANCE : c);
+                            }
+                        } else {
+                            cl.add(NullCompleter.INSTANCE);
                         }
                     } else {
                         cl.add(NullCompleter.INSTANCE);
                     }
-                } else {
-                    cl.add(NullCompleter.INSTANCE);
+                    completers.add(new ArgumentCompleter(cl));
                 }
-            } finally {
-                bundleContext.ungetService(reference);
+                commands.add(command);
             }
-            ArgumentCompleter c = new ArgumentCompleter(cl);
-            completers.put(reference, c);
-        }
-    }
-
-    public void unregister(ServiceReference reference) {
-        if (reference != null) {
-            completers.remove(reference);
         }
     }
 
-    private Set<String> getNames(ServiceReference reference) {
-        Set<String> names = new HashSet<String>();
-        Object scope = reference.getProperty(CommandProcessor.COMMAND_SCOPE);
-        Object function = 
reference.getProperty(CommandProcessor.COMMAND_FUNCTION);
-        if(scope != null && function != null)
-        {
-            if (function.getClass().isArray())
-            {
-                for (Object f : ((Object[]) function))
-                {
-                    names.add(scope + ":" + f.toString());
+    protected Function unProxy(Function function) {
+        try {
+            if (function instanceof CommandProxy) {
+                Field contextField = 
function.getClass().getDeclaredField("context");
+                Field referenceField = 
function.getClass().getDeclaredField("reference");
+                contextField.setAccessible(true);
+                referenceField.setAccessible(true);
+                BundleContext context = (BundleContext) 
contextField.get(function);
+                ServiceReference reference = (ServiceReference) 
referenceField.get(function);
+                Object target = context.getService(reference);
+                try {
+                    if (target instanceof Function) {
+                        function = (Function) target;
+                    }
+                } finally {
+                    context.ungetService(reference);
                 }
             }
-            else
-            {
-                names.add(scope + ":" + function.toString());
-            }
-            return names;
+        } catch (Throwable t) {
         }
-        return null;
+        return function;
     }
 
-    public int complete(String buffer, int cursor, List<String> candidates) {
-        int res =  new 
AggregateCompleter(completers.values()).complete(buffer, cursor, candidates);
-        Collections.sort(candidates);
-        return res;
-    }
 }
 

Modified: 
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java
URL: 
http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java?rev=992306&r1=992305&r2=992306&view=diff
==============================================================================
--- 
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java
 (original)
+++ 
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java
 Fri Sep  3 14:13:28 2010
@@ -43,6 +43,7 @@ import jline.UnsupportedTerminal;
 import org.apache.karaf.shell.console.CloseShellException;
 import org.apache.karaf.shell.console.Completer;
 import org.apache.karaf.shell.console.completer.AggregateCompleter;
+import org.apache.karaf.shell.console.completer.CommandsCompleter;
 import org.apache.karaf.shell.console.completer.SessionScopeCompleter;
 import org.fusesource.jansi.Ansi;
 import org.osgi.service.command.CommandProcessor;
@@ -81,7 +82,6 @@ public class Console implements Runnable
                    PrintStream out,
                    PrintStream err,
                    Terminal term,
-                   Completer completer,
                    Runnable closeCallback) throws Exception
     {
         this.in = in;
@@ -103,17 +103,9 @@ public class Console implements Runnable
         file.getParentFile().mkdirs();
         reader.getHistory().setHistoryFile(file);
         session.put(".jline.history", reader.getHistory());
+        Completer completer = createCompleter();
         if (completer != null) {
-            reader.addCompletor(
-                new CompleterAsCompletor(
-                    new AggregateCompleter(
-                        Arrays.asList(
-                            completer,
-                            new SessionScopeCompleter( session, completer )
-                        )
-                    )
-                )
-            );
+            reader.addCompletor(new CompleterAsCompletor(completer));
         }
         if (Boolean.getBoolean("jline.nobell")) {
             reader.setBellEnabled(false);
@@ -249,6 +241,16 @@ public class Console implements Runnable
         }
     }
 
+    protected Completer createCompleter() {
+        Completer completer = new CommandsCompleter(session);
+        return new AggregateCompleter(
+                    Arrays.asList(
+                        completer,
+                        new SessionScopeCompleter( session, completer )
+                    )
+                );
+    }
+
     protected Properties loadBrandingProperties() {
         Properties props = new Properties();
         loadProps(props, "org/apache/karaf/shell/console/branding.properties");

Modified: 
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/ConsoleFactory.java
URL: 
http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/ConsoleFactory.java?rev=992306&r1=992305&r2=992306&view=diff
==============================================================================
--- 
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/ConsoleFactory.java
 (original)
+++ 
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/ConsoleFactory.java
 Fri Sep  3 14:13:28 2010
@@ -37,7 +37,6 @@ public class ConsoleFactory {
 
     private BundleContext bundleContext;
     private CommandProcessor commandProcessor;
-    private List<Completer> completers;
     private TerminalFactory terminalFactory;
     private Console console;
     private boolean start;
@@ -56,10 +55,6 @@ public class ConsoleFactory {
         stop();
     }
 
-    public void setCompleters(List<Completer> completers) {
-        this.completers = completers;
-    }
-
     public void setTerminalFactory(TerminalFactory terminalFactory) {
         this.terminalFactory = terminalFactory;
     }
@@ -88,7 +83,6 @@ public class ConsoleFactory {
                                        wrap(out),
                                        wrap(err),
                                        terminal,
-                                       new AggregateCompleter(completers),
                                        callback);
             CommandSession session = console.getSession();
             session.put("USER", "karaf");

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=992306&r1=992305&r2=992306&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 Sep  3 14:13:28 2010
@@ -32,25 +32,9 @@
                             unbind-method="unregisterCommandProcessor"/>
     </reference>
 
-    <reference-list id="functions" 
filter="(&amp;(osgi.command.scope=*)(osgi.command.function=*))"
-                    availability="optional">
-        <reference-listener ref="commandCompleter"
-                            bind-method="register"
-                            unbind-method="unregister"/>
-    </reference-list>
-
-    <bean id="commandCompleter" 
class="org.apache.karaf.shell.console.completer.CommandsCompleter">
-        <property name="bundleContext" ref="blueprintBundleContext"/>
-    </bean>
-
     <bean id="consoleFactory" 
class="org.apache.karaf.shell.console.jline.ConsoleFactory">
         <property name="start" value="$[karaf.startLocalConsole]"/>
         <property name="bundleContext" ref="blueprintBundleContext"/>
-        <property name="completers">
-            <list>
-                <ref component-id="commandCompleter"/>
-            </list>
-        </property>
         <property name="terminalFactory" ref="terminalFactory"/>
     </bean>
 

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=992306&r1=992305&r2=992306&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 Sep  3 14:13:28 2010
@@ -46,8 +46,8 @@ public class ExampleSubclassMain extends
     }
 
     @Override
-    protected Console createConsole(CommandShellImpl commandProcessor, 
InputStream in, PrintStream out, PrintStream err, Terminal terminal, Completer 
completer) throws Exception {
-        return new Console(commandProcessor, in, out, err, terminal, 
completer, null) {
+    protected Console createConsole(CommandShellImpl commandProcessor, 
InputStream in, PrintStream out, PrintStream err, Terminal terminal) throws 
Exception {
+        return new Console(commandProcessor, in, out, err, terminal, null) {
 
             /**
              * If you don't overwrite, then karaf will use the welcome message 
found in the

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=992306&r1=992305&r2=992306&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 Sep  3 14:13:28 2010
@@ -52,16 +52,11 @@ import org.osgi.service.command.CommandS
 public class ShellFactoryImpl implements Factory<Command>
 {
     private CommandProcessor commandProcessor;
-    private List<Completer> completers;
 
     public void setCommandProcessor(CommandProcessor commandProcessor) {
         this.commandProcessor = commandProcessor;
     }
 
-    public void setCompleters(List<Completer> completers) {
-        this.completers = completers;
-    }
-
     public Command create() {
         return new ShellImpl();
     }
@@ -102,7 +97,6 @@ public class ShellFactoryImpl implements
                                               new PrintStream(new 
LfToCrLfFilterOutputStream(out), true),
                                               new PrintStream(new 
LfToCrLfFilterOutputStream(err), true),
                                               terminal,
-                                              new 
AggregateCompleter(completers),
                                               new Runnable() {
                                                   public void run() {
                                                       destroy();

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=992306&r1=992305&r2=992306&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 Sep  3 14:13:28 2010
@@ -67,11 +67,6 @@
         <property name="host" value="${sshHost}"/>
         <property name="shellFactory">
             <bean class="org.apache.karaf.shell.ssh.ShellFactoryImpl">
-                <property name="completers">
-                    <list>
-                        <ref component-id="commandCompleter"/>
-                    </list>
-                </property>
                 <property name="commandProcessor" ref="commandProcessor"/>
             </bean>
         </property>
@@ -107,8 +102,4 @@
                             unbind-method="unregister"/>
     </reference-list>
 
-    <bean id="commandCompleter" 
class="org.apache.karaf.shell.console.completer.CommandsCompleter">
-        <property name="bundleContext" ref="blueprintBundleContext" />
-    </bean>
-
 </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=992306&r1=992305&r2=992306&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 Sep  3 14:13:28 2010
@@ -71,8 +71,6 @@ public class GogoPlugin extends Abstract
 
     private CommandProcessor commandProcessor;
 
-    private List<Completer> completers;
-
     public void setBundleContext(BundleContext bundleContext)
     {
         this.bundleContext = bundleContext;
@@ -83,11 +81,6 @@ public class GogoPlugin extends Abstract
         this.commandProcessor = commandProcessor;
     }
 
-    public void setCompleters(List<Completer> completers)
-    {
-        this.completers = completers;
-    }
-
     /*
     * Blueprint lifecycle callback methods
     */
@@ -213,7 +206,6 @@ public class GogoPlugin extends Abstract
                                       pipedOut,
                                       pipedOut,
                                       new WebTerminal(TERM_WIDTH, TERM_HEIGHT),
-                                      new AggregateCompleter(completers),
                                       null);
                 CommandSession session = console.getSession();
                 session.put("APPLICATION", System.getProperty("karaf.name", 
"root"));

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=992306&r1=992305&r2=992306&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 Sep  3 14:13:28 2010
@@ -38,10 +38,6 @@
                             unbind-method="unregister"/>
     </reference-list>
 
-    <bean id="commandCompleter" 
class="org.apache.karaf.shell.console.completer.CommandsCompleter">
-        <property name="bundleContext" ref="blueprintBundleContext" />
-    </bean>
-
     <service ref="gogoPlugin" interface="javax.servlet.Servlet" >
         <service-properties>
             <entry key="felix.webconsole.label" value="gogo"/>


Reply via email to