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
