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);
+            }
+        }
     }
 
     /**