fixed bug: unamed dependencies must be injected before the init() method, not after. 



git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@953669 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/AdapterServiceBuilder.java b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/AdapterServiceBuilder.java
index da38818..3446192 100644
--- a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/AdapterServiceBuilder.java
+++ b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/AdapterServiceBuilder.java
@@ -55,6 +55,8 @@
         ServiceLifecycleHandler lfcleHandler = new ServiceLifecycleHandler(service, b, dm, srvMeta, depsMeta);
         // The dependencies will be plugged by our lifecycle handler.
         service.setCallbacks(lfcleHandler, "init", "start", "stop", "destroy");
+        // Adds dependencies (except named dependencies, which are managed by the lifecycle handler).
+        addUnamedDependencies(b, dm, service, srvMeta, depsMeta);
         dm.add(service);
     }
 }
diff --git a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/AspectServiceBuilder.java b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/AspectServiceBuilder.java
index 8fbde27..4130cb8 100644
--- a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/AspectServiceBuilder.java
+++ b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/AspectServiceBuilder.java
@@ -58,6 +58,8 @@
         ServiceLifecycleHandler lfcleHandler = new ServiceLifecycleHandler(service, b, dm, srvMeta, depsMeta);
         // The dependencies will be plugged by our lifecycle handler.
         service.setCallbacks(lfcleHandler, "init", "start", "stop", "destroy");
+        // Adds dependencies (except named dependencies, which are managed by the lifecycle handler).
+        addUnamedDependencies(b, dm, service, srvMeta, depsMeta);
         dm.add(service);
     }
 }
diff --git a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/BundleAdapterServiceBuilder.java b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/BundleAdapterServiceBuilder.java
index 8d82336..4b40ba2 100644
--- a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/BundleAdapterServiceBuilder.java
+++ b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/BundleAdapterServiceBuilder.java
@@ -22,7 +22,6 @@
 import java.util.List;
 
 import org.apache.felix.dm.DependencyManager;
-import org.apache.felix.dm.dependencies.Dependency;
 import org.apache.felix.dm.service.Service;
 import org.osgi.framework.Bundle;
 
@@ -53,6 +52,8 @@
         ServiceLifecycleHandler lfcleHandler = new ServiceLifecycleHandler(srv, b, dm, srvMeta, depsMeta);
         // The dependencies will be plugged by our lifecycle handler.
         srv.setCallbacks(lfcleHandler, "init", "start", "stop", "destroy");
+        // Adds dependencies (except named dependencies, which are managed by the lifecycle handler).
+        addUnamedDependencies(b, dm, srv, srvMeta, depsMeta);
         dm.add(srv);
     }    
 }
diff --git a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/FactoryConfigurationAdapterServiceBuilder.java b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/FactoryConfigurationAdapterServiceBuilder.java
index 6994ffc..13301eb 100644
--- a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/FactoryConfigurationAdapterServiceBuilder.java
+++ b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/FactoryConfigurationAdapterServiceBuilder.java
@@ -22,7 +22,6 @@
 import java.util.List;
 
 import org.apache.felix.dm.DependencyManager;
-import org.apache.felix.dm.dependencies.Dependency;
 import org.apache.felix.dm.service.Service;
 import org.osgi.framework.Bundle;
 
@@ -53,6 +52,8 @@
         ServiceLifecycleHandler lfcleHandler = new ServiceLifecycleHandler(srv, b, dm, srvMeta, depsMeta);
         // The dependencies will be plugged by our lifecycle handler.
         srv.setCallbacks(lfcleHandler, "init", "start", "stop", "destroy");
+        // Adds dependencies (except named dependencies, which are managed by the lifecycle handler).
+        addUnamedDependencies(b, dm, srv, srvMeta, depsMeta);
         dm.add(srv);
     }    
 }
diff --git a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ResourceAdapterServiceBuilder.java b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ResourceAdapterServiceBuilder.java
index 6ae100a..ede3c53 100644
--- a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ResourceAdapterServiceBuilder.java
+++ b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ResourceAdapterServiceBuilder.java
@@ -22,7 +22,6 @@
 import java.util.List;
 
 import org.apache.felix.dm.DependencyManager;
-import org.apache.felix.dm.dependencies.Dependency;
 import org.apache.felix.dm.service.Service;
 import org.osgi.framework.Bundle;
 
@@ -52,6 +51,8 @@
         ServiceLifecycleHandler lfcleHandler = new ServiceLifecycleHandler(srv, b, dm, srvMeta, depsMeta);
         // The dependencies will be plugged by our lifecycle handler.
         srv.setCallbacks(lfcleHandler, "init", "start", "stop", "destroy");
+        // Adds dependencies (except named dependencies, which are managed by the lifecycle handler).
+        addUnamedDependencies(b, dm, srv, srvMeta, depsMeta);
         dm.add(srv);
     }    
 }
diff --git a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ServiceBuilder.java b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ServiceBuilder.java
index a6d5245..47aa2b5 100644
--- a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ServiceBuilder.java
+++ b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ServiceBuilder.java
@@ -24,7 +24,6 @@
 import java.util.Set;
 
 import org.apache.felix.dm.DependencyManager;
-import org.apache.felix.dm.dependencies.Dependency;
 import org.apache.felix.dm.service.Service;
 import org.osgi.framework.Bundle;
 import org.osgi.service.log.LogService;
@@ -64,6 +63,8 @@
             // Creates a ServiceHandler, which will filter all service lifecycle callbacks.
             ServiceLifecycleHandler lfcleHandler = new ServiceLifecycleHandler(service, b, dm, srvMeta, depsMeta);
             service.setCallbacks(lfcleHandler, "init", "start", "stop", "destroy");
+            // Adds dependencies (except named dependencies, which are managed by the lifecycle handler).
+            addUnamedDependencies(b, dm, service, srvMeta, depsMeta);
         }
         else
         {
diff --git a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ServiceComponentBuilder.java b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ServiceComponentBuilder.java
index 607375e..0dae055 100644
--- a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ServiceComponentBuilder.java
+++ b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ServiceComponentBuilder.java
@@ -21,8 +21,10 @@
 import java.util.List;
 
 import org.apache.felix.dm.DependencyManager;
+import org.apache.felix.dm.dependencies.Dependency;
 import org.apache.felix.dm.service.Service;
 import org.osgi.framework.Bundle;
+import org.osgi.service.log.LogService;
 
 /**
  * The builder which creates a DependencyManager Service (a Service and all its derived classes (Aspect/Adapters).
@@ -60,4 +62,28 @@
             service.setComposition(composition);
         }
     }
+    
+    /**
+     * Registers all unamed dependencies into a given service. Named dependencies are
+     * handled differently, and are managed by the ServiceLifecycleHandler class.
+     * @throws Exception 
+     */
+    protected static void addUnamedDependencies(Bundle b, DependencyManager dm, Service s, 
+                                                MetaData srvMeta, List<MetaData> depsMeta) 
+        throws Exception
+    {
+        for (MetaData dependency : depsMeta) 
+        {
+            String name = dependency.getString(Params.name, null);
+            if (name == null) {
+                DependencyBuilder depBuilder = new DependencyBuilder(dependency);
+                Log.instance().log(LogService.LOG_INFO, 
+                                   "ServiceLifecycleHandler.init: adding dependency %s into service %s",
+                                   dependency, srvMeta);
+                Dependency d = depBuilder.build(b, dm, false);
+                s.add(d);
+            }
+        }
+
+    }
 }
diff --git a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ServiceFactory.java b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ServiceFactory.java
index fdfa731..98dd03d 100644
--- a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ServiceFactory.java
+++ b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ServiceFactory.java
@@ -28,6 +28,7 @@
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.felix.dm.DependencyManager;
+import org.apache.felix.dm.dependencies.Dependency;
 import org.apache.felix.dm.service.Service;
 import org.osgi.framework.Bundle;
 import org.osgi.service.log.LogService;
@@ -364,6 +365,20 @@
                 // The dependencies will be plugged by our lifecycle handler.
                 s.setCallbacks(lfcleHandler, "init", "start", "stop", "destroy");
 
+                // Adds dependencies (except named dependencies, which are managed by the lifecycle handler).
+                for (MetaData dependency : m_depsMeta) 
+                {
+                    String name = dependency.getString(Params.name, null);
+                    if (name == null) {
+                        DependencyBuilder depBuilder = new DependencyBuilder(dependency);
+                        Log.instance().log(LogService.LOG_INFO, 
+                                           "ServiceLifecycleHandler.init: adding dependency %s into service %s",
+                                           dependency, m_srvMeta);
+                        Dependency d = depBuilder.build(m_bundle, m_dm, false);
+                        s.add(d);
+                    }
+                }
+                
                 // Register the Service instance, and keep track of it.
                 Log.instance().log(LogService.LOG_INFO, "ServiceFactory: created service %s", m_srvMeta);
                 m_dm.add(s);
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 a5e6395..d9f0976 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
@@ -41,7 +41,7 @@
  * Allow Services to configure dynamically their dependency filters from their init() method.
  * Basically, this class acts as a service implementation lifecycle handler. When we detect that the Service is
  * called in its init() method, and if its init() method returns a Map, then the Map is assumed to contain
- * dependency filters, which will be applied to all service dependencies. The Map optionally returned by
+ * dependency filters, which will be applied to all named service dependencies. The Map optionally returned by
  * Service's init method has to contains the following keys:
  * <ul>
  *   <li>name.filter: the value must be a valid OSGi filter. the "name" prefix must match a ServiceDependency 
@@ -50,7 +50,10 @@
  *   ServiceDependency name attribute</li>
  * </ul>
  * 
- * Example of a Service whose dependency filter is configured from ConfigAdmin:
+ * <p>Dependencies which provide a name attribute will be activated after the init method returns. Other
+ * dependencies are injected before the init method.
+ * 
+ * <p>Example of a Service whose dependency filter is configured from ConfigAdmin:
  * 
  * <blockquote><pre>
  *  &#47;**
@@ -133,6 +136,7 @@
         // Invoke the service instance init method, and check if it returns a dependency
         // customization map. This map will be used to configure some dependency filters
         // (or required flag).
+      
         Object o = invokeMethod(serviceInstance, m_init, dm, service);      
         Map<String, String> customization = (o != null && Map.class.isAssignableFrom(o.getClass())) ?
             (Map<String, String>) o : new HashMap<String, String>();
@@ -147,14 +151,14 @@
             // customization map, then apply filters and required flag from the map into it.
             
             String name = dependency.getString(Params.name, null);
-            if (name != null)
-            {
+            if (name != null) {
                 String filter = customization.get(name + ".filter");
                 String required = customization.get(name + ".required");
-                		
-                if (filter != null || required != null) {
+
+                if (filter != null || required != null)
+                {
                     dependency = (MetaData) dependency.clone();
-                    if (filter != null) 
+                    if (filter != null)
                     {
                         dependency.setString(Params.filter, filter);
                     }
@@ -163,14 +167,15 @@
                         dependency.setString(Params.required, required);
                     }
                 }
+
+                DependencyBuilder depBuilder = new DependencyBuilder(dependency);
+                Log.instance().log(LogService.LOG_INFO,
+                                   "ServiceLifecycleHandler.init: adding dependency %s into service %s",
+                                   dependency, m_srvMeta);
+                Dependency d = depBuilder.build(m_bundle, dm, true);
+                m_deps.add(d);
+                service.add(d);
             }
-            DependencyBuilder depBuilder = new DependencyBuilder(dependency);
-            Log.instance().log(LogService.LOG_INFO, 
-                               "ServiceLifecycleHandler.init: adding dependency %s into service %s",
-                               dependency, m_srvMeta);
-            Dependency d = depBuilder.build(m_bundle, dm, true);
-            m_deps.add(d);
-            service.add(d);
         }
     }