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