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/03/09 01:29:34 UTC

svn commit: r1575640 - /felix/sandbox/pderop/dependencymanager-prototype/dm/src/dm/impl/ComponentImpl.java

Author: pderop
Date: Sun Mar  9 00:29:34 2014
New Revision: 1575640

URL: http://svn.apache.org/r1575640
Log:
Removed isInstantiated(). Added getComponentState().
Always start optional dependencies, before starting required dependencies. This is necessary because
starting a required dependency may change the state to INSTANTIATED_AND_WAITING_FOR_REQUIRED immediately before
other optional dependencies are started. (see ServiceDependencyInjectionTest integration test).

Modified:
    felix/sandbox/pderop/dependencymanager-prototype/dm/src/dm/impl/ComponentImpl.java

Modified: felix/sandbox/pderop/dependencymanager-prototype/dm/src/dm/impl/ComponentImpl.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/dm/src/dm/impl/ComponentImpl.java?rev=1575640&r1=1575639&r2=1575640&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/dm/src/dm/impl/ComponentImpl.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/dm/src/dm/impl/ComponentImpl.java Sun Mar  9 00:29:34 2014
@@ -133,9 +133,7 @@ public class ComponentImpl implements Co
 						instanceBoundDeps.add(dc);
 					}
 				}
-				for (DependencyContext dc : instanceBoundDeps) {
-					dc.start();
-				}
+				startDependencies(instanceBoundDeps);
 				handleChange();
 			}
 		});
@@ -310,12 +308,7 @@ public class ComponentImpl implements Co
 	private boolean performTransition(ComponentState oldState, ComponentState newState) {
 //		System.out.println("transition from " + oldState + " to " + newState);
 		if (oldState == ComponentState.INACTIVE && newState == ComponentState.WAITING_FOR_REQUIRED) {
-			for (DependencyContext d : m_dependencies) {
-			    if (d.needsInstance()) {
-			        instantiateComponent();
-			    }
-				d.start();
-			}
+		    startDependencies(m_dependencies);
 			notifyListeners(newState);
 			return true;
 		}
@@ -353,9 +346,7 @@ public class ComponentImpl implements Co
 			return true;
 		}
 		if (oldState == ComponentState.WAITING_FOR_REQUIRED && newState == ComponentState.INACTIVE) {
-			for (DependencyContext d : m_dependencies) {
-				d.stop();
-			}
+		    stopDependencies();
             destroyComponent();
 			notifyListeners(newState);
 			return true;
@@ -363,6 +354,34 @@ public class ComponentImpl implements Co
 		return false;
 	}
 	
+    private void startDependencies(List<DependencyContext> dependencies) {
+        // Start first optional dependencies, then start required dependencies.
+        List<DependencyContext> requiredDeps = new ArrayList();
+        for (DependencyContext d : dependencies) {
+            if (d.isRequired()) {
+                requiredDeps.add(d);
+                continue;
+            }
+            if (d.needsInstance()) {
+                instantiateComponent();
+            }
+            d.start();
+        }
+        // now, start required dependencies.
+        for (DependencyContext d : requiredDeps) {
+            if (d.needsInstance()) {
+                instantiateComponent();
+            }
+            d.start();
+        }
+    }
+    
+    private void stopDependencies() {
+        for (DependencyContext d : m_dependencies) {
+            d.stop();
+        }
+    }
+
     private void registerService() {
         if (m_context != null && m_serviceName != null) {
             ServiceRegistrationImpl wrapper = new ServiceRegistrationImpl();
@@ -623,8 +642,8 @@ public class ComponentImpl implements Co
 		return m_state == TRACKING_OPTIONAL;
 	}
 	
-	public boolean isInstantiated() {
-	    return m_state == TRACKING_OPTIONAL || m_state == INSTANTIATED_AND_WAITING_FOR_REQUIRED;
+	public ComponentState getComponentState() {
+	    return m_state;
 	}
 
 	@Override