On 1/5/11 3:30, Guillaume Nodet wrote:
I've moved the new interface in a new package in 1055339

Thanks.

Would it also be possible to get more motivation and background for these features in the JIRA issues? Kind of difficult to know if they are worthwhile or not.

-> richard
On Wed, Jan 5, 2011 at 02:49, Richard S. Hall<[email protected]>  wrote:
If you are not planning to push these ideas into the RFC, then you should be
creating an implementation-specific package into which to place them, since
the o.a.f.s.c is intended to become the eventual org.osgi.service.command
package.

->  richard

On 1/4/11 8:18 PM, [email protected] wrote:
Author: gnodet
Date: Wed Jan  5 01:18:51 2011
New Revision: 1055258

URL: http://svn.apache.org/viewvc?rev=1055258&view=rev
Log:
[FELIX-2761][FELIX-2764] Add a listener interface called when executing
commands, send an osgi event if EventAdmin is present

Added:

felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/activator/EventAdminListener.java

felix/trunk/gogo/runtime/src/main/java/org/apache/felix/service/command/CommandSessionListener.java
Modified:
     felix/trunk/gogo/runtime/pom.xml

felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/CommandProcessorImpl.java

felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/CommandSessionImpl.java

felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/activator/Activator.java

Modified: felix/trunk/gogo/runtime/pom.xml
URL:
http://svn.apache.org/viewvc/felix/trunk/gogo/runtime/pom.xml?rev=1055258&r1=1055257&r2=1055258&view=diff

==============================================================================
--- felix/trunk/gogo/runtime/pom.xml (original)
+++ felix/trunk/gogo/runtime/pom.xml Wed Jan  5 01:18:51 2011
@@ -60,6 +60,7 @@
                              org.apache.felix.service.threadio;
version=${project.version}; status="provisional"; mandatory:="status"
                          </Export-Package>
                          <Import-Package>
+                            org.osgi.service.event*;
resolution:=optional,
                              org.osgi.service.log*; resolution:=optional,
                              org.osgi.service.packageadmin*;
resolution:=optional,
                              org.osgi.service.startlevel*;
resolution:=optional,

Modified:
felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/CommandProcessorImpl.java
URL:
http://svn.apache.org/viewvc/felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/CommandProcessorImpl.java?rev=1055258&r1=1055257&r2=1055258&view=diff

==============================================================================
---
felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/CommandProcessorImpl.java
(original)
+++
felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/CommandProcessorImpl.java
Wed Jan  5 01:18:51 2011
@@ -21,10 +21,18 @@ package org.apache.felix.gogo.runtime;
  import java.io.InputStream;
  import java.io.PrintStream;
  import java.lang.reflect.Method;
-import java.util.*;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
  import java.util.Map.Entry;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.WeakHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;

-import org.osgi.framework.BundleContext;
+import org.apache.felix.service.command.CommandSessionListener;
  import org.apache.felix.service.command.CommandProcessor;
  import org.apache.felix.service.command.CommandSession;
  import org.apache.felix.service.command.Converter;
@@ -34,6 +42,7 @@ import org.apache.felix.service.threadio
  public class CommandProcessorImpl implements CommandProcessor
  {
      protected final Set<Converter>    converters = new
HashSet<Converter>();
+    protected final Set<CommandSessionListener>    listeners = new
CopyOnWriteArraySet<CommandSessionListener>();
      protected final Map<String, Object>    commands = new
LinkedHashMap<String, Object>();
      protected final Map<String, Object>    constants = new HashMap<String,
Object>();
      protected final ThreadIO threadIO;
@@ -69,6 +78,17 @@ public class CommandProcessorImpl implem
          converters.remove(c);
      }

+    public void addListener(CommandSessionListener l)
+    {
+        listeners.add(l);
+    }
+
+    public void removeListener(CommandSessionListener l)
+    {
+        listeners.remove(l);
+    }
+
+
      public Set<String>    getCommands()
      {
          return commands.keySet();
@@ -243,4 +263,50 @@ public class CommandProcessorImpl implem

          return session.execute(buf);
      }
