You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by pd...@apache.org on 2014/10/03 00:01:30 UTC

svn commit: r1629082 - /felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.runtime/src/org/apache/felix/dm/runtime/ServiceLifecycleHandler.java

Author: pderop
Date: Thu Oct  2 22:01:29 2014
New Revision: 1629082

URL: http://svn.apache.org/r1629082
Log:
Fixed a bug: the ServiceLifecycle.destroy method must not remove instance bound dependencies. And moreover, 
This class must be immutable since one ServiceLifecycleHandler class instance may be shared between Adapters/AbstractDecorator.


Modified:
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.runtime/src/org/apache/felix/dm/runtime/ServiceLifecycleHandler.java

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.runtime/src/org/apache/felix/dm/runtime/ServiceLifecycleHandler.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.runtime/src/org/apache/felix/dm/runtime/ServiceLifecycleHandler.java?rev=1629082&r1=1629081&r2=1629082&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.runtime/src/org/apache/felix/dm/runtime/ServiceLifecycleHandler.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.runtime/src/org/apache/felix/dm/runtime/ServiceLifecycleHandler.java Thu Oct  2 22:01:29 2014
@@ -36,7 +36,10 @@ import org.apache.felix.dm.DependencyMan
 import org.osgi.framework.Bundle;
 
 /**
- * Allow Services to configure dynamically their dependency filters from their init() method.
+ * Caution: this class *MUST* be immutable, because it may be shared between Aspects/Adapters 
+ * and concrete Aspect/Adapter instance.
+ * 
+ * This class allows Services to configure dynamically their dependency filters from their init() method.
  * Basically, this class acts as a service implementation lifecycle handler. When we detect that the Service is
  * called in its init() method, and if init() returns a Map, then the Map is assumed to contain
  * dependency filters, which will be applied to all named dependencies. The Map optionally returned by
@@ -95,7 +98,6 @@ public class ServiceLifecycleHandler
     private final String m_destroy;
     private final MetaData m_srvMeta;
     private final List<MetaData> m_depsMeta;
-    private final List<Dependency> m_instanceBoundDeps = new ArrayList<>();
     private final Bundle m_bundle;
     private final static Object SYNC = new Object();
 
@@ -144,6 +146,8 @@ public class ServiceLifecycleHandler
         String starter = m_srvMeta.getString(Params.starter, null);
         String stopper = m_srvMeta.getString(Params.stopper, null);
 
+        List<Dependency> instanceBoundDeps = new ArrayList<>();
+            
         if (starter != null)
         {
             // We'll inject two runnables: one that will start or service, when invoked, and the other
@@ -155,7 +159,7 @@ public class ServiceLifecycleHandler
             ToggleServiceDependency toggle = new ToggleServiceDependency();
             AtomicBoolean startFlag = new AtomicBoolean(false);
             // Add the toggle to the service.
-            m_instanceBoundDeps.add(toggle);
+            instanceBoundDeps.add(toggle);
             // Inject the runnable that will start our service, when invoked.
             setField(serviceInstance, starter, Runnable.class, new ComponentStarter(componentName, toggle, startFlag));
             if (stopper != null) {
@@ -212,16 +216,16 @@ public class ServiceLifecycleHandler
                 Log.instance().info("ServiceLifecycleHandler.init: adding dependency %s into service %s",
                                    dependency, m_srvMeta);
                 Dependency d = depBuilder.build(m_bundle, dm);
-                m_instanceBoundDeps.add(d);
+                instanceBoundDeps.add(d);
             }            
         }
         
         // Add all extra dependencies in one shot, in order to calculate state changes for all dependencies at a time.
-        if (m_instanceBoundDeps.size() > 0) 
+        if (instanceBoundDeps.size() > 0) 
         {
             Log.instance().info("ServiceLifecycleHandler.init: adding extra/named dependencies %s",
-                                m_instanceBoundDeps);
-            c.add(m_instanceBoundDeps.toArray(new Dependency[m_instanceBoundDeps.size()]));
+                instanceBoundDeps);
+            c.add(instanceBoundDeps.toArray(new Dependency[instanceBoundDeps.size()]));
         }     
     }
 
@@ -290,11 +294,6 @@ public class ServiceLifecycleHandler
     public void destroy(Component service)
         throws IllegalArgumentException, IllegalAccessException, InvocationTargetException
     {
-        // Clear named dependencies eventuall returned by our service init callback. 
-        for (Dependency d : m_instanceBoundDeps) {
-            service.remove(d);
-        }
-        m_instanceBoundDeps.clear();
         callbackComposites(service, m_destroy);
     }