Author: lenzi
Date: Sun Sep  9 16:45:46 2007
New Revision: 574104

URL: http://svn.apache.org/viewvc?rev=574104&view=rev
Log:
enhancing Shell TUI with jline library

Added:
    
felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/completor/
    
felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/completor/BundleCentricCommandCompletor.java
    
felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/completor/DynamicMultiCompletor.java
    
felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/completor/ShellCommandCompletor.java
    
felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/completor/VersionCommandCompletor.java
    
felix/sandbox/lenzi/shell/src/main/java/org/apache/felix/shell/CommandCompletor.java
Modified:
    felix/sandbox/lenzi/shell.tui/pom.xml
    
felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/Activator.java
    felix/sandbox/lenzi/shell/pom.xml

Modified: felix/sandbox/lenzi/shell.tui/pom.xml
URL: 
http://svn.apache.org/viewvc/felix/sandbox/lenzi/shell.tui/pom.xml?rev=574104&r1=574103&r2=574104&view=diff
==============================================================================
--- felix/sandbox/lenzi/shell.tui/pom.xml (original)
+++ felix/sandbox/lenzi/shell.tui/pom.xml Sun Sep  9 16:45:46 2007
@@ -38,8 +38,13 @@
     <dependency>
       <groupId>${pom.groupId}</groupId>
       <artifactId>org.apache.felix.shell</artifactId>
-      <version>1.1.0-SNAPSHOT</version>
+      <version>1.2.0+lenzi-SNAPSHOT</version>
     </dependency>
+    <dependency>
+      <groupId>jline</groupId>
+      <artifactId>jline</artifactId>
+      <version>0.9.91</version>
+    </dependency>
   </dependencies>
   <build>
     <plugins>
@@ -51,11 +56,13 @@
         <configuration>
           <instructions>
             <Private-Package>org.apache.felix.shell.tui.*</Private-Package>
-            
<Bundle-Activator>org.apache.felix.shell.tui.Activator</Bundle-Activator>
+            
<Bundle-Activator>org.apache.felix.shell.tui.Activator</Bundle-Activator>
+            <Bundle-Version>1.2.0</Bundle-Version>            
             
<Bundle-DocURL>http://oscar-osgi.sf.net/obr2/${pom.artifactId}/</Bundle-DocURL>
             
<Bundle-Url>http://oscar-osgi.sf.net/obr2/${pom.artifactId}/${pom.artifactId}-${pom.version}.jar</Bundle-Url>
             
<Bundle-Source>http://oscar-osgi.sf.net/obr2/${pom.artifactId}/${pom.artifactId}-${pom.version}-src.jar</Bundle-Source>
-            <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
+            <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
+            <Private-Package>org.apache.felix.shell.tui.*</Private-Package>
             
<Import-Service>org.apache.felix.shell.ShellService</Import-Service>
           </instructions>
         </configuration>

Modified: 
felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/Activator.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/Activator.java?rev=574104&r1=574103&r2=574104&view=diff
==============================================================================
--- 
felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/Activator.java
 (original)
+++ 
felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/Activator.java
 Sun Sep  9 16:45:46 2007
@@ -19,13 +19,20 @@
 package org.apache.felix.shell.tui;
 
 import java.io.*;
+import java.util.Iterator;
 
+import jline.Completor;
+import jline.ConsoleReader;
+
+import org.apache.felix.shell.CommandCompletor;
 import org.apache.felix.shell.ShellService;
+import org.apache.felix.shell.tui.completor.DynamicMultiCompletor;
+import org.apache.felix.shell.tui.completor.ShellCommandCompletor;
 import org.osgi.framework.*;
 
 public class Activator implements BundleActivator
 {
-    private BundleContext m_context = null;
+    static public BundleContext m_context;
     private ShellTuiRunnable m_runnable = null;
     private Thread m_thread = null;
     private ServiceReference m_shellRef = null;
@@ -113,10 +120,35 @@
             m_thread.interrupt();
         }
     }
