Once a component is started, make sure that all named dependencies are not in "instance bound" mode anymore, because we would like the component to be destroyed if a named dependency is not available anymore
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@989366 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ServiceLifecycleHandler.java b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ServiceLifecycleHandler.java
index 6b6fed8..acc7813 100644
--- a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ServiceLifecycleHandler.java
+++ b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ServiceLifecycleHandler.java
@@ -26,13 +26,19 @@
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Hashtable;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
+import org.apache.felix.dm.BundleDependency;
+import org.apache.felix.dm.ConfigurationDependency;
import org.apache.felix.dm.Dependency;
import org.apache.felix.dm.DependencyManager;
+import org.apache.felix.dm.ResourceDependency;
import org.apache.felix.dm.Service;
+import org.apache.felix.dm.ServiceDependency;
+import org.apache.felix.dm.TemporalServiceDependency;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
@@ -222,6 +228,8 @@
public void start(Service service)
throws IllegalArgumentException, IllegalAccessException, InvocationTargetException
{
+ // Check if some extra service properties are returned by start method.
+
DependencyManager dm = service.getDependencyManager();
Map<String, String> extraProperties = new HashMap<String, String>();
Object[] composites = service.getCompositionInstances();
@@ -255,6 +263,25 @@
service.setServiceProperties(new Hashtable(extraProperties));
}
}
+
+ // Remove "instance bound" flag from all dependencies, because we want to be deactivated
+ // once we lose one of our named dependencies (which are instance bound dependencies).
+
+ Iterator it = m_namedDeps.iterator();
+ while (it.hasNext())
+ {
+ Dependency d = (Dependency) it.next();
+ try
+ {
+ InvocationUtil.invokeCallbackMethod(d, "setInstanceBound",
+ new Class[][] { { Boolean.TYPE }, {} },
+ new Object[][] { { Boolean.FALSE }, {} });
+ }
+ catch (NoSuchMethodException e)
+ {
+ Log.instance().log(LogService.LOG_ERROR, "Lifecycle handler could not reset instanceBound of dependency: %s", e, d);
+ }
+ }
}
/**