[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