+    
+    private class UnifiedReader
+    {
+       private ConsoleReader cr = null;
+       private BufferedReader br = null;
+       
+       public UnifiedReader(BufferedReader br) {
+                       this.br = br;
+               }
+
+       public UnifiedReader(ConsoleReader cr) {
+                       this.cr = cr;
+               }
+       
+               public String readLine() throws IOException{
+                       if(br != null)
+                               return br.readLine();
+                       if(cr != null)
+                               return cr.readLine();
+                       return null;
+               }
+    }
 
-    private class ShellTuiRunnable implements Runnable
+    private class ShellTuiRunnable implements Runnable, ServiceListener
     {
         private boolean stop = false;
+        private ConsoleReader console = null;
+               private ShellCommandCompletor completorProvider = null;
+               private DynamicMultiCompletor completor;
 
         public void stop()
         {
@@ -125,9 +157,17 @@
 
         public void run()
         {
+               UnifiedReader in = initializeConsoleReader();
             String line = null;
-            BufferedReader in = new BufferedReader(new 
InputStreamReader(System.in));
-
+            if(in == null)
+            {
+               in = new UnifiedReader(new BufferedReader(new 
InputStreamReader(System.in)));
+            }
+            else
+            {
+               completorProvider  = new ShellCommandCompletor();
+               completorProvider.start();              
+            }
             while (!stop)
             {
                 System.out.print("-> ");
@@ -173,6 +213,122 @@
                     }
                 }
             }
+            if(console!=null)
+            {
+               completorProvider.stop();
+               
+               /*
+                * The following clean steps must be perfoemed:
+                * A - remove the service listener 
+                * B - remove reference to service which we'll release
+                * C - release all the service  
+                */
+               synchronized (console) {
+                       //Phase A: Removing service listener
+                       m_context.removeServiceListener(this);
+                       
+                       //Phase B: Removing reference to service
+                       for (Iterator i = console.getCompletors().iterator(); 
i.hasNext();) {
+                                               Completor c = (Completor) 
i.next();
+                                               completor.removeCompletor(c);
+                                       }
+                       
+                       //Phase C: Releasing all service
+                       ServiceReference[] completorsReference = null;
+                               try {
+                                       completorsReference = 
m_context.getAllServiceReferences(
+                                                       
org.apache.felix.shell.CommandCompletor.class.getName(), null
+                                       );                                      
+                               } catch (InvalidSyntaxException ignore) {       
                                
+                               }
+                               
+                               for (int i = 0; i < completorsReference.length; 
i++) {
+                                       
m_context.ungetService(completorsReference[i]);
+                               }
+                                       
+                               }
+               
+            }
         }