+
+    void beforeExecute(CommandSession session, CharSequence commandline)
+    {
+        for (CommandSessionListener l : listeners)
+        {
+            try
+            {
+                l.beforeExecute(session, commandline);
+            }
+            catch (Throwable t)
+            {
+                // Ignore
+            }
+        }
+    }
+
+    void afterExecute(CommandSession session, CharSequence commandline,
Exception exception)
+    {
+        for (CommandSessionListener l : listeners)
+        {
+            try
+            {
+                l.afterExecute(session, commandline, exception);
+            }
+            catch (Throwable t)
+            {
+                // Ignore
+            }
+        }
+    }
+
+    void afterExecute(CommandSession session, CharSequence commandline,
Object result)
+    {
+        for (CommandSessionListener l : listeners)
+        {
+            try
+            {
+                l.afterExecute(session, commandline, result);
+            }
+            catch (Throwable t)
+            {
+                // Ignore
+            }
+        }
+    }
+
  }

Modified:
felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/CommandSessionImpl.java
URL:
http://svn.apache.org/viewvc/felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/CommandSessionImpl.java?rev=1055258&r1=1055257&r2=1055258&view=diff

==============================================================================
---
felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/CommandSessionImpl.java
(original)
+++
felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/CommandSessionImpl.java
Wed Jan  5 01:18:51 2011
@@ -81,18 +81,18 @@ public class CommandSessionImpl implemen
              throw new IllegalStateException(SESSION_CLOSED);
          }

-        beforeExecute(commandline);
+        processor.beforeExecute(this, commandline);

          try
          {
              Closure impl = new Closure(this, null, commandline);
              Object result = impl.execute(this, null);
-            afterExecute(commandline, result);
+            processor.afterExecute(this, commandline, result);
              return result;
          }
          catch (Exception e)
          {
-            afterExecute(commandline, e);
+            processor.afterExecute(this, commandline, e);
              throw e;
          }
      }
@@ -386,19 +386,4 @@ public class CommandSessionImpl implemen
          }
      }

-    protected void beforeExecute(CharSequence commandline)
-    {
-        // Centralized callback for derived implementation
-    }
-
-    protected void afterExecute(CharSequence commandline, Exception
exception)
-    {
-        // Centralized callback for derived implementation
-    }
-
-    protected void afterExecute(CharSequence commandline, Object result)
-    {
-        // Centralized callback for derived implementation
-    }
-
  }

Modified:
felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/activator/Activator.java
URL:
http://svn.apache.org/viewvc/felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/activator/Activator.java?rev=1055258&r1=1055257&r2=1055258&view=diff

==============================================================================
---
felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/activator/Activator.java
(original)
+++
felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/activator/Activator.java
Wed Jan  5 01:18:51 2011
@@ -23,6 +23,7 @@ import java.util.List;

  import org.apache.felix.gogo.runtime.CommandProcessorImpl;
  import org.apache.felix.gogo.runtime.CommandProxy;
+import org.apache.felix.service.command.CommandSessionListener;
  import org.apache.felix.gogo.runtime.threadio.ThreadIOImpl;
  import org.osgi.framework.BundleActivator;
  import org.osgi.framework.BundleContext;
@@ -42,6 +43,7 @@ public class Activator implements Bundle
      private ThreadIOImpl threadio;
      private ServiceTracker commandTracker;
      private ServiceTracker converterTracker;
+    private ServiceTracker listenerTracker;
      private ServiceRegistration processorRegistration;
      private ServiceRegistration threadioRegistration;

