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/05/14 17:48:19 UTC

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

Author: pderop
Date: Wed May 14 15:48:18 2014
New Revision: 1594620

URL: http://svn.apache.org/r1594620
Log:
Don't use anymore an init toggle because the ComponentImpl.handleChange() method is now not recursive anymore.

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

Modified: felix/sandbox/pderop/dependencymanager-prototype/dm.runtime/src/dm/runtime/ServiceLifecycleHandler.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/dm.runtime/src/dm/runtime/ServiceLifecycleHandler.java?rev=1594620&r1=1594619&r2=1594620&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/dm.runtime/src/dm/runtime/ServiceLifecycleHandler.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/dm.runtime/src/dm/runtime/ServiceLifecycleHandler.java Wed May 14 15:48:18 2014
@@ -96,9 +96,8 @@ public class ServiceLifecycleHandler
     private final String m_destroy;
     private final MetaData m_srvMeta;
     private final List<MetaData> m_depsMeta;
-    private final List<Dependency> m_namedDeps = new ArrayList<Dependency>();
+    private final List<Dependency> m_instanceBoundDeps = new ArrayList<>();
     private final Bundle m_bundle;
-    private volatile ToggleServiceDependency m_toggle;
     private final static Object SYNC = new Object();
 
     /**
@@ -154,29 +153,17 @@ public class ServiceLifecycleHandler
             Log.instance().debug("Setting up a lifecycle controller for service %s", serviceInstance);
             String componentName = serviceInstance.getClass().getName();
             // Create a toggle service, used to start/stop our service.
-            m_toggle = new ToggleServiceDependency();
+            ToggleServiceDependency toggle = new ToggleServiceDependency();
             AtomicBoolean startFlag = new AtomicBoolean(false);
-            // Add the toggle to the service (we'll remove it from our destroy emthod).
-            c.add(m_toggle);
+            // Add the toggle to the service.
+            m_instanceBoundDeps.add(toggle);
             // Inject the runnable that will start our service, when invoked.
-            setField(serviceInstance, starter, Runnable.class, new ComponentStarter(componentName, m_toggle, startFlag));
+            setField(serviceInstance, starter, Runnable.class, new ComponentStarter(componentName, toggle, startFlag));
             if (stopper != null) {
                 // Inject the runnable that will stop our service, when invoked.
-                setField(serviceInstance, stopper, Runnable.class, new ComponentStopper(componentName, m_toggle, startFlag));
+                setField(serviceInstance, stopper, Runnable.class, new ComponentStopper(componentName, toggle, startFlag));
             }
         }
-
-        // Before invoking an optional init method, we have to handle an edge case (FELIX-4050), where
-        // init may add dependencies using the API and also return a map for configuring some
-        // named dependencies. We have to add a hidden toggle dependency in the component, which we'll 
-        // active *after* the init method is called, and possibly *after* named dependencies are configured.
-        
-        ToggleServiceDependency initToggle = null;
-        if (m_init != null) 
-        {
-            initToggle = new ToggleServiceDependency();
-            c.add(initToggle); 
-        }
         
         // Invoke component and all composites init methods, and for each one, check if a dependency
         // customization map is returned by the method. This map will be used to configure 
@@ -226,25 +213,17 @@ 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_namedDeps.add(d);
+                m_instanceBoundDeps.add(d);
             }            
         }
         
         // Add all extra dependencies in one shot, in order to calculate state changes for all dependencies at a time.
-        if (m_namedDeps.size() > 0) 
+        if (m_instanceBoundDeps.size() > 0) 
         {
             Log.instance().info("ServiceLifecycleHandler.init: adding extra/named dependencies %s",
-                                m_namedDeps);
-            c.add(m_namedDeps.toArray(new Dependency[m_namedDeps.size()]));
-        }
-        
-        // init method fully handled, and all possible named dependencies have been configured. Now, activate the 
-        // hidden toggle, and then remove it from the component, because we don't need it anymore.
-        if (initToggle != null) 
-        {
-            initToggle.activate(true);
-            //c.remove(initToggle);
-        }
+                                m_instanceBoundDeps);
+            c.add(m_instanceBoundDeps.toArray(new Dependency[m_instanceBoundDeps.size()]));
+        }     
     }
 
     /**
@@ -313,13 +292,10 @@ public class ServiceLifecycleHandler
         throws IllegalArgumentException, IllegalAccessException, InvocationTargetException
     {
         // Clear named dependencies eventuall returned by our service init callback. 
-        m_namedDeps.clear();
-        if (m_toggle != null)
-        {
-            // If we created a toggle for our service, just remove it from the service.
-            service.remove(m_toggle);
-            m_toggle = null;
+        for (Dependency d : m_instanceBoundDeps) {
+            service.remove(d);
         }
+        m_instanceBoundDeps.clear();
         callbackComposites(service, m_destroy);
     }