You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Richard S. Hall" <he...@ungoverned.org> on 2011/01/05 02:49:32 UTC

Re: svn commit: r1055258 - in /felix/trunk/gogo/runtime: ./ src/main/java/org/apache/felix/gogo/runtime/ src/main/java/org/apache/felix/gogo/runtime/activator/ src/main/java/org/apache/felix/service/command/

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, gnodet@apache.org 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);
> +
> +}
>
>

Re: svn commit: r1055258 - in /felix/trunk/gogo/runtime: ./ src/main/java/org/apache/felix/gogo/runtime/ src/main/java/org/apache/felix/gogo/runtime/activator/ src/main/java/org/apache/felix/service/command/

Posted by Guillaume Nodet <gn...@gmail.com>.
The Listener was simply an enabler for the publishing of events when
commands are executed (the motivation for that one is mostly
auditing).
I found the listener could be reused want to audit it in a different
way, so i made it public in case, but I don't have any real use case
for now beyond the EventAdmin listener.

On Wed, Jan 5, 2011 at 16:07, Richard S. Hall <he...@ungoverned.org> wrote:
> 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<he...@ungoverned.org>
>>  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, gnodet@apache.org 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

Re: svn commit: r1055258 - in /felix/trunk/gogo/runtime: ./ src/main/java/org/apache/felix/gogo/runtime/ src/main/java/org/apache/felix/gogo/runtime/activator/ src/main/java/org/apache/felix/service/command/

Posted by "Richard S. Hall" <he...@ungoverned.org>.
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<he...@ungoverned.org>  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, gnodet@apache.org 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);
>>> +
>>> +}
>>>
>>>
>
>

Re: svn commit: r1055258 - in /felix/trunk/gogo/runtime: ./ src/main/java/org/apache/felix/gogo/runtime/ src/main/java/org/apache/felix/gogo/runtime/activator/ src/main/java/org/apache/felix/service/command/

Posted by Guillaume Nodet <gn...@gmail.com>.
I've moved the new interface in a new package in 1055339

On Wed, Jan 5, 2011 at 02:49, Richard S. Hall <he...@ungoverned.org> 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, gnodet@apache.org 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