@@ -50,6 +52,14 @@ public class Activator implements Bundle
      protected ServiceRegistration newProcessor(ThreadIO tio,
BundleContext context)
      {
          processor = new CommandProcessorImpl(tio);
+        try
+        {
+            processor.addListener(new EventAdminListener(context));
+        }
+        catch (NoClassDefFoundError error)
+        {
+            // Ignore the listener if EventAdmin package isn't present
+        }

          // Setup the variables and commands exposed in an OSGi
environment.
          processor.addConstant(CONTEXT, context);
@@ -90,6 +100,23 @@ public class Activator implements Bundle
              }
          };
          converterTracker.open();
+
+        listenerTracker = new ServiceTracker(context,
CommandSessionListener.class.getName(), null)
+        {
+            @Override
+            public Object addingService(ServiceReference reference) {
+                CommandSessionListener listener =
(CommandSessionListener) super.addingService(reference);
+                processor.addListener(listener);
+                return listener;
+            }
+
+            @Override
+            public void removedService(ServiceReference reference, Object
service) {
+                processor.removeListener((CommandSessionListener)
service);
+                super.removedService(reference, service);
+            }
+        };
+        listenerTracker.open();
      }

      public void stop(BundleContext context) throws Exception
@@ -98,6 +125,7 @@ public class Activator implements Bundle
          threadioRegistration.unregister();
          commandTracker.close();
          converterTracker.close();
+        listenerTracker.close();
          threadio.stop();
          processor.stop();
      }

Added:
felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/activator/EventAdminListener.java
URL:
http://svn.apache.org/viewvc/felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/activator/EventAdminListener.java?rev=1055258&view=auto

==============================================================================
---
felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/activator/EventAdminListener.java
(added)
+++
felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/activator/EventAdminListener.java
Wed Jan  5 01:18:51 2011
@@ -0,0 +1,59 @@
+/*
+ * 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.gogo.runtime.activator;
+
+import java.util.Properties;
+
+import org.apache.felix.service.command.CommandSession;
+import org.apache.felix.service.command.CommandSessionListener;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class EventAdminListener implements CommandSessionListener
+{
+
+    private BundleContext bundleContext;
+    private ServiceTracker tracker;
+
+    public EventAdminListener(BundleContext bundleContext)
+    {
+        this.bundleContext = bundleContext;
+        tracker = new ServiceTracker(bundleContext,
EventAdmin.class.getName(), null);
+        tracker.open();
+    }
+
+    public void beforeExecute(CommandSession session, CharSequence
command) {
+        EventAdmin admin = (EventAdmin) tracker.getService();
+        if (admin != null) {
+            Properties props = new Properties();
+            props.setProperty("command", command.toString());
+            Event event = new
Event("org/apache/felix/service/command/EXECUTING", props);
+            admin.postEvent(event);
+        }
+    }
+
+    public void afterExecute(CommandSession session, CharSequence
command, Exception exception) {
+    }
+
+    public void afterExecute(CommandSession session, CharSequence
command, Object result) {
+    }
+
+}

Added:
felix/trunk/gogo/runtime/src/main/java/org/apache/felix/service/command/CommandSessionListener.java
URL:
http://svn.apache.org/viewvc/felix/trunk/gogo/runtime/src/main/java/org/apache/felix/service/command/CommandSessionListener.java?rev=1055258&view=auto

==============================================================================
---
felix/trunk/gogo/runtime/src/main/java/org/apache/felix/service/command/CommandSessionListener.java
(added)
+++
felix/trunk/gogo/runtime/src/main/java/org/apache/felix/service/command/CommandSessionListener.java
Wed Jan  5 01:18:51 2011
@@ -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.service.command;
+
+/**
+ * Listener for command executions.
+ *
+ * Such listeners must be registered in the OSGi registry and will be
called
+ * by the CommandProcessor when a command line is executed in a given
session.
+ */
+public interface CommandSessionListener {
+
+    void beforeExecute(CommandSession session, CharSequence command);
+
+    void afterExecute(CommandSession session, CharSequence command,
Exception exception);
+
+    void afterExecute(CommandSession session, CharSequence command,
Object result);
+
+}




Reply via email to