I've moved the new interface in a new package in 1055339

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);
>> +
>> +}
>>
>>
>



-- 
Cheers,
Guillaume Nodet
------------------------
Blog: http://gnodet.blogspot.com/
------------------------
Open Source SOA
http://fusesource.com

Reply via email to