+
+               private UnifiedReader initializeConsoleReader() {
+            console = null;
+            completor = new DynamicMultiCompletor();
+                       try {
+                               console = new ConsoleReader();
+                               console.addCompletor(completor);
+                       } catch (IOException e) {
+                               e.printStackTrace();
+                               return null;
+                       }
+                       
+                       try
+               {
+                   m_context.addServiceListener(this,
+                       "(objectClass="
+                       + 
org.apache.felix.shell.CommandCompletor.class.getName()
+                       + ")");             
+               }
+               catch (InvalidSyntaxException ex)
+               {
+                   System.err.println("ShellTui: Cannot add service 
listener.");
+                   System.err.println("ShellTui: " + ex);
+               }
+
+               synchronized (console) {
+                       ServiceReference[] completors = null;
+                               try {
+                                       completors = 
m_context.getAllServiceReferences(
+                                                       
org.apache.felix.shell.CommandCompletor.class.getName(), null
+                                       );                                      
+                               } catch (InvalidSyntaxException ignore) {
+                                       
+                               }
+
+                               if(completors == null)
+                                       return new UnifiedReader(console);
+                               
+                               for (int i = 0; i < completors.length; i++) {
+                                       CommandCompletor cc = 
(CommandCompletor) m_context.getService(completors[i]);
+                                       completor.addCompletor(cc);
+                               }
+                       }
+                               
+                       return new UnifiedReader(console);
+               }
+
+               public void serviceChanged(ServiceEvent event) {
+                       StringBuffer msg = new StringBuffer();
+                       switch (event.getType()) {
+                               case ServiceEvent.REGISTERED:
+                               {
+                                       msg.append("Service REGISTERED");
+                                       ServiceReference incoming = 
event.getServiceReference();
+                                       CommandCompletor cc = 
(CommandCompletor) m_context.getService(incoming);
+                                       synchronized (console) {
+                                               completor.addCompletor(cc);
+                                       }
+                               }
+                               break;
+       
+                               case ServiceEvent.MODIFIED:
+                                       msg.append("Service MODIFIED");
+                               break;
+                               
+                               case ServiceEvent.UNREGISTERING:
+                               {
+                                       msg.append("Service UNREGISTERED");
+                                       ServiceReference leaving = 
event.getServiceReference();
+                                       synchronized (console) {
+                                               
completor.removeCompletor((Completor) m_context.getService(leaving));
+                                       }
+                                       
m_context.ungetService(event.getServiceReference());
+                               }
+                               break;
+                       }
+                       msg.append(" from 
").append(event.getServiceReference().getBundle().getHeaders().get(Constants.BUNDLE_NAME));
+                       msg.append(" with ID 
").append(event.getServiceReference().getProperty(Constants.SERVICE_ID));       
           
+                       System.err.println(msg.toString());
+               }
     }
 }

Added: 
felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/completor/BundleCentricCommandCompletor.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/completor/BundleCentricCommandCompletor.java?rev=574104&view=auto
==============================================================================
--- 
felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/completor/BundleCentricCommandCompletor.java
 (added)
+++ 
felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/completor/BundleCentricCommandCompletor.java
 Sun Sep  9 16:45:46 2007
@@ -0,0 +1,80 @@
+/* 
+ * 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.felix.shell.tui.completor;
+
+import java.util.List;
+
+import jline.ArgumentCompletor;
+import jline.ArgumentCompletor.ArgumentList;
+
+import org.apache.felix.shell.CommandCompletor;
+import org.apache.felix.shell.tui.Activator;
+import org.osgi.framework.Bundle;
+
+public class BundleCentricCommandCompletor implements CommandCompletor 
+{
+       //TODO Use a cache for bundle list and status
+       
+       final private String name;
+       final private int status;
+       
+       public BundleCentricCommandCompletor(final String name, final int 
status) {
+               this.name = name;
+               this.status = status;
+       }
+
+       public int complete(String buffer, int cursor, List candidates) {
+               try{
+                       StringBuffer msg = new StringBuffer();
+                       msg.append("BundleCentricCommandCompletor "+name+": 
").append(buffer).append('@').append(cursor).append("\r\n");
+                       
+                       ArgumentCompletor.AbstractArgumentDelimiter delimiter = 
+                               new 
ArgumentCompletor.WhitespaceArgumentDelimiter();
+                       
+                       ArgumentList argumentList = delimiter.delimit(buffer, 
cursor);
+                       msg.append("ArgList: 
ArgumentPosition=").append(argumentList.getArgumentPosition());
+                       msg.append(" 
CursorArgumentIndex=").append(argumentList.getCursorArgumentIndex());
+                       msg.append(" 
BufferPosition=").append(argumentList.getBufferPosition());
+                       msg.append(" 
CursorArgument=").append(argumentList.getCursorArgument());
+                       System.err.println(msg);
+       
+                       if(argumentList.getCursorArgumentIndex()==0){
+                               final String arg = 
argumentList.getCursorArgument();
+                               if(arg==null || name.startsWith(arg))
+                                       candidates.add(name);
+                       }else if(argumentList.getCursorArgumentIndex()>0){
+                               String arg = argumentList.getCursorArgument();
+                               final Bundle[] bundles = 
Activator.m_context.getBundles();
+                               for (int i = 0; i < bundles.length; i++) {
+                                       final String bundleId = 
Long.toString(bundles[i].getBundleId());
+                                       if ( (bundles[i].getState() & status) > 
0 
+                                                       && (arg==null || 
bundleId.startsWith(arg)))
+                                       {
+                                               candidates.add(buffer+bundleId);
+                                       }                                       
        
+                               }
+                       }
+                       return 0;
+               }catch (Throwable e) {
+                       e.printStackTrace();
+                       return -1;
+               }
+       }
+
+}
\ No newline at end of file

Added: 
felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/completor/DynamicMultiCompletor.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/completor/DynamicMultiCompletor.java?rev=574104&view=auto
==============================================================================
--- 
felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/completor/DynamicMultiCompletor.java
 (added)
+++ 
felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/completor/DynamicMultiCompletor.java
 Sun Sep  9 16:45:46 2007
@@ -0,0 +1,55 @@
+package org.apache.felix.shell.tui.completor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import jline.Completor;
+import jline.MultiCompletor;
+
+public class DynamicMultiCompletor implements Completor{
+
+       final protected ArrayList completors; 
+       boolean dirty = false;
+       private MultiCompletor multi;
+       
+       public DynamicMultiCompletor() {
+               multi = new MultiCompletor();
+               completors = new ArrayList();
+       }
+
+       public DynamicMultiCompletor(Completor[] completors) {
+               multi = new MultiCompletor(completors);
+               this.completors = new ArrayList();
+               for (int i = 0; i < completors.length; i++) {
+                       this.completors.add(completors[i]);
+               }
+       }
+
+       public DynamicMultiCompletor(List completors) {
+               multi = new MultiCompletor(completors);
+               this.completors = new ArrayList (completors);
+       }
+       
+       public boolean addCompletor(Completor c){
+               boolean flag;
+               flag = completors.add(c);
+               dirty = flag == true;
+               return flag;
+       }
+
+       public boolean removeCompletor(Completor c){
+               boolean flag;
+               flag = completors.remove(c);
+               dirty = flag == true;
+               return flag;
+       }
+
+       public int complete(String buffer, int pos, List cand) {
+               if(dirty){
+                       multi = new MultiCompletor(completors);
+               }
+               return multi.complete(buffer, pos, cand);
+       }
+       
+       
+}

Added: 
felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/completor/ShellCommandCompletor.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/completor/ShellCommandCompletor.java?rev=574104&view=auto
==============================================================================
--- 
felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/completor/ShellCommandCompletor.java
 (added)
+++ 
felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/completor/ShellCommandCompletor.java
 Sun Sep  9 16:45:46 2007
@@ -0,0 +1,183 @@
+/* 
+ * 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.felix.shell.tui.completor;
+
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Properties;
+import java.util.Map.Entry;
+
+import org.apache.felix.shell.Command;
+import org.apache.felix.shell.CommandCompletor;
+import org.apache.felix.shell.tui.Activator;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+
+
+public class ShellCommandCompletor implements ServiceListener
+{      
+       final private Hashtable completors;
+       
+       public ShellCommandCompletor()
+       {
+               completors = new Hashtable();
+       }
+       
+       public void start()
+       {
+               try {
+               Activator.m_context.addServiceListener(this,
+                       "(|(objectClass="
+                       + org.apache.felix.shell.Command.class.getName()
+                       + ")(objectClass="
+                       + 
org.ungoverned.osgi.service.shell.Command.class.getName()
+                       + "))");
+        }
+        catch (InvalidSyntaxException ex)
+        {
+            System.err.println("Activator: Cannot register service listener.");
+            System.err.println("Activator: " + ex);
+               }
+        init();                
+       }
+       
+       public void stop()
+       {
+               Activator.m_context.removeServiceListener(this);
+               for (Iterator i = completors.entrySet().iterator(); 
i.hasNext();) {
+                       Entry e = (Entry) i.next();
+                       ((ServiceRegistration) e.getValue()).unregister();
+               }
+       }
+       
+    private synchronized void init()
+    {
+       ServiceReference commandReferences[] = null;
+       try {
+                       commandReferences = 
Activator.m_context.getAllServiceReferences(
+                                       
org.apache.felix.shell.Command.class.getName(), null
+                                       );
+               } catch (InvalidSyntaxException ignore) {
+               }
+               if(commandReferences!=null) {
+                       for (int i = 0; i < commandReferences.length; i++) {
+                               Command c = (Command) 
Activator.m_context.getService(commandReferences[i]);
+                               installCommandCompletor(
+                                               
((Long)commandReferences[i].getProperty(Constants.SERVICE_ID)).toString(), 
+                                               c.getName()
+                               );
+                               
Activator.m_context.ungetService(commandReferences[i]);
+                       }
+               }
+
+       try {
+                       commandReferences = 
Activator.m_context.getAllServiceReferences(
+                                       
org.ungoverned.osgi.service.shell.Command.class.getName(), null
+                                       );
+               } catch (InvalidSyntaxException ignore) {
+               }
+               if(commandReferences!=null) {
+                       for (int i = 0; i < commandReferences.length; i++) {
+                               org.ungoverned.osgi.service.shell.Command c = 
(org.ungoverned.osgi.service.shell.Command) 
+                               
Activator.m_context.getService(commandReferences[i]);
+                               installCommandCompletor(
+                                               
((Long)commandReferences[i].getProperty(Constants.SERVICE_ID)).toString(), 
+                                               c.getName()
+                               );
+                               
Activator.m_context.ungetService(commandReferences[i]);
+                       }
+               }
+    }
+    
+    private synchronized void installCommandCompletor(String id, String name)
+    {
+               System.err.println("Creating CommandCompletor SERVICE for 
"+name+"@"+id);
+       
+       CommandCompletor service = null;
+       if("start".equals(name)){
+               service = new 
BundleCentricCommandCompletor("start",(Bundle.RESOLVED + Bundle.INSTALLED));
+       }else if("stop".equals(name)){
+               service = new BundleCentricCommandCompletor("stop", 
Bundle.ACTIVE);
+       }else if("update".equals(name)){
+               service = new 
BundleCentricCommandCompletor("update",(Bundle.RESOLVED + Bundle.INSTALLED + 
Bundle.ACTIVE));
+       //}else if("uninstall".equals(name)){
+        //     service = new 
BundleCentricCommandCompletor("uninstall",(Bundle.RESOLVED + Bundle.INSTALLED + 
Bundle.ACTIVE));
+       }else if("version".equals(name)){
+               service = new VersionCommandCompletor();
+       }
+       if(service!=null){
+               System.err.println("CommandCompletor SERVICE for 
"+name+"@"+id+" CREATED");
+               Properties prop = new Properties();
+               prop.put(CommandCompletor.COMMAND_ID, id);
+               prop.put(CommandCompletor.COMMAND_NAME, name);
+               ServiceRegistration reg =  Activator.m_context.registerService(
+                               CommandCompletor.class.getName(), service, prop 
+               );
+               System.err.println("CommandCompletor SERVICE for 
"+name+"@"+id+" REGISTERED");
+               completors.put(id, reg);                
+       }
+    }
+
+    private synchronized void removeCommandCompletor(String id){
+       ServiceRegistration reg = (ServiceRegistration) completors.get(id);
+       if(reg != null) reg.unregister();       
+    }
+
+       public void serviceChanged(ServiceEvent event) {
+               StringBuffer msg = new StringBuffer();          
+               switch (event.getType()) {
+                       case ServiceEvent.REGISTERED:
+                       {
+                               msg.append("Service REGISTERED");               
                
+                               ServiceReference installing = 
event.getServiceReference();
+                               Object command = 
Activator.m_context.getService(installing);
+                               String name = null;
+                               if (command instanceof Command) {
+                                       Command cmd = (Command) command;
+                                       name = cmd.getName();
+                               }else if (command instanceof 
org.ungoverned.osgi.service.shell.Command) {
+                                       
org.ungoverned.osgi.service.shell.Command cmd = 
+                                               
(org.ungoverned.osgi.service.shell.Command) command;
+                                       name = cmd.getName();
+                               }
+                               installCommandCompletor(
+                                               ((Long) 
installing.getProperty(Constants.SERVICE_ID)).toString(), 
+                                               name
+                               );
+                               Activator.m_context.ungetService(installing);
+                       }break;
+                       case ServiceEvent.UNREGISTERING:
+                       {
+                               msg.append("Service UNREGISTERED");             
                
+                               ServiceReference removing = 
event.getServiceReference();
+                               removeCommandCompletor(
+                                               ((Long) 
removing.getProperty(Constants.SERVICE_ID)).toString()
+                               );
+                       }break;
+               }
+               msg.append(" from 
").append(event.getServiceReference().getBundle().getHeaders().get(Constants.BUNDLE_NAME));
+               msg.append(" with ID 
").append(event.getServiceReference().getProperty(Constants.SERVICE_ID));       
           
+               System.err.println(msg.toString());             
+       }
+}
\ No newline at end of file

Added: 
felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/completor/VersionCommandCompletor.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/completor/VersionCommandCompletor.java?rev=574104&view=auto
==============================================================================
--- 
felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/completor/VersionCommandCompletor.java
 (added)
+++ 
felix/sandbox/lenzi/shell.tui/src/main/java/org/apache/felix/shell/tui/completor/VersionCommandCompletor.java
 Sun Sep  9 16:45:46 2007
@@ -0,0 +1,35 @@
+/* 
+ * 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.felix.shell.tui.completor;
+
+import java.util.List;
+
+import jline.SimpleCompletor;
+
+import org.apache.felix.shell.CommandCompletor;
+
+public class VersionCommandCompletor implements CommandCompletor 
+{
+       private final SimpleCompletor completor = new 
SimpleCompletor("version"); 
+
+       public int complete(String buffer, int cursor, List candidates) {
+               return completor.complete(buffer, cursor, candidates);
+       }
+
+}
\ No newline at end of file

Modified: felix/sandbox/lenzi/shell/pom.xml
URL: 
http://svn.apache.org/viewvc/felix/sandbox/lenzi/shell/pom.xml?rev=574104&r1=574103&r2=574104&view=diff
==============================================================================
--- felix/sandbox/lenzi/shell/pom.xml (original)
+++ felix/sandbox/lenzi/shell/pom.xml Sun Sep  9 16:45:46 2007
@@ -33,8 +33,14 @@
     <dependency>
       <groupId>${pom.groupId}</groupId>
       <artifactId>org.osgi.core</artifactId>
-      <version>1.1.0-SNAPSHOT</version>
+      <version>1.1.0-SNAPSHOT</version>
+      <scope>provided</scope>
     </dependency>
+    <dependency>
+      <groupId>jline</groupId>
+      <artifactId>jline</artifactId>
+      <version>0.9.91</version>
+    </dependency>
   </dependencies>
   <build>
     <plugins>
@@ -45,8 +51,10 @@
         <extensions>true</extensions>
         <configuration>
           <instructions>
-            <Export-Package>org.apache.felix.shell; 
org.ungoverned.osgi.service.shell; version=1.0.0</Export-Package>
-            <Private-Package>org.apache.felix.*</Private-Package>
+            <Export-Package>org.apache.felix.shell; version=1.2.0, 
org.ungoverned.osgi.service.shell; version=1.0.0</Export-Package>
+            <Import-Package>jline.*</Import-Package>
+            <Private-Package>org.apache.felix.*</Private-Package>
+            <Bundle-Version>1.2.0</Bundle-Version>
             <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
             
<Bundle-Activator>org.apache.felix.shell.impl.Activator</Bundle-Activator>
             <Export-Service>org.apache.felix.shell.ShellService, 
org.ungoverned.osgi.service.shell.ShellService</Export-Service>

Added: 
felix/sandbox/lenzi/shell/src/main/java/org/apache/felix/shell/CommandCompletor.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/lenzi/shell/src/main/java/org/apache/felix/shell/CommandCompletor.java?rev=574104&view=auto
==============================================================================
--- 
felix/sandbox/lenzi/shell/src/main/java/org/apache/felix/shell/CommandCompletor.java
 (added)
+++ 
felix/sandbox/lenzi/shell/src/main/java/org/apache/felix/shell/CommandCompletor.java
 Sun Sep  9 16:45:46 2007
@@ -0,0 +1,8 @@
+package org.apache.felix.shell;
+
+import jline.Completor;
+
+public interface CommandCompletor extends Completor {
+       public final static String COMMAND_NAME = 
"command.completor.reference.name";
+       public final static String COMMAND_ID = 
"command.completor.reference.service.id";
+}


Reply via email to