[jboss-osgi-commits] JBoss-OSGI SVN: r92880 - projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/main/java/org/jboss/osgi/plugins/facade/plugins.
jboss-osgi-commits at lists.jboss.org
jboss-osgi-commits at lists.jboss.org
Thu Aug 27 13:07:13 EDT 2009
Author: thomas.diesler at jboss.com
Date: 2009-08-27 13:07:12 -0400 (Thu, 27 Aug 2009)
New Revision: 92880
Modified:
projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/main/java/org/jboss/osgi/plugins/facade/plugins/FrameworkEventsPluginImpl.java
Log:
[JBOSGI-140] Invalid delivery of framework events
Synchronize on the listener registries
Modified: projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/main/java/org/jboss/osgi/plugins/facade/plugins/FrameworkEventsPluginImpl.java
===================================================================
--- projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/main/java/org/jboss/osgi/plugins/facade/plugins/FrameworkEventsPluginImpl.java 2009-08-27 17:01:48 UTC (rev 92879)
+++ projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/main/java/org/jboss/osgi/plugins/facade/plugins/FrameworkEventsPluginImpl.java 2009-08-27 17:07:12 UTC (rev 92880)
@@ -80,14 +80,17 @@
bundle = assertBundle(bundle);
- List<BundleListener> listeners = bundleListeners.get(bundle);
- if (listeners == null)
+ synchronized (bundleListeners)
{
- listeners = new CopyOnWriteArrayList<BundleListener>();
- bundleListeners.put(bundle, listeners);
+ List<BundleListener> listeners = bundleListeners.get(bundle);
+ if (listeners == null)
+ {
+ listeners = new CopyOnWriteArrayList<BundleListener>();
+ bundleListeners.put(bundle, listeners);
+ }
+ if (listeners.contains(listener) == false)
+ listeners.add(listener);
}
- if (listeners.contains(listener) == false)
- listeners.add(listener);
}
@Override
@@ -97,22 +100,28 @@
throw new IllegalArgumentException("Null listener");
bundle = assertBundle(bundle);
-
- List<BundleListener> listeners = bundleListeners.get(bundle);
- if (listeners != null)
+
+ synchronized (bundleListeners)
{
- if (listeners.size() > 1)
- listeners.remove(listener);
- else
- removeBundleListeners(bundle);
+ List<BundleListener> listeners = bundleListeners.get(bundle);
+ if (listeners != null)
+ {
+ if (listeners.size() > 1)
+ listeners.remove(listener);
+ else
+ removeBundleListeners(bundle);
+ }
}
}
@Override
public void removeBundleListeners(Bundle bundle)
{
- bundle = assertBundle(bundle);
- bundleListeners.remove(bundle);
+ synchronized (bundleListeners)
+ {
+ bundle = assertBundle(bundle);
+ bundleListeners.remove(bundle);
+ }
}
@Override
@@ -122,15 +131,18 @@
throw new IllegalArgumentException("Null listener");
bundle = assertBundle(bundle);
-
- List<FrameworkListener> listeners = frameworkListeners.get(bundle);
- if (listeners == null)
+
+ synchronized (frameworkListeners)
{
- listeners = new CopyOnWriteArrayList<FrameworkListener>();
- frameworkListeners.put(bundle, listeners);
+ List<FrameworkListener> listeners = frameworkListeners.get(bundle);
+ if (listeners == null)
+ {
+ listeners = new CopyOnWriteArrayList<FrameworkListener>();
+ frameworkListeners.put(bundle, listeners);
+ }
+ if (listeners.contains(listener) == false)
+ listeners.add(listener);
}
- if (listeners.contains(listener) == false)
- listeners.add(listener);
}
@Override
@@ -140,22 +152,28 @@
throw new IllegalArgumentException("Null listener");
bundle = assertBundle(bundle);
-
- List<FrameworkListener> listeners = frameworkListeners.get(bundle);
- if (listeners != null)
+
+ synchronized (frameworkListeners)
{
- if (listeners.size() > 1)
- listeners.remove(listener);
- else
- removeFrameworkListeners(bundle);
+ List<FrameworkListener> listeners = frameworkListeners.get(bundle);
+ if (listeners != null)
+ {
+ if (listeners.size() > 1)
+ listeners.remove(listener);
+ else
+ removeFrameworkListeners(bundle);
+ }
}
}
@Override
public void removeFrameworkListeners(Bundle bundle)
{
- bundle = assertBundle(bundle);
- frameworkListeners.remove(bundle);
+ synchronized (frameworkListeners)
+ {
+ bundle = assertBundle(bundle);
+ frameworkListeners.remove(bundle);
+ }
}
@Override
@@ -165,17 +183,20 @@
throw new IllegalArgumentException("Null listener");
bundle = assertBundle(bundle);
-
- List<ServiceListenerRegistration> listeners = serviceListeners.get(bundle);
- if (listeners == null)
+
+ synchronized (serviceListeners)
{
- listeners = new CopyOnWriteArrayList<ServiceListenerRegistration>();
- serviceListeners.put(bundle, listeners);
+ List<ServiceListenerRegistration> listeners = serviceListeners.get(bundle);
+ if (listeners == null)
+ {
+ listeners = new CopyOnWriteArrayList<ServiceListenerRegistration>();
+ serviceListeners.put(bundle, listeners);
+ }
+
+ ServiceListenerRegistration registration = new ServiceListenerRegistration(listener, filter);
+ if (listeners.contains(registration) == false)
+ listeners.add(registration);
}
-
- ServiceListenerRegistration registration = new ServiceListenerRegistration(listener, filter);
- if (listeners.contains(registration) == false)
- listeners.add(registration);
}
@Override
@@ -186,104 +207,116 @@
bundle = assertBundle(bundle);
- List<ServiceListenerRegistration> listeners = serviceListeners.get(bundle);
- if (listeners != null)
+ synchronized (serviceListeners)
{
- if (listeners.size() > 1)
- listeners.remove(listener);
- else
- removeServiceListeners(bundle);
+ List<ServiceListenerRegistration> listeners = serviceListeners.get(bundle);
+ if (listeners != null)
+ {
+ if (listeners.size() > 1)
+ listeners.remove(listener);
+ else
+ removeServiceListeners(bundle);
+ }
}
}
@Override
public void removeServiceListeners(Bundle bundle)
{
- bundle = assertBundle(bundle);
- serviceListeners.remove(bundle);
+ synchronized (serviceListeners)
+ {
+ bundle = assertBundle(bundle);
+ serviceListeners.remove(bundle);
+ }
}
@Override
public void fireBundleEvent(Bundle bundle, int type)
{
- // Nobody is interested
- if (bundleListeners.isEmpty())
- return;
+ synchronized (bundleListeners)
+ {
+ // Nobody is interested
+ if (bundleListeners.isEmpty())
+ return;
- // Are we active?
- if (getBundleManager().isActive() == false)
- return;
+ // Are we active?
+ if (getBundleManager().isActive() == false)
+ return;
- // Expose the wrapper not the state itself
- bundle = assertBundle(bundle);
- BundleEvent event = new BundleEvent(type, bundle);
+ // Expose the wrapper not the state itself
+ bundle = assertBundle(bundle);
+ BundleEvent event = new BundleEvent(type, bundle);
- // Synchronous listeners first
- for (Entry<Bundle, List<BundleListener>> entry : bundleListeners.entrySet())
- {
- for (BundleListener listener : entry.getValue())
- {
- try
- {
- if (listener instanceof SynchronousBundleListener)
- listener.bundleChanged(event);
- }
- catch (Throwable t)
- {
- log.warn("Error while firing bundle event: " + event.getType() + " for bundle " + bundle, t);
- }
- }
- }
-
- // Normal listeners after, if required
- if (type != BundleEvent.STARTING && type != BundleEvent.STOPPING && type != BundleEvent.LAZY_ACTIVATION)
- {
+ // Synchronous listeners first
for (Entry<Bundle, List<BundleListener>> entry : bundleListeners.entrySet())
{
for (BundleListener listener : entry.getValue())
{
try
{
- if (listener instanceof SynchronousBundleListener == false)
+ if (listener instanceof SynchronousBundleListener)
listener.bundleChanged(event);
}
catch (Throwable t)
{
- log.warn("Error while firing bundle event: " + event.getType() + " for bundle " + this, t);
+ log.warn("Error while firing bundle event: " + event.getType() + " for bundle " + bundle, t);
}
}
}
+
+ // Normal listeners after, if required
+ if (type != BundleEvent.STARTING && type != BundleEvent.STOPPING && type != BundleEvent.LAZY_ACTIVATION)
+ {
+ for (Entry<Bundle, List<BundleListener>> entry : bundleListeners.entrySet())
+ {
+ for (BundleListener listener : entry.getValue())
+ {
+ try
+ {
+ if (listener instanceof SynchronousBundleListener == false)
+ listener.bundleChanged(event);
+ }
+ catch (Throwable t)
+ {
+ log.warn("Error while firing bundle event: " + event.getType() + " for bundle " + this, t);
+ }
+ }
+ }
+ }
}
}
@Override
public void fireFrameworkEvent(Bundle bundle, int type, Throwable throwable)
{
- // Nobody is interested
- if (frameworkListeners.isEmpty())
- return;
+ synchronized (frameworkListeners)
+ {
+ // Nobody is interested
+ if (frameworkListeners.isEmpty())
+ return;
- // Are we active?
- if (getBundleManager().isActive() == false)
- return;
+ // Are we active?
+ if (getBundleManager().isActive() == false)
+ return;
- // Expose the wrapper not the state itself
- bundle = assertBundle(bundle);
- FrameworkEvent event = new FrameworkEvent(type, bundle, throwable);
+ // Expose the wrapper not the state itself
+ bundle = assertBundle(bundle);
+ FrameworkEvent event = new FrameworkEvent(type, bundle, throwable);
- // Call the listeners
- for (Entry<Bundle, List<FrameworkListener>> entry : frameworkListeners.entrySet())
- {
- for (FrameworkListener listener : entry.getValue())
+ // Call the listeners
+ for (Entry<Bundle, List<FrameworkListener>> entry : frameworkListeners.entrySet())
{
- try
+ for (FrameworkListener listener : entry.getValue())
{
- listener.frameworkEvent(event);
+ try
+ {
+ listener.frameworkEvent(event);
+ }
+ catch (Throwable t)
+ {
+ log.warn("Error while firing framework event: " + event.getType() + " for bundle " + bundle, t);
+ }
}
- catch (Throwable t)
- {
- log.warn("Error while firing framework event: " + event.getType() + " for bundle " + bundle, t);
- }
}
}
}
@@ -291,40 +324,43 @@
@Override
public void fireServiceEvent(Bundle bundle, int type, OSGiServiceState service)
{
- if (service == null)
- throw new IllegalArgumentException("No serviceReference");
+ synchronized (serviceListeners)
+ {
+ // Nobody is interested
+ if (serviceListeners.isEmpty())
+ return;
- // Nobody is interested
- if (serviceListeners.isEmpty())
- return;
+ // Are we active?
+ if (getBundleManager().isActive() == false)
+ return;
- // Are we active?
- if (getBundleManager().isActive() == false)
- return;
+ if (service == null)
+ throw new IllegalArgumentException("No serviceReference");
- // Expose the wrapper not the state itself
- bundle = assertBundle(bundle);
+ // Expose the wrapper not the state itself
+ bundle = assertBundle(bundle);
- ServiceEvent event = new ServiceEvent(type, service.getReferenceInternal());
+ ServiceEvent event = new ServiceEvent(type, service.getReferenceInternal());
- // Call the listeners
- for (Entry<Bundle, List<ServiceListenerRegistration>> entry : serviceListeners.entrySet())
- {
- for (ServiceListenerRegistration registration : entry.getValue())
+ // Call the listeners
+ for (Entry<Bundle, List<ServiceListenerRegistration>> entry : serviceListeners.entrySet())
{
- try
+ for (ServiceListenerRegistration registration : entry.getValue())
{
- if (registration.filter.match(service))
+ try
{
- AccessControlContext accessControlContext = registration.accessControlContext;
- if (accessControlContext == null || service.hasPermission(accessControlContext))
- registration.listener.serviceChanged(event);
+ if (registration.filter.match(service))
+ {
+ AccessControlContext accessControlContext = registration.accessControlContext;
+ if (accessControlContext == null || service.hasPermission(accessControlContext))
+ registration.listener.serviceChanged(event);
+ }
}
+ catch (Throwable t)
+ {
+ log.warn("Error while firing service event: " + type + " for service " + service, t);
+ }
}
- catch (Throwable t)
- {
- log.warn("Error while firing service event: " + type + " for service " + service, t);
- }
}
}
}
More information about the jboss-osgi-commits
mailing list