[Osgi-messages] SF.net SVN: osgi:[252] papoose-cmpn/trunk
Status: Beta
Brought to you by:
maguro
|
From: <osg...@li...> - 2010-02-24 18:16:22
|
Revision: 252
http://osgi.svn.sourceforge.net/osgi/?rev=252&view=rev
Author: maguro
Date: 2010-02-24 18:16:15 +0000 (Wed, 24 Feb 2010)
Log Message:
-----------
Having Event Admin extend a service tracker is kindof an implementation leak
Modified Paths:
--------------
papoose-cmpn/trunk/event/src/main/java/org/papoose/event/EventAdminImpl.java
papoose-cmpn/trunk/tck/tests/src/test/java/org/papoose/tck/event/EventAdminImplTest.java
Modified: papoose-cmpn/trunk/event/src/main/java/org/papoose/event/EventAdminImpl.java
===================================================================
--- papoose-cmpn/trunk/event/src/main/java/org/papoose/event/EventAdminImpl.java 2010-02-24 15:37:28 UTC (rev 251)
+++ papoose-cmpn/trunk/event/src/main/java/org/papoose/event/EventAdminImpl.java 2010-02-24 18:16:15 UTC (rev 252)
@@ -44,6 +44,7 @@
import org.osgi.service.event.TopicPermission;
import org.osgi.service.log.LogService;
import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
import org.papoose.event.util.LogServiceTracker;
import org.papoose.event.util.SerialExecutor;
@@ -52,7 +53,7 @@
/**
* @version $Revision: $ $Date: $
*/
-public class EventAdminImpl extends ServiceTracker implements EventAdmin
+public class EventAdminImpl implements EventAdmin
{
private final static String CLASS_NAME = EventAdminImpl.class.getName();
private final static Logger LOGGER = Logger.getLogger(CLASS_NAME);
@@ -65,6 +66,8 @@
public boolean matchCase(Dictionary dictionary) { return true; }
};
private final Listeners listeners = new Listeners();
+ private final BundleContext context;
+ private final ServiceTracker tracker;
private final ExecutorService executor;
private final ScheduledExecutorService scheduledExecutor;
private final LogServiceTracker loggers;
@@ -73,8 +76,24 @@
public EventAdminImpl(BundleContext context, ExecutorService executor, ScheduledExecutorService scheduledExecutor)
{
- super(context, EventHandler.class.getName(), null);
+ this.context = context;
+ this.tracker = new ServiceTracker(context, EventHandler.class.getName(), new ServiceTrackerCustomizer()
+ {
+ public Object addingService(ServiceReference reference)
+ {
+ return EventAdminImpl.this.addingService(reference);
+ }
+ public void modifiedService(ServiceReference reference, Object service)
+ {
+ EventAdminImpl.this.modifiedService(reference, service);
+ }
+
+ public void removedService(ServiceReference reference, Object service)
+ {
+ EventAdminImpl.this.removedService(reference, service);
+ }
+ });
this.executor = executor;
this.scheduledExecutor = scheduledExecutor;
this.loggers = new LogServiceTracker(context);
@@ -100,6 +119,67 @@
this.timeUnit = timeUnit;
}
+ public void start()
+ {
+ tracker.open();
+ loggers.open();
+ }
+
+ public void stop()
+ {
+ tracker.close();
+ loggers.close();
+ }
+
+ public void postEvent(final Event event)
+ {
+ LOGGER.entering(CLASS_NAME, "postEvent", event);
+
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null) sm.checkPermission(new TopicPermission(event.getTopic(), TopicPermission.PUBLISH));
+
+ Set<EventListener> set = collectListeners(event);
+
+ for (final EventListener el : set)
+ {
+ el.executor.execute(new TimeoutRunnable(el, event));
+ }
+
+ LOGGER.exiting(CLASS_NAME, "postEvent");
+ }
+
+ public void sendEvent(final Event event)
+ {
+ LOGGER.entering(CLASS_NAME, "sendEvent", event);
+
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null) sm.checkPermission(new TopicPermission(event.getTopic(), TopicPermission.PUBLISH));
+
+ Set<EventListener> set = collectListeners(event);
+
+ if (!set.isEmpty())
+ {
+ final CountDownLatch latch = new CountDownLatch(set.size());
+ for (final EventListener listener : set)
+ {
+ listener.executor.execute(new TimeoutRunnable(latch, listener, event));
+ }
+
+ try
+ {
+ latch.await();
+ }
+ catch (InterruptedException ie)
+ {
+ LOGGER.log(Level.WARNING, "Wait interrupted", ie);
+ Thread.currentThread().interrupt();
+ }
+ }
+
+ LOGGER.exiting(CLASS_NAME, "sendEvent");
+ }
+
+
/**
* This service tracker customizer culls services that do not have
* an event topic or do not have the proper topic subscription
@@ -111,8 +191,7 @@
* service or <code>null</code> if the specified referenced service
* should not be tracked.
*/
- @Override
- public Object addingService(ServiceReference reference)
+ private Object addingService(ServiceReference reference)
{
LOGGER.entering(CLASS_NAME, "addingService", reference);
@@ -199,8 +278,7 @@
}
}
- @Override
- public void modifiedService(ServiceReference reference, Object service)
+ private void modifiedService(ServiceReference reference, Object service)
{
LOGGER.entering(CLASS_NAME, "modifiedService", new Object[]{ reference, service });
@@ -210,8 +288,7 @@
LOGGER.exiting(CLASS_NAME, "modifiedService", null);
}
- @Override
- public void removedService(ServiceReference reference, Object service)
+ private void removedService(ServiceReference reference, Object service)
{
LOGGER.entering(CLASS_NAME, "removedService", new Object[]{ reference, service });
@@ -220,54 +297,6 @@
LOGGER.exiting(CLASS_NAME, "removedService", null);
}
- public void postEvent(final Event event)
- {
- LOGGER.entering(CLASS_NAME, "postEvent", event);
-
- SecurityManager sm = System.getSecurityManager();
- if (sm != null) sm.checkPermission(new TopicPermission(event.getTopic(), TopicPermission.PUBLISH));
-
- Set<EventListener> set = collectListeners(event);
-
- for (final EventListener el : set)
- {
- el.executor.execute(new TimeoutRunnable(el, event));
- }
-
- LOGGER.exiting(CLASS_NAME, "postEvent");
- }
-
- public void sendEvent(final Event event)
- {
- LOGGER.entering(CLASS_NAME, "sendEvent", event);
-
- SecurityManager sm = System.getSecurityManager();
- if (sm != null) sm.checkPermission(new TopicPermission(event.getTopic(), TopicPermission.PUBLISH));
-
- Set<EventListener> set = collectListeners(event);
-
- if (!set.isEmpty())
- {
- final CountDownLatch latch = new CountDownLatch(set.size());
- for (final EventListener listener : set)
- {
- listener.executor.execute(new TimeoutRunnable(latch, listener, event));
- }
-
- try
- {
- latch.await();
- }
- catch (InterruptedException ie)
- {
- LOGGER.log(Level.WARNING, "Wait interrupted", ie);
- Thread.currentThread().interrupt();
- }
- }
-
- LOGGER.exiting(CLASS_NAME, "sendEvent");
- }
-
private void add(EventListener listener)
{
LOGGER.entering(CLASS_NAME, "add", listener);
Modified: papoose-cmpn/trunk/tck/tests/src/test/java/org/papoose/tck/event/EventAdminImplTest.java
===================================================================
--- papoose-cmpn/trunk/tck/tests/src/test/java/org/papoose/tck/event/EventAdminImplTest.java 2010-02-24 15:37:28 UTC (rev 251)
+++ papoose-cmpn/trunk/tck/tests/src/test/java/org/papoose/tck/event/EventAdminImplTest.java 2010-02-24 18:16:15 UTC (rev 252)
@@ -91,7 +91,7 @@
EventAdminImpl eventAdmin = new EventAdminImpl(bundleContext, executor, scheduledExecutor);
- eventAdmin.open();
+ eventAdmin.start();
Dictionary<String, Object> properties = new Hashtable<String, Object>();
properties.put(EventConstants.EVENT_TOPIC, "a/b/c/d");
@@ -137,7 +137,7 @@
{
sr.unregister();
- eventAdmin.close();
+ eventAdmin.stop();
executor.shutdown();
scheduledExecutor.shutdown();
@@ -153,7 +153,7 @@
EventAdminImpl eventAdmin = new EventAdminImpl(bundleContext, executor, scheduledExecutor);
- eventAdmin.open();
+ eventAdmin.start();
Dictionary<String, Object> properties = new Hashtable<String, Object>();
properties.put(EventConstants.EVENT_TOPIC, "a/b/c/*");
@@ -198,7 +198,7 @@
{
sr.unregister();
- eventAdmin.close();
+ eventAdmin.stop();
executor.shutdown();
scheduledExecutor.shutdown();
@@ -214,7 +214,7 @@
EventAdminImpl eventAdmin = new EventAdminImpl(bundleContext, executor, scheduledExecutor);
- eventAdmin.open();
+ eventAdmin.start();
Dictionary<String, Object> properties = new Hashtable<String, Object>();
properties.put(EventConstants.EVENT_TOPIC, "a/*");
@@ -259,7 +259,7 @@
{
sr.unregister();
- eventAdmin.close();
+ eventAdmin.stop();
executor.shutdown();
scheduledExecutor.shutdown();
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|