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 2018/10/08 20:15:29 UTC

svn commit: r1843196 - /felix/trunk/dependencymanager/org.apache.felix.dependencymanager.runtime/src/org/apache/felix/dm/runtime/ServiceLifecycleHandler.java

Author: pderop
Date: Mon Oct  8 20:15:29 2018
New Revision: 1843196

URL: http://svn.apache.org/viewvc?rev=1843196&view=rev
Log:
FELIX-5956: Avoid NPE when a lifecycle controller runnable is invoked from the init() method.

Modified:
    felix/trunk/dependencymanager/org.apache.felix.dependencymanager.runtime/src/org/apache/felix/dm/runtime/ServiceLifecycleHandler.java

Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.runtime/src/org/apache/felix/dm/runtime/ServiceLifecycleHandler.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.runtime/src/org/apache/felix/dm/runtime/ServiceLifecycleHandler.java?rev=1843196&r1=1843195&r2=1843196&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.runtime/src/org/apache/felix/dm/runtime/ServiceLifecycleHandler.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.runtime/src/org/apache/felix/dm/runtime/ServiceLifecycleHandler.java Mon Oct  8 20:15:29 2018
@@ -146,8 +146,6 @@ 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
@@ -158,8 +156,9 @@ public class ServiceLifecycleHandler
             // Create a toggle service, used to start/stop our service.
             ToggleServiceDependency toggle = new ToggleServiceDependency();
             AtomicBoolean startFlag = new AtomicBoolean(false);
-            // Add the toggle to the service.
-            instanceBoundDeps.add(toggle);
+            // Add the toggle dependency to the component.
+            c.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) {
@@ -200,6 +199,7 @@ public class ServiceLifecycleHandler
         
         // Apply name dependency filters possibly returned by the init() method.
         
+        List<Dependency> nameDependencies = new ArrayList<>();
         for (MetaData dependency: m_depsMeta)
         {
             // Check if this dependency has a name, and if we find the name from the 
@@ -236,19 +236,16 @@ public class ServiceLifecycleHandler
                 }
 
                 DependencyBuilder depBuilder = new DependencyBuilder(dependency);
-                Log.instance().info("ServiceLifecycleHandler.init: adding dependency %s into service %s",
-                                   dependency, m_srvMeta);
-                Dependency d = depBuilder.build(m_bundle, dm);
-                instanceBoundDeps.add(d);
+                Log.instance().info("ServiceLifecycleHandler.init: adding dependency %s into service %s", dependency, m_srvMeta);
+                nameDependencies.add(depBuilder.build(m_bundle, dm));
             }            
         }
         
-        // Add all extra dependencies in one shot, in order to calculate state changes for all dependencies at a time.
-        if (instanceBoundDeps.size() > 0) 
+        // Add all extra dependencies
+        if (nameDependencies.size() > 0) 
         {
-            Log.instance().info("ServiceLifecycleHandler.init: adding extra/named dependencies %s",
-                instanceBoundDeps);
-            c.add(instanceBoundDeps.toArray(new Dependency[instanceBoundDeps.size()]));
+            Log.instance().info("ServiceLifecycleHandler.init: adding extra/named dependencies %s", nameDependencies);
+            c.add(nameDependencies.toArray(new Dependency[nameDependencies.size()]));
         }    
 
         // init method fully handled, and all possible named dependencies have been configured. Now, activate the