Finished to apply the recommendations made by Jan Willen regarding the new dm-lambda library.
By default, dependencies are optional, like in the original DM API.
Removed ambiguous methods in ComponentBuilder interface (initInstance/startInstance ...).
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1732779 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/dependencymanager/org.apache.felix.dependencymanager.benchmark/src/org/apache/felix/dm/benchmark/controller/impl/ScenarioControllerImpl.java b/dependencymanager/org.apache.felix.dependencymanager.benchmark/src/org/apache/felix/dm/benchmark/controller/impl/ScenarioControllerImpl.java
index b27e312..29bb32e 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.benchmark/src/org/apache/felix/dm/benchmark/controller/impl/ScenarioControllerImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.benchmark/src/org/apache/felix/dm/benchmark/controller/impl/ScenarioControllerImpl.java
@@ -232,9 +232,7 @@
private void forEachScenarioBundle(List<String> tests, Consumer<Bundle> consumer) {
tests.stream().forEach(test -> {
Optional<Bundle> bundle = Stream.of(m_bctx.getBundles()).filter(b -> b.getSymbolicName().equals(test)).findFirst();
- bundle.ifPresent(b -> {
- consumer.accept(b);
- });
+ bundle.ifPresent(consumer::accept);
});
}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/bnd.bnd b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/bnd.bnd
index a11c3fd..e0940c8 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/bnd.bnd
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/bnd.bnd
@@ -44,8 +44,11 @@
javac.source: 1.8
javac.target: 1.8
-tester: biz.aQute.junit
+
+# all tests are configured to assume that dependencies are required by default
-runproperties: \
org.apache.felix.dependencymanager.loglevel=2,\
+ org.apache.felix.dependencymanager.lambda.defaultRequiredDependency=org.apache.felix.dm.lambda.itest,\
org.apache.felix.log.maxSize=100000,\
org.apache.felix.log.storeDebug=true,\
gosh.args=--noshutdown
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterAndConsumerTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterAndConsumerTest.java
index 54c9d58..1560d2d 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterAndConsumerTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterAndConsumerTest.java
@@ -35,7 +35,7 @@
Ensure e = new Ensure();
Component provider = component(m).provides(OriginalService.class).impl(new ServiceProvider(e)).build();
- Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(AdaptedService.class).build();
+ Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(AdaptedService.class, true).build();
Component adapter = adapter(m, OriginalService.class).provides(AdaptedService.class).impl(ServiceAdapter.class).build();
// add the provider and the adapter
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithCallbackInstanceTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithCallbackInstanceTest.java
index ac8db12..4dd4c76 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithCallbackInstanceTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithCallbackInstanceTest.java
@@ -41,7 +41,7 @@
ServiceProvider serviceProvider = new ServiceProvider(e);
Component provider = component(m).provides(OriginalService.class).impl(serviceProvider).build();
- Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(AdaptedService.class).build();
+ Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(AdaptedService.class, true).build();
ServiceAdapterCallbackInstance callbackInstance = new ServiceAdapterCallbackInstance(e);
Component adapter = adapter(m, OriginalService.class)
@@ -82,7 +82,7 @@
ServiceProvider serviceProvider = new ServiceProvider(e);
Component provider = component(m).provides(OriginalService.class).impl(serviceProvider).build();
- Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(AdaptedService.class).build();
+ Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(AdaptedService.class, true).build();
ServiceAdapterCallbackInstance callbackInstance = new ServiceAdapterCallbackInstance(e);
Component adapter = adapter(m, OriginalService.class, adp -> adp
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithInstanceBoundDependencyTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithInstanceBoundDependencyTest.java
index 87747ae..c3df8d5 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithInstanceBoundDependencyTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithInstanceBoundDependencyTest.java
@@ -38,7 +38,7 @@
Component sp = component(m).provides(ServiceInterface.class).impl(new ServiceProvider(e)).build();
Component sp2 = component(m).provides(ServiceInterface2.class).impl(new ServiceProvider2(e)).build();
- Component sc = component(m).impl(new ServiceConsumer(e)).autoAdd(false).withSvc(ServiceInterface3.class).build();
+ Component sc = component(m).impl(new ServiceConsumer(e)).autoAdd(false).withSvc(ServiceInterface3.class, true).build();
Component sa = adapter(m, ServiceInterface.class).provides(ServiceInterface3.class).impl(new ServiceAdapter(e)).build();
m.add(sc);
m.add(sp);
@@ -106,7 +106,7 @@
}
public void init() {
m_ensure.step(1);
- component(m_component, c->c.withSvc(ServiceInterface2.class));
+ component(m_component, c->c.withSvc(ServiceInterface2.class, true));
}
public void start() {
m_ensure.step(2);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithModifiedInstanceBoundDependencyTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithModifiedInstanceBoundDependencyTest.java
index 10e2f08..502a587 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithModifiedInstanceBoundDependencyTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithModifiedInstanceBoundDependencyTest.java
@@ -117,7 +117,7 @@
Component a = component(m).impl(new AImpl(e)).provides(A.class).properties(foo -> "bar").build();
Component b = adapter(m, A.class).provides(B.class).impl(new BImpl(e)).add("addA").change("changeA").remove("removeA").build();
- Component c = component(m).impl(new CImpl()).provides(C.class).withSvc(A.class, "(foo=bar)").build();
+ Component c = component(m).impl(new CImpl()).provides(C.class).withSvc(A.class, "(foo=bar)", true).build();
m.add(a);
m.add(c);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectChainTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectChainTest.java
index 6e16f25..c2f43d3 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectChainTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectChainTest.java
@@ -35,7 +35,7 @@
Ensure e = new Ensure();
// create a service provider and consumer
Component sp = component(m).impl(new ServiceProvider(e)).provides(ServiceInterface.class).build();
- Component sc = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class).build();
+ Component sc = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class, true).build();
Component sa2 = aspect(m, ServiceInterface.class).rank(20).impl(new ServiceAspect(e, 3)).build();
Component sa3 = aspect(m, ServiceInterface.class).rank(30).impl(new ServiceAspect(e, 2)).build();
Component sa1 = aspect(m, ServiceInterface.class).rank(10).impl(new ServiceAspect(e, 4)).build();
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AutoConfigTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AutoConfigTest.java
index 904cf69..65eacfd 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AutoConfigTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AutoConfigTest.java
@@ -148,7 +148,7 @@
}
private Component createConsumer(DependencyManager dm, Object consumer) {
- return component(dm).impl(consumer).withSvc(Provider.class).build();
+ return component(dm).impl(consumer).withSvc(Provider.class, true).build();
}
public static interface Provider extends Runnable {
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/CFDependencyTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/CFDependencyTest.java
index 2e89d51..6b70661 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/CFDependencyTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/CFDependencyTest.java
@@ -39,7 +39,7 @@
// Create a consumer depending on a Provider and on the result of a CF.
// (the CF dependency is added from the Consumer.init() method).
CompletableFuture<String> cf = new CompletableFuture<>();
- Component consumer = component(dm).impl(new Consumer(cf)).withSvc(Provider.class).build();
+ Component consumer = component(dm).impl(new Consumer(cf)).withSvc(Provider.class, true).build();
// Create provider
Component provider = component(dm).impl(new ProviderImpl()).provides(Provider.class).build();
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ComponentTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ComponentTest.java
index 27c8d4f..256cad8 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ComponentTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ComponentTest.java
@@ -54,6 +54,30 @@
m_ensure.waitForStep(5, 5000);
}
+ public void testSimple2() throws Exception {
+ final DependencyManager dm = getDM();
+
+ // Create consumer (dependency is required by default using builder api).
+ component(dm, comp -> comp
+ .factory(Consumer::new)
+ .withSvc(Provider.class, srv -> srv.filter("(name=provider2)").add("add").remove("remove"))
+ .withSvc(Provider.class, "(name=provider1)", "m_autoConfiguredProvider", true));
+
+ // Create providers (auto added to dependency manager)
+ component(dm, comp -> comp
+ .impl(new Provider() { public String toString() { return "provider1";}})
+ .provides(Provider.class).properties("name", "provider1"));
+
+ component(dm, comp -> comp
+ .impl(new Provider() { public String toString() { return "provider2";}})
+ .provides(Provider.class).properties("name", "provider2"));
+
+ m_ensure.waitForStep(2, 5000);
+ dm.clear();
+ m_ensure.waitForStep(5, 5000);
+ }
+
+
public static interface Provider {
}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/DynamicProxyAspectTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/DynamicProxyAspectTest.java
index e13f41f..099d417 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/DynamicProxyAspectTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/DynamicProxyAspectTest.java
@@ -62,7 +62,7 @@
// through the proxy twice
Component sc = component(m)
.impl(new ServiceConsumer(e))
- .withSvc(ServiceInterface.class, ServiceInterface2.class).build();
+ .withSvc(true, ServiceInterface.class, ServiceInterface2.class).build();
// register both producers, validate that both services are started
m.add(sp1);
@@ -114,7 +114,7 @@
// through the proxy twice
Component sc = component(m)
.impl(new ServiceConsumer(e))
- .withSvc(ServiceInterface.class, ServiceInterface2.class).build();
+ .withSvc(true, ServiceInterface.class, ServiceInterface2.class).build();
// register both producers, validate that both services are started
m.add(sp1);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FactoryConfigurationAdapterTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FactoryConfigurationAdapterTest.java
index d6759dd..28145a9 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FactoryConfigurationAdapterTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FactoryConfigurationAdapterTest.java
@@ -54,13 +54,13 @@
// Create a Configuration instance, which will create/update/remove a configuration for factoryPid "MyFactoryPid"
ConfigurationCreator configurator = new ConfigurationCreator("MyFactoryPid", "key", "value1");
- Component s1 = component(m).impl(configurator).withSvc(ConfigurationAdmin.class).build();
+ Component s1 = component(m).impl(configurator).withSvc(ConfigurationAdmin.class, true).build();
// Create an Adapter that will be instantiated, once the configuration is created.
// This Adapter provides an AdapterService, and depends on an AdapterExtraDependency service.
Component s2 = factoryPidAdapter(m)
.factoryPid("MyFactoryPid").impl(adapterImplClass).update(adapterUpdate).propagate().provides(AdapterService.class, "foo", "bar")
- .withSvc(AdapterExtraDependency.class)
+ .withSvc(AdapterExtraDependency.class, true)
.build();
// Create extra adapter service dependency upon which our adapter depends on.
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FactoryInjectedWithConfigurationBeforeTheCreateMethod.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FactoryInjectedWithConfigurationBeforeTheCreateMethod.java
index 01a3d93..f4deb80 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FactoryInjectedWithConfigurationBeforeTheCreateMethod.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FactoryInjectedWithConfigurationBeforeTheCreateMethod.java
@@ -45,7 +45,7 @@
m_e = new Ensure();
// Create the component that creates a configuration.
- Component configurator = component(m).impl(new Configurator("foobar")).withSvc(ConfigurationAdmin.class).build();
+ Component configurator = component(m).impl(new Configurator("foobar")).withSvc(ConfigurationAdmin.class, true).build();
// Create the object that has to be injected with the configuration before its create method is called.
MyFactory factory = new MyFactory();
@@ -67,7 +67,7 @@
m_e = new Ensure();
// Create the component that creates a configuration.
- Component configurator = component(m).impl(new Configurator("foobar")).withSvc(ConfigurationAdmin.class).build();
+ Component configurator = component(m).impl(new Configurator("foobar")).withSvc(ConfigurationAdmin.class, true).build();
// Create the object that has to be injected with the configuration before its create method is called.
MyFactory factory = new MyFactory();
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependencyTest2.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependencyTest2.java
index def5566..2375cf4 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependencyTest2.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependencyTest2.java
@@ -44,7 +44,7 @@
Component sp = component(m)
.impl(ServiceProvider.class)
.provides(ServiceInterface.class, "foo", "bar")
- .init(ServiceProvider::init).start(ServiceProvider::start).stop(ServiceProvider::stop)
+ .init("init").start("start").stop("stop")
.build();
Component sc = component(m)
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleServiceDependencyTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleServiceDependencyTest.java
index 0d55e23..292e9a4 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleServiceDependencyTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleServiceDependencyTest.java
@@ -35,7 +35,7 @@
// create a service provider and consumer
Component provider = component(m).impl(new ServiceProvider(e)).provides(ServiceInterface.class.getName()).build();
Component providerWithHighRank = component(m).impl(new ServiceProvider2(e)).provides(ServiceInterface.class.getName(), Constants.SERVICE_RANKING, Integer.valueOf(5)).build();
- Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class).build();
+ Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class, true).build();
m.add(provider);
m.add(providerWithHighRank);
m.add(consumer);
@@ -55,7 +55,7 @@
// create a service provider and consumer
Component provider = component(m).impl(new ServiceProvider(e)).provides(ServiceInterface.class.getName()).build();
Component provider2 = component(m).impl(new ServiceProvider2(e)).provides(ServiceInterface.class.getName()).build();
- Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class).build();
+ Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class, true).build();
m.add(provider2);
m.add(consumer);
e.waitForStep(3, 5000);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyInjectionTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyInjectionTest.java
index 7192423..e88360b 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyInjectionTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyInjectionTest.java
@@ -34,7 +34,7 @@
// create a service provider and consumer
ServiceProvider provider = new ServiceProvider(e);
Component sp = component(m).impl(provider).provides(ServiceInterface2.class.getName()).build();
- Component sc = component(m).impl(new ServiceConsumer()).withSvc(ServiceInterface2.class).build();
+ Component sc = component(m).impl(new ServiceConsumer()).withSvc(ServiceInterface2.class, true).build();
Component sc2 = component(m) // all dependencies are optional
.impl(new ServiceConsumerNamedInjection(false, false))
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyTest.java
index 4b9e95a..bc7b132 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyTest.java
@@ -33,7 +33,7 @@
Ensure e = new Ensure();
// create a service provider and consumer
Component sp = component(m).impl(new ServiceProvider(e)).provides(ServiceInterface.class).build();
- Component sc = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class).build();
+ Component sc = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class, true).build();
Component sc2 = component(m).impl(new ServiceConsumerCallbacks(e))
.withSvc(ServiceInterface.class, srv -> srv.required(false).add(ServiceConsumerCallbacks::add).remove(ServiceConsumerCallbacks::remove))
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/TemporalServiceDependencyTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/TemporalServiceDependencyTest.java
index 677b08d..f9f8ac1 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/TemporalServiceDependencyTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/TemporalServiceDependencyTest.java
@@ -18,6 +18,7 @@
*/
package org.apache.felix.dm.lambda.itest;
+import static org.apache.felix.dm.lambda.DependencyManagerActivator.adapter;
import static org.apache.felix.dm.lambda.DependencyManagerActivator.component;
import static org.apache.felix.dm.lambda.DependencyManagerActivator.serviceDependency;
@@ -110,7 +111,7 @@
TemporalServiceProvider2 provider2 = new TemporalServiceProvider2(e);
Component sp2 = component(m).impl(provider2).provides(TemporalServiceInterface.class.getName()).build();
TemporalServiceConsumerAdapterWithCallback consumer = new TemporalServiceConsumerAdapterWithCallback(e);
- Component sc = m.createAdapterService(Adaptee.class, null).setImplementation(consumer);
+ Component sc = adapter(m, Adaptee.class).impl(consumer).build();
ServiceDependency temporalDep = serviceDependency(sc, TemporalServiceInterface.class).timeout(10000).add("add").remove("remove").build();
sc.add(temporalDep);
Component adaptee = component(m).impl(new Adaptee()).provides(Adaptee.class.getName()).build();
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/dictionary.bndrun b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/dictionary.bndrun
index 08d70ca..523f3a3 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/dictionary.bndrun
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/dictionary.bndrun
@@ -36,9 +36,8 @@
org.apache.felix.webconsole;version=4.2.2,\
org.apache.felix.http.api;version=2.3.0,\
org.apache.felix.http.servlet-api;version=1.0.0,\
- org.apache.felix.http.jetty;version="[2.3.0,2.3.0]"
+ org.apache.felix.http.jetty;version='[2.3.0,2.3.0]'
-
-runproperties: \
org.apache.felix.dependencymanager.loglevel=2,\
org.apache.felix.log.maxSize=100000,\
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Activator.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Activator.java
index dbb3c3c..248ff52 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Activator.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Activator.java
@@ -29,13 +29,14 @@
/**
* Creates a "Provider" service. The implementation for this service (ProviderImpl) is
* created using a factory class (ProviderFactory) that also creates some other helper classes
- * (ProviderComposite1 and ProviderComposite2) that are internally used by ProviderImpl.
+ * that are internally used by ProviderImpl (ProviderComposite1 and ProviderComposite2).
*
* The ProviderFactory is also injected with a Configuration that can be used by the Factory
* when creating the ProviderImpl, ProviderComposite1, and ProviderComposite2 classes.
*
* The LogService in only injected to the ProviderImpl and the ProviderComposite1 classes.
- * Both composites are called in their "start" callbacks, when all required dependencies are available.
+ * objects being part of the composition are called in "start" lifecycle callback when all
+ * required dependencies are available.
*
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
@@ -53,11 +54,10 @@
// before creating the composition of classes.
component(comp -> comp
.factory(factory::create, factory::getComposition)
- .start(ProviderImpl::start) // only call start on ProviderImpl
- .withSvc(LogService.class, srv -> srv.add(ProviderImpl::bind).add(ProviderComposite1::bind))
+ .withSvc(LogService.class, svc -> svc.required().add(ProviderImpl::bind).add(ProviderComposite1::bind))
.withCnf(conf -> conf.update(MyConfig.class, factory::updated)));
// Creates a configuration with pid name = "org.apache.felix.dependencymanager.lambda.samples.compositefactory.ProviderFactory"
- component(comp -> comp.impl(Configurator.class).withSvc(ConfigurationAdmin.class));
+ component(comp -> comp.impl(Configurator.class).withSvc(ConfigurationAdmin.class, true));
}
}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/Activator.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/Activator.java
index 793a50d..8600e54 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/Activator.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/Activator.java
@@ -46,8 +46,8 @@
// Creates a component that simply displays all available DeviceParameter adapter services.
component(comp -> comp
.impl(DeviceAccessConsumer.class)
- .withSvc(LogService.class)
- .withSvc(DeviceAccess.class, device -> device.add(DeviceAccessConsumer::add)));
+ .withSvc(LogService.class, true)
+ .withSvc(DeviceAccess.class, device -> device.required().add(DeviceAccessConsumer::add)));
}
private void createDeviceAndParameter(int id) {
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/DeviceAccessImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/DeviceAccessImpl.java
index 5b4033d..b241202 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/DeviceAccessImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/DeviceAccessImpl.java
@@ -35,7 +35,7 @@
component(c, builder -> builder
.properties("device.access.id", device.getDeviceId())
- .withSvc(DeviceParameter.class, srv -> srv.filter("(device.id=" + device.getDeviceId() + ")")));
+ .withSvc(DeviceParameter.class, svc -> svc.filter("(device.id=" + device.getDeviceId() + ")")));
}
@Override
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/dictionary/Activator.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/dictionary/Activator.java
index 8e4482e..40f38f0 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/dictionary/Activator.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/dictionary/Activator.java
@@ -42,7 +42,7 @@
.provides(DictionaryService.class)
.propagate()
.update(DictionaryConfiguration.class, DictionaryImpl::updated)
- .withSvc(LogService.class));
+ .withSvc(LogService.class, true));
// Create the Dictionary Aspect that decorates any registered Dictionary service. For each Dictionary, an instance of the
// DictionaryAspect service is created).
@@ -50,14 +50,13 @@
.impl(DictionaryAspect.class)
.filter("(lang=en)").rank(10)
.withCnf(conf -> conf.update(DictionaryAspectConfiguration.class, DictionaryAspect::addWords))
- .withSvc(LogService.class));
+ .withSvc(LogService.class, true));
// Create the SpellChecker component. It depends on all available DictionaryService instances, possibly
// decorated by some DictionaryAspects.
component(comp -> comp
.impl(SpellChecker.class)
.provides(SpellChecker.class, COMMAND_SCOPE, "dictionary", COMMAND_FUNCTION, new String[] {"spellcheck"})
- .withSvc(DictionaryService.class)
- .withSvc(LogService.class));
+ .withSvc(true, LogService.class, DictionaryService.class));
}
}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/dictionary/DictionaryImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/dictionary/DictionaryImpl.java
index ed1b499..87328f9 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/dictionary/DictionaryImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/dictionary/DictionaryImpl.java
@@ -53,7 +53,7 @@
* Our Dictionary language.
*/
private String m_lang;
-
+
/**
* Our service will be initialized from ConfigAdmin.
* @param config The configuration where we'll lookup our words list (key=".words").
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/factory/Activator.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/factory/Activator.java
index 7e884e3..26fb28d 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/factory/Activator.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/factory/Activator.java
@@ -36,7 +36,6 @@
component(comp -> comp
.factory(ProviderFactory::new, ProviderFactory::create)
.provides(Provider.class)
- .start(ProviderImpl::start)
- .withSvc(LogService.class, log -> log.add(ProviderImpl::set)));
+ .withSvc(LogService.class, log -> log.required().add(ProviderImpl::set)));
}
}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/future/Activator.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/future/Activator.java
index a1e9a9e..3a11dd6 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/future/Activator.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/future/Activator.java
@@ -51,7 +51,7 @@
component(comp -> comp
.factory(() -> new PageLinksImpl("http://felix.apache.org/"))
.provides(PageLinks.class)
- .withSvc(LogService.class, log -> log.add(PageLinksImpl::bind)));
+ .withSvc(LogService.class, log -> log.required().add(PageLinksImpl::bind)));
// Just wait for the PageLinks service and display all links found from the Felix web site.
component(comp -> comp.impl(this).withSvc(PageLinks.class, page -> page.add(this::setPageLinks)));
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/future/PageLinksImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/future/PageLinksImpl.java
index f74f1bb..32f1de7 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/future/PageLinksImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/future/PageLinksImpl.java
@@ -20,14 +20,16 @@
import static org.apache.felix.dm.lambda.DependencyManagerActivator.component;
+import java.io.BufferedReader;
import java.io.IOException;
+import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
-import java.util.Scanner;
import java.util.concurrent.CompletableFuture;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import java.util.stream.Collectors;
import org.apache.felix.dm.Component;
import org.osgi.service.log.LogService;
@@ -73,19 +75,12 @@
return m_links;
}
- private String download(String url) {
- try (Scanner in = new Scanner(new URL(url).openStream())) {
- StringBuilder builder = new StringBuilder();
- while (in.hasNextLine()) {
- builder.append(in.nextLine());
- builder.append("\n");
- }
- return builder.toString();
- } catch (IOException ex) {
- RuntimeException rex = new RuntimeException();
- rex.initCause(ex);
- throw rex;
- }
+ public static String download(String url) {
+ try (BufferedReader buffer = new BufferedReader(new InputStreamReader(new URL(url).openStream()))) {
+ return buffer.lines().collect(Collectors.joining("\n"));
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
}
private List<String> parseLinks(String content) {
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/Activator.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/Activator.java
index 8281f14..0757d59 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/Activator.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/Activator.java
@@ -28,6 +28,8 @@
import org.osgi.service.log.LogService;
/**
+ * Hello world example.
+ *
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class Activator extends DependencyManagerActivator {
@@ -35,26 +37,29 @@
public void init(BundleContext ctx, DependencyManager dm) throws Exception {
out.println("type \"log warn\" to see the logs emitted by this test.");
+ // Creates a component that populates some properties in the Configuration Admin.
+ // Here, we inject the CM (Configuration Admin) service dependency using a method reference:
+
+ component(comp -> comp.factory(() -> new Configurator(Configuration.class.getName()))
+ .withSvc(ConfigurationAdmin.class, svc -> svc.required().add(Configurator::bind)));
+
// Creates a Service Provider (property names are deduced from lambda parameter names).
- // (service dependencies are required by default)
+ // The provider depends on a required log service, injected by reflection on compatible class fields.
+
component(comp -> comp.impl(ServiceProviderImpl.class)
.provides(ServiceProvider.class, p1 -> "v1", p2 -> 123)
- .withSvc(LogService.class));
+ .withSvc(LogService.class, true /* required */));
- // Creates a Service Consumer. we depend on LogService, EventAdmin and on our ServiceProvider.
- // (LogService and EventAdmin are declared in one single method call).
+ // Creates a Service Consumer which depends on LogService, EventAdmin and on the ServiceProvider.
+ // LogService and EventAdmin are declared in one single method call, and are injected in class fields.
// We also depend on a configuration. the configuration callback is assumed to be the "ServiceConsumer.updated" method which
// takes as argument a "Configuration" interface. This interface is used to wrap the actual properties behind a dynamic proxy
// that is implemented by Dependency Manager.
// The pid is assumed to be by default the fqdn of the specified Configuration interface ("org.apache.felix.dm.lambda.samples.hello.Configuration").
- component(comp -> comp.impl(ServiceConsumer.class)
- .withSvc(LogService.class, EventAdmin.class)
- .withSvc(ServiceProvider.class, srv -> srv.filter("(p1=v1)"))
- .withCnf(Configuration.class)); // shortcut for "withCnf(Configuration.class, cnf -> cnf.updated(Configuration.class, ServiceConsumer::updated)"
- // Creates a component that populates some properties in the Configuration Admin.
- // Here, we inject the CM (Configuration Admin) service dependency using a method reference:
- component(comp -> comp.factory(() -> new Configurator(Configuration.class.getName()))
- .withSvc(ConfigurationAdmin.class, srv -> srv.add(Configurator::bind)));
+ component(comp -> comp.impl(ServiceConsumer.class)
+ .withSvc(true /* required */, LogService.class, EventAdmin.class)
+ .withSvc(ServiceProvider.class, "(p1=v1)", true /* required */)
+ .withCnf(Configuration.class));
}
}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/ServiceConsumer.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/ServiceConsumer.java
index ef5cc8c..6d296b5 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/ServiceConsumer.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/ServiceConsumer.java
@@ -32,7 +32,7 @@
volatile EventAdmin eventAdmin;
public void updated(Configuration conf) {
- System.out.println(conf.getFoo());
+ // conf.getFoo() returns "bar"
}
public void start() {
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/ServiceProviderImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/ServiceProviderImpl.java
index 99af097..846e7a1 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/ServiceProviderImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/ServiceProviderImpl.java
@@ -34,7 +34,7 @@
* as volatile will ensure safe publication if the log service is replaced at runtime.
*/
volatile LogService log;
-
+
void start() {
// Default lifecycle start calback (all required dependencies have been injected when start is called,
// and all optional dependency callbacks will be invoked after the start method. This allows to easily
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/BundleDependencyBuilder.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/BundleDependencyBuilder.java
index 02dab2c..f589f82 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/BundleDependencyBuilder.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/BundleDependencyBuilder.java
@@ -30,7 +30,6 @@
/**
* Builds a Dependency Manager Bundle Dependency.
- * When a bundle dependency is not explicitly defined as "required" or "optional", then it is assumed to be required by default.
*
* <p> Example of a Pojo Component which tracks a started bundle having a given bundle symbolic name:
*
@@ -80,6 +79,13 @@
public BundleDependencyBuilder required();
/**
+ * Sets the dependency to be optional.
+ *
+ * @return the bundle dependency builder
+ */
+ public BundleDependencyBuilder optional();
+
+ /**
* Sets the bundle to depend on directly.
*
* @param bundle the bundle to depend on
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ComponentBuilder.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ComponentBuilder.java
index 21919ab..2298f62 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ComponentBuilder.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ComponentBuilder.java
@@ -26,8 +26,6 @@
import java.util.stream.Stream;
import org.apache.felix.dm.Component;
-import org.apache.felix.dm.lambda.callbacks.Cb;
-import org.apache.felix.dm.lambda.callbacks.CbComponent;
import org.apache.felix.dm.lambda.callbacks.InstanceCb;
import org.apache.felix.dm.lambda.callbacks.InstanceCbComponent;
@@ -38,13 +36,13 @@
* required dependencies are available. This interface is also the base interface for extended components like
* aspects, adapters, etc ...
*
- * <p> Example of a component that depends on a ConfigurationAdmin service. The dependency is injected by reflection
- * on a class field which type matches the ConfigurationAdmin interface:
+ * <p> Example of a component that depends on a LogServce service. The dependency is injected by reflection
+ * on fields having a compatible type with the LogService interface:
*
* <pre>{@code
* public class Activator extends DependencyManagerActivator {
* public void init(BundleContext ctx, DependencyManager dm) throws Exception {
- * component(comp -> comp.impl(Configurator.class).withSvc(ConfigurationAdmin.class));
+ * component(comp -> comp.impl(Pojo.class).withSvc(LogService.class));
* }
* }
* } </pre>
@@ -356,32 +354,81 @@
B properties(FluentProperty ... properties);
/**
- * Adds a required/autoconfig service dependency.
- *
- * @param service the service dependency filter
- * @param filter the service filter
- * @return this builder
- */
- B withSvc(Class<?> service, String filter);
-
- /**
- * Adds in one shot multiple required/autoconfig service dependencies.
- * @param services the dependencies that are required and that will be injected in any field with the same dependency type.
- * @return this builder
- */
- B withSvc(Class<?> ... services);
-
- /**
* Adds a service dependency built using a Consumer lambda that is provided with a ServiceDependencyBuilder.
*
* @param <U> the type of the dependency service
* @param service the service
- * @param consumer the lambda for building the service dependency
+ * @param consumer the lambda used to build the service dependency
* @return this builder.
*/
<U> B withSvc(Class<U> service, Consumer<ServiceDependencyBuilder<U>> consumer);
/**
+ * Adds in one shot multiple service dependencies injected in compatible class fields.
+ *
+ * @param services some dependencies to inject in compatible class fields.
+ * @return this builder
+ */
+ @SuppressWarnings("unchecked")
+ default B withSvc(Class<?> ... services) {
+ Stream.of(services).forEach(s -> withSvc(s, svc -> svc.autoConfig()));
+ return (B) this;
+ }
+
+ /**
+ * Adds in one shot multiple service dependencies injected in compatible class fields.
+ *
+ * @param required true if the dependency is required, false if not
+ * @param services some dependencies to inject in compatible class fields.
+ * @return this builder
+ */
+ @SuppressWarnings("unchecked")
+ default B withSvc(boolean required, Class<?> ... services) {
+ Stream.of(services).forEach(s -> withSvc(s, svc -> svc.required(required)));
+ return (B) this;
+ }
+
+ /**
+ * Adds a service dependency injected in compatible class fields.
+ *
+ * @param service a service dependency
+ * @param required true if the dependency is required, false if not
+ * @return this builder
+ */
+ @SuppressWarnings("unchecked")
+ default B withSvc(Class<?> service, boolean required) {
+ withSvc(service, svc -> svc.required(required));
+ return (B) this;
+ }
+
+ /**
+ * Adds a service dependency injected in compatible class fields.
+ *
+ * @param <T> the service dependency type
+ * @param service the service dependency.
+ * @param filter the service filter
+ * @param required true if the dependency is required, false if not
+ * @return this builder
+ */
+ default <T> B withSvc(Class<T> service, String filter, boolean required) {
+ return withSvc(service, svc -> svc.filter(filter).required(required));
+ }
+
+ /**
+ * Adds a service dependency injected in a given compatible class field.
+ *
+ * @param <T> the service dependency type
+ * @param service the service dependency
+ * @param filter the service filter
+ * @param field the class field when the dependency has to be injected
+ * @param required true if the dependency is required, false if not
+ * @return this builder
+ */
+ default <T> B withSvc(Class<T> service, String filter, String field, boolean required) {
+ return withSvc(service, svc -> svc.filter(filter).autoConfig(field).required(required));
+ }
+
+ /**
* Adds a configuration dependency.
* @param consumer the lambda used to build the configuration dependency.
* @return this builder.
@@ -402,6 +449,8 @@
/**
* Adds a configuration dependency using a configuration type. The configuration is injected in an updated callback which takes in argument
* an implementation of the specified configuration type.
+ *
+ * @param configType the configuration type that will be injected to the "updated" callback
* @return this builder
* @see ConfigurationDependencyBuilder
*/
@@ -425,26 +474,7 @@
* @return this builder.
*/
<U> B withFuture(CompletableFuture<U> future, Consumer<FutureDependencyBuilder<U>> consumer);
-
- /**
- * Sets the instance to invoke with the reflection based lifecycle callbacks. By default, reflection based
- * lifecycle callbacks (init/start/stop/destroy) methods are invoked on the component implementation instance(s).
- * But you can set a specific callback instance using this method.
- * <p>
- * Specifying an instance means you can create a manager
- * that will be invoked whenever the life cycle of a component changes and this manager
- * can then decide how to expose this life cycle to the actual component, offering an
- * important indirection when developing your own component models.
- *
- * @see #init(String)
- * @see #start(String)
- * @see #stop(String)
- * @see #destroy(String)
- * @param lifecycleCallbackInstance the instance the lifecycle callback will be invoked on.
- * @return this builder.
- */
- B lifecycleCallbackInstance(Object lifecycleCallbackInstance);
-
+
/**
* Sets the name of the method used as the "init" callback. This method, when found, is
* invoked as part of the life cycle management of the component implementation.
@@ -464,7 +494,52 @@
B init(String callback);
/**
- * Sets the name of the method used as the "start" callback. This method, when found, is
+ * Sets a callback instance and the name of the method used as the "init" callback. This method, when found, is
+ * invoked as part of the life cycle management of the component implementation.
+ * This method is useful because when it is invoked, all required dependencies defines in the Activator
+ * are already injected, and you can then add more extra dependencies from the init() method.
+ * And once all extra dependencies will be available and injected, then the "start" callback will be invoked.
+ * <p>The dependency manager will look for a method of this name with the following signatures,
+ * in this order:
+ * <ol>
+ * <li>method(Component component)</li>
+ * <li>method()</li>
+ * </ol>
+ *
+ * @param callbackInstance a callback instance object the callback is invoked on
+ * @param callback the callback name
+ * @return this builder.
+ */
+ B init(Object callbackInstance, String callback);
+
+ /**
+ * Sets an Object instance method reference used as the "init" callback. It is invoked as part of the life cycle management of the component
+ * implementation.
+ * This method is useful because when it is invoked, all required dependencies defines in the Activator
+ * are already injected, and you can then add more extra dependencies from the init() method.
+ * And once all extra dependencies will be available and injected, then the "start" callback will be invoked.
+ * The method does not take any parameters.
+ *
+ * @param callback an Object instance method reference. The method does not take any parameters.
+ * @return this builder
+ */
+ B init(InstanceCb callback);
+
+ /**
+ * Sets an Object instance method reference used as the "init" callback. It is invoked as part of the life cycle management of the component
+ * implementation.
+ * This method is useful because when it is invoked, all required dependencies defines in the Activator
+ * are already injected, and you can then add more extra dependencies from the init() method.
+ * And once all extra dependencies will be available and injected, then the "start" callback will be invoked.
+ * The method takes as argument a Component parameter.
+ *
+ * @param callback an Object instance method reference. The method takes as argument a Component parameter.
+ * @return this builder
+ */
+ B init(InstanceCbComponent callback);
+
+ /**
+ * Sets a callback instance and the name of the method used as the "start" callback. This method, when found, is
* invoked as part of the life cycle management of the component implementation. <p>The
* dependency manager will look for a method of this name with the following signatures,
* in this order:
@@ -479,6 +554,42 @@
B start(String callback);
/**
+ * Sets the name of the method used as the "start" callback. This method, when found, is
+ * invoked as part of the life cycle management of the component implementation. <p>The
+ * dependency manager will look for a method of this name with the following signatures,
+ * in this order:
+ * <ol>
+ * <li>method(Component component)</li>
+ * <li>method()</li>
+ * </ol>
+ *
+ * @param callbackInstance a callback instance object the callback is invoked on
+ * @param callback the callback name
+ * @return this builder.
+ */
+ B start(Object callbackInstance, String callback);
+
+ /**
+ * Sets an Object instance method reference used as the "start" callback.
+ * This method is invoked as part of the life cycle management of the component implementation.
+ * The method does not take any parameters.
+ *
+ * @param callback an Object instance method reference. The method does not take any parameters.
+ * @return this builder.
+ */
+ B start(InstanceCb callback);
+
+ /**
+ * Sets an Object instance method reference used as the "start" callback.
+ * This method is invoked as part of the life cycle management of the component implementation.
+ * The method takes as argument a Component parameter.
+ *
+ * @param callback an Object instance method reference. The method takes as argument a Component parameter.
+ * @return this builder.
+ */
+ B start(InstanceCbComponent callback);
+
+ /**
* Sets the name of the method used as the "stop" callback. This method, when found, is
* invoked as part of the life cycle management of the component implementation. <p>The
* dependency manager will look for a method of this name with the following signatures,
@@ -494,6 +605,45 @@
B stop(String callback);
/**
+ * Sets a callback instance and the name of the method used as the "stop" callback. This method, when found, is
+ * invoked as part of the life cycle management of the component implementation. <p>The
+ * dependency manager will look for a method of this name with the following signatures,
+ * in this order:
+ * <ol>
+ * <li>method(Component component)</li>
+ * <li>method()</li>
+ * </ol>
+ *
+ * @param callbackInstance a callback instance object the callback is invoked on
+ * @param callback the callback name
+ * @return this builder.
+ */
+ B stop(Object callbackInstance, String callback);
+
+ /**
+ * Sets an Object instance method reference used as the "stop" callback. It is invoked as part of the life cycle management of the component
+ * implementation.
+ * This method is useful because when it is invoked, all required dependencies defines in the Activator
+ * are already injected, and you can then add more extra dependencies from the init() method.
+ * And once all extra dependencies will be available and injected, then the "start" callback will be invoked.
+ * The method does not take any parameters.
+ *
+ * @param callback an Object instance method reference. The method does not take any parameters.
+ * @return this builder
+ */
+ B stop(InstanceCb callback);
+
+ /**
+ * Sets an Object instance method reference used as the "stop" callback.
+ * This method is invoked as part of the life cycle management of the component implementation.
+ * The method takes as argument a Component parameter.
+ *
+ * @param callback an Object instance method reference. The method takes as argument a Component parameter.
+ * @return this builder.
+ */
+ B stop(InstanceCbComponent callback);
+
+ /**
* Sets the name of the method used as the "destroy" callback. This method, when found, is
* invoked as part of the life cycle management of the component implementation. <p>The
* dependency manager will look for a method of this name with the following signatures,
@@ -507,138 +657,24 @@
* @return this builder.
*/
B destroy(String callback);
-
- /**
- * Sets a reference to a component implementation class "init" callback method.
- * This method does not take any arguments and is
- * invoked as part of the life cycle management of the component implementation.
- * This method is useful because when it is invoked, all required dependencies defines in the Activator
- * are already injected, and you can then add more extra dependencies from the init() method.
- * And once all extra dependencies will be available and injected, then the "start" callback will be invoked.
- *
- * @param <T> the type of the component class on which the callback is invoked on.
- * @param callback a method reference must point to method from the component implementation class(es).
- * @return this builder
- */
- <T> B init(Cb<T> callback);
-
- /**
- * Sets a reference to a component implementation class "start" callback method.
- * This method does not take any arguments and is
- * invoked as part of the life cycle management of the component implementation.
- *
- * @param <T> the type of the component class on which the callback is invoked on.
- * @param callback a method reference must point to method from one of the component implementation classes.
- * @return this builder.
- */
- <T> B start(Cb<T> callback);
-
- /**
- * Sets a reference to a component implementation class "stop" callback method.
- * This method does not take any arguments and is
- * invoked as part of the life cycle management of the component implementation.
- *
- * @param <T> the type of the component class on which the callback is invoked on.
- * @param callback a method reference must point to method from one of the component implementation classes.
- * @return this builder.
- */
- <T> B stop(Cb<T> callback);
-
- /**
- * Sets a reference to a component implementation class "destroy" callback method.
- * This method does not take any arguments and is
- * invoked as part of the life cycle management of the component implementation.
- *
- * @param <T> the type of the component class on which the callback is invoked on.
- * @param callback a method reference must point to method from one of the component implementation classes.
- * @return this builder.
- */
- <T> B destroy(Cb<T> callback);
-
- /**
- * Sets a reference to a component implementation class "init" callback method.
- * This method takes a Component argument and is
- * invoked as part of the life cycle management of the component implementation.
- * This method is useful because when it is invoked, all required dependencies defines in the Activator
- * are already injected, and you can then add more extra dependencies from the init() method.
- * And once all extra dependencies will be available and injected, then the "start" callback will be invoked.
- *
- * @param <T> the type of the component class on which the callback is invoked on.
- * @param callback a method reference must point to method from one of the component implementation classes. The method takes as argument a Component parameter.
- * @return this builder
- */
- <T> B init(CbComponent<T> callback);
/**
- * Sets a reference to a component implementation class "start" callback method.
- * This method takes a Component argument and is
- * invoked as part of the life cycle management of the component implementation.
+ * Sets a callback instance and the name of the method used as the "destroy" callback. This method, when found, is
+ * invoked as part of the life cycle management of the component implementation. <p>The
+ * dependency manager will look for a method of this name with the following signatures,
+ * in this order:
+ * <ol>
+ * <li>method(Component component)</li>
+ * <li>method()</li>
+ * </ol>
*
- * @param <T> the type of the component class on which the callback is invoked on.
- * @param callback a method reference must point to method from one of the component implementation classes. The method takes as argument a Component parameter.
+ * @param callbackInstance a callback instance object the callback is invoked on
+ * @param callback the callback name
* @return this builder.
*/
- <T> B start(CbComponent<T> callback);
-
- /**
- * Sets a reference to a component implementation class "stop" callback method.
- * This method takes a Component argument and is
- * invoked as part of the life cycle management of the component implementation.
- *
- * @param <T> the type of the component class on which the callback is invoked on.
- * @param callback a method reference must point to method from one of the component implementation classes. The method takes as argument a Component parameter.
- * @return this builder.
- */
- <T> B stop(CbComponent<T> callback);
-
- /**
- * Sets a reference to a component implementation class "destroy" callback method.
- * This method takes a Component argument and is
- * invoked as part of the life cycle management of the component implementation.
- *
- * @param <T> the type of the component class on which the callback is invoked on.
- * @param callback a method reference must point to method from one of the component implementation classes. The method takes as argument a Component parameter.
- * @return this builder.
- */
- <T> B destroy(CbComponent<T> callback);
+ B destroy(Object callbackInstance, String callback);
/**
- * Sets an Object instance method reference used as the "init" callback. It is invoked as part of the life cycle management of the component
- * implementation.
- * This method is useful because when it is invoked, all required dependencies defines in the Activator
- * are already injected, and you can then add more extra dependencies from the init() method.
- * And once all extra dependencies will be available and injected, then the "start" callback will be invoked.
- * The method does not take any parameters.
- *
- * @param callback an Object instance method reference. The method does not take any parameters.
- * @return this builder
- */
- B initInstance(InstanceCb callback);
-
- /**
- * Sets an Object instance method reference used as the "start" callback.
- * This method is invoked as part of the life cycle management of the component implementation.
- * The method does not take any parameters.
- *
- * @param callback an Object instance method reference. The method does not take any parameters.
- * @return this builder.
- */
- B startInstance(InstanceCb callback);
-
- /**
- * Sets an Object instance method reference used as the "stop" callback. It is invoked as part of the life cycle management of the component
- * implementation.
- * This method is useful because when it is invoked, all required dependencies defines in the Activator
- * are already injected, and you can then add more extra dependencies from the init() method.
- * And once all extra dependencies will be available and injected, then the "start" callback will be invoked.
- * The method does not take any parameters.
- *
- * @param callback an Object instance method reference. The method does not take any parameters.
- * @return this builder
- */
- B stopInstance(InstanceCb callback);
-
- /**
* Sets an Object instance method reference used as the "destroy" callback. It is invoked as part of the life cycle management of the component
* implementation.
* This method is useful because when it is invoked, all required dependencies defines in the Activator
@@ -649,42 +685,9 @@
* @param callback an Object instance method reference. The method does not take any parameters.
* @return this builder
*/
- B destroyInstance(InstanceCb callback);
+ B destroy(InstanceCb callback);
/**
- * Sets an Object instance method reference used as the "init" callback. It is invoked as part of the life cycle management of the component
- * implementation.
- * This method is useful because when it is invoked, all required dependencies defines in the Activator
- * are already injected, and you can then add more extra dependencies from the init() method.
- * And once all extra dependencies will be available and injected, then the "start" callback will be invoked.
- * The method takes as argument a Component parameter.
- *
- * @param callback an Object instance method reference. The method takes as argument a Component parameter.
- * @return this builder
- */
- B initInstance(InstanceCbComponent callback);
-
- /**
- * Sets an Object instance method reference used as the "start" callback.
- * This method is invoked as part of the life cycle management of the component implementation.
- * The method takes as argument a Component parameter.
- *
- * @param callback an Object instance method reference. The method takes as argument a Component parameter.
- * @return this builder.
- */
- B startInstance(InstanceCbComponent callback);
-
- /**
- * Sets an Object instance method reference used as the "stop" callback.
- * This method is invoked as part of the life cycle management of the component implementation.
- * The method takes as argument a Component parameter.
- *
- * @param callback an Object instance method reference. The method takes as argument a Component parameter.
- * @return this builder.
- */
- B stopInstance(InstanceCbComponent callback);
-
- /**
* Sets an Object instance method reference used as the "destroy" callback.
* This method is invoked as part of the life cycle management of the component implementation.
* The method takes as argument a Component parameter.
@@ -692,7 +695,7 @@
* @param callback an Object instance method reference. The method takes as argument a Component parameter.
* @return this builder.
*/
- B destroyInstance(InstanceCbComponent callback);
+ B destroy(InstanceCbComponent callback);
/**
* Configures OSGi object (BundleContext, Component, etc ...) that will be injected in any field having the same OSGi object type.
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/DependencyManagerActivator.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/DependencyManagerActivator.java
index 2dfb297..d30b3b3 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/DependencyManagerActivator.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/DependencyManagerActivator.java
@@ -85,6 +85,11 @@
* }
* }
* }</pre>
+ *
+ * When a dependency is not explicitly defined as "required" or "optional",
+ * then it is assumed to be optional by default, like it is the case with the original DM API.
+ * You can change the default mode using the "org.apache.felix.dependencymanager.lambda.defaultRequiredDependency system property"
+ * (see Felix dm-lambda online documentation).
*/
public abstract class DependencyManagerActivator implements BundleActivator {
/**
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceCallbacksBuilder.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceCallbacksBuilder.java
index b30cacf..c1c5ecd 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceCallbacksBuilder.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceCallbacksBuilder.java
@@ -40,8 +40,7 @@
import org.apache.felix.dm.lambda.callbacks.InstanceCbServiceServiceComponent;
/**
- * Builds a service dependency callback. When a service dependency is not explicitly defined as "required" or "optional",
- * then it is assumed to be required by default.
+ * Builds a service dependency callback.
*
* <p> A Service may be injected in a bind-method of a component or an object instance using this builder.
* The builder supports reflection based callbacks (same as with the original DM API), as well as java8 method reference based callbacks.
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceDependencyBuilder.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceDependencyBuilder.java
index 83f2015..cfcc5f8 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceDependencyBuilder.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceDependencyBuilder.java
@@ -27,8 +27,6 @@
/**
* Builds a Dependency Manager Service Dependency.
- * <p> When a service dependency is not explicitly defined as "required" or "optional", then it is assumed to be required by default.
- *
* <p> Sample code:
*
* <pre> {@code
@@ -36,11 +34,13 @@
* public void init(BundleContext ctx, DependencyManager dm) throws Exception {
* component(comp -> comp
* .impl(Pojo.class)
- * .withSrv(ConfigurationAdmin.class, "(vendor=apache)") // required service with a filter, injected in class field
- * .withSrv(Coordinator.class, LogService.class) // varargs of required dependencies injected on class fields
- * .withSrv(HttpService.class, svc -> srv.add(Pojo::setHttpService)) // required dependency injected using a method ref
- * .withSrv(ConnectorService.class, svc -> svc.optional()) // optional dependency, injected in class field with a NullObject if unavailable (before start() callback).
- * .withSrv(Tracked.class, srv -> srv.optional().add(Pojo::addTracked)) // optional dependency, injected using method ref, after the start() callback
+ * .withSvc(ConfigurationAdmin.class, LogService.class) // varargs of optional (possibly NullObjects) dependencies injected in compatible class fields
+ * .withSvc(true, Coordinator.class, LogService.class) // varargs of required dependencies injected in compatible class fields
+ * .withSvc(ConfigurationAdmin.class, "(vendor=apache)") // service with a filter, injected in compatible class fields
+ * .withSvc(ConfigurationAdmin.class, "(vendor=apache)", true) // required service with a filter, injected in compatible class fields
+ * .withSvc(ConfigurationAdmin.class, "(vendor=apache)", true, "field") // required service with a filter, injected in a given class field name
+ * .withSvc(HttpService.class, svc -> svc.required().add(Pojo::setHttpService)) // required dependency injected using a method reference
+ * .withSvc(Tracked.class, svc -> svc.optional().add(Pojo::addTracked)) // optional dependency, injected using method ref, after the start() callback
* }
* }}</pre>
*
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbService.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbService.java
index 024f9d9..97ed19c 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbService.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbService.java
@@ -35,7 +35,7 @@
*/
void accept(T instance, S service);
- default CbFuture<T, S> andThen(CbFuture<? super T, S> after) {
+ default CbService<T, S> andThen(CbService<? super T, S> after) {
Objects.requireNonNull(after);
return (T instance, S service) -> {
accept(instance, service);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCb.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCb.java
index 4b90a0e..47da62c 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCb.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCb.java
@@ -30,13 +30,13 @@
/**
* Implements the callback method.
*/
- void cb();
+ void callback();
default InstanceCb andThen(InstanceCb after) {
Objects.requireNonNull(after);
return () -> {
- cb();
- after.cb();
+ callback();
+ after.callback();
};
}
}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/AdapterBase.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/AdapterBase.java
index 3ac9066..d9f17b5 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/AdapterBase.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/AdapterBase.java
@@ -30,8 +30,6 @@
import org.apache.felix.dm.lambda.FluentProperty;
import org.apache.felix.dm.lambda.FutureDependencyBuilder;
import org.apache.felix.dm.lambda.ServiceDependencyBuilder;
-import org.apache.felix.dm.lambda.callbacks.Cb;
-import org.apache.felix.dm.lambda.callbacks.CbComponent;
import org.apache.felix.dm.lambda.callbacks.InstanceCb;
import org.apache.felix.dm.lambda.callbacks.InstanceCbComponent;
@@ -175,16 +173,6 @@
return (B) this;
}
- default B withSvc(Class<?> service, String filter) {
- andThenBuild(compBuilder -> compBuilder.withSvc(service, filter));
- return (B) this;
- }
-
- default B withSvc(Class<?> ... services) {
- andThenBuild(compBuilder -> compBuilder.withSvc(services));
- return (B) this;
- }
-
default <U> B withSvc(Class<U> service, Consumer<ServiceDependencyBuilder<U>> consumer) {
andThenBuild(compBuilder -> compBuilder.withSvc(service, consumer));
return (B) this;
@@ -204,13 +192,23 @@
andThenBuild(compBuilder -> compBuilder.withFuture(future, consumer));
return (B) this;
}
-
- default B lifecycleCallbackInstance(Object lifecycleCallbackInstance) {
- andThenBuild(compBuilder -> compBuilder.lifecycleCallbackInstance(lifecycleCallbackInstance));
+
+ default B init(String callback) {
+ andThenBuild(compBuilder -> compBuilder.init(callback));
return (B) this;
}
- default B init(String callback) {
+ default B init(Object callbackInstance, String callback) {
+ andThenBuild(compBuilder -> compBuilder.init(callbackInstance, callback));
+ return (B) this;
+ }
+
+ default B init(InstanceCb callback) {
+ andThenBuild(compBuilder -> compBuilder.init(callback));
+ return (B) this;
+ }
+
+ default B init(InstanceCbComponent callback) {
andThenBuild(compBuilder -> compBuilder.init(callback));
return (B) this;
}
@@ -220,95 +218,60 @@
return (B) this;
}
+ default B start(Object callbackInstance, String callback) {
+ andThenBuild(compBuilder -> compBuilder.start(callbackInstance, callback));
+ return (B) this;
+ }
+
+ default B start(InstanceCb callback) {
+ andThenBuild(compBuilder -> compBuilder.start(callback));
+ return (B) this;
+ }
+
+ default B start(InstanceCbComponent callback) {
+ andThenBuild(compBuilder -> compBuilder.start(callback));
+ return (B) this;
+ }
+
default B stop(String callback) {
andThenBuild(compBuilder -> compBuilder.stop(callback));
return (B) this;
}
+ default B stop(Object callbackInstance, String callback) {
+ andThenBuild(compBuilder -> compBuilder.stop(callbackInstance, callback));
+ return (B) this;
+ }
+
+ default B stop(InstanceCb callback) {
+ andThenBuild(compBuilder -> compBuilder.stop(callback));
+ return (B) this;
+ }
+
+ default B stop(InstanceCbComponent callback) {
+ andThenBuild(compBuilder -> compBuilder.stop(callback));
+ return (B) this;
+ }
+
default B destroy(String callback) {
andThenBuild(compBuilder -> compBuilder.destroy(callback));
return (B) this;
}
- default <U> B init(Cb<U> callback) {
- andThenBuild(compBuilder -> compBuilder.init(callback));
+ default B destroy(Object callbackInstance, String callback) {
+ andThenBuild(compBuilder -> compBuilder.destroy(callbackInstance, callback));
return (B) this;
}
-
- default <U> B start(Cb<U> callback) {
- andThenBuild(compBuilder -> compBuilder.start(callback));
- return (B) this;
- }
-
- default <U> B stop(Cb<U> callback) {
- andThenBuild(compBuilder -> compBuilder.stop(callback));
- return (B) this;
- }
-
- default <U> B destroy(Cb<U> callback) {
+
+ default B destroy(InstanceCb callback) {
andThenBuild(compBuilder -> compBuilder.destroy(callback));
return (B) this;
}
-
- default <U> B init(CbComponent<U> callback) {
- andThenBuild(compBuilder -> compBuilder.init(callback));
- return (B) this;
- }
-
- default <U> B start(CbComponent<U> callback) {
- andThenBuild(compBuilder -> compBuilder.start(callback));
- return (B) this;
- }
-
- default <U> B stop(CbComponent<U> callback) {
- andThenBuild(compBuilder -> compBuilder.stop(callback));
- return (B) this;
- }
-
- default <U> B destroy(CbComponent<U> callback) {
+
+ default B destroy(InstanceCbComponent callback) {
andThenBuild(compBuilder -> compBuilder.destroy(callback));
return (B) this;
}
-
- default B initInstance(InstanceCb callback) {
- andThenBuild(compBuilder -> compBuilder.initInstance(callback));
- return (B) this;
- }
-
- default B startInstance(InstanceCb callback) {
- andThenBuild(compBuilder -> compBuilder.startInstance(callback));
- return (B) this;
- }
-
- default B stopInstance(InstanceCb callback) {
- andThenBuild(compBuilder -> compBuilder.stopInstance(callback));
- return (B) this;
- }
-
- default B destroyInstance(InstanceCb callback) {
- andThenBuild(compBuilder -> compBuilder.destroyInstance(callback));
- return (B) this;
- }
-
- default B initInstance(InstanceCbComponent callback) {
- andThenBuild(compBuilder -> compBuilder.initInstance(callback));
- return (B) this;
- }
-
- default B startInstance(InstanceCbComponent callback) {
- andThenBuild(compBuilder -> compBuilder.startInstance(callback));
- return (B) this;
- }
-
- default B stopInstance(InstanceCbComponent callback) {
- andThenBuild(compBuilder -> compBuilder.stopInstance(callback));
- return (B) this;
- }
-
- default B destroyInstance(InstanceCbComponent callback) {
- andThenBuild(compBuilder -> compBuilder.destroyInstance(callback));
- return (B) this;
- }
default B autoConfig(Class<?> clazz, boolean autoConfig) {
andThenBuild(compBuilder -> compBuilder.autoConfig(clazz, autoConfig));
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/BundleDependencyBuilderImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/BundleDependencyBuilderImpl.java
index e800443..35b25e7 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/BundleDependencyBuilderImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/BundleDependencyBuilderImpl.java
@@ -45,7 +45,7 @@
private Object m_instance;
private boolean m_autoConfig = true;
private boolean m_autoConfigInvoked = false;
- private boolean m_required = true;
+ private boolean m_required;
private Bundle m_bundle;
private String m_filter;
private int m_stateMask = -1;
@@ -54,6 +54,7 @@
private String m_propagateMethod;
private Function<Bundle, Dictionary<?, ?>> m_propagateCallback;
private final Component m_component;
+ private boolean m_requiredSet;
enum Cb {
ADD,
@@ -98,8 +99,14 @@
@Override
public BundleDependencyBuilder required(boolean required) {
m_required = required;
+ m_requiredSet = true;
return this;
}
+
+ @Override
+ public BundleDependencyBuilder optional() {
+ return required(false);
+ }
@Override
public BundleDependencyBuilder required() {
@@ -292,6 +299,9 @@
DependencyManager dm = m_component.getDependencyManager();
BundleDependency dep = dm.createBundleDependency();
+ if (! m_requiredSet) {
+ m_required = Helpers.isDependencyRequiredByDefault(m_component);
+ }
dep.setRequired(m_required);
if (m_filter != null) {
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ComponentBuilderImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ComponentBuilderImpl.java
index a8e698b..6d1f27e 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ComponentBuilderImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ComponentBuilderImpl.java
@@ -40,6 +40,7 @@
import org.apache.felix.dm.Component;
import org.apache.felix.dm.Dependency;
import org.apache.felix.dm.DependencyManager;
+import org.apache.felix.dm.context.ComponentContext;
import org.apache.felix.dm.lambda.BundleDependencyBuilder;
import org.apache.felix.dm.lambda.ComponentBuilder;
import org.apache.felix.dm.lambda.ConfigurationDependencyBuilder;
@@ -47,8 +48,6 @@
import org.apache.felix.dm.lambda.FluentProperty;
import org.apache.felix.dm.lambda.FutureDependencyBuilder;
import org.apache.felix.dm.lambda.ServiceDependencyBuilder;
-import org.apache.felix.dm.lambda.callbacks.Cb;
-import org.apache.felix.dm.lambda.callbacks.CbComponent;
import org.apache.felix.dm.lambda.callbacks.InstanceCb;
import org.apache.felix.dm.lambda.callbacks.InstanceCbComponent;
@@ -62,23 +61,26 @@
private Object m_factory;
private boolean m_factoryHasComposite;
private boolean m_autoAdd = true;
- protected final Map<ComponentCallback, List<MethodRef<Object>>> m_refs = new HashMap<>();
+ protected final Map<ComponentCallback, MethodRef> m_refs = new HashMap<>();
private Object m_compositionInstance;
private String m_compositionMethod;
private String m_init;
- private String m_stop;
private String m_start;
+ private String m_stop;
private String m_destroy;
- private Object m_callbackInstance;
private String m_factoryCreateMethod;
private boolean m_hasFactoryRef;
- private boolean m_hasFactory;
+ private boolean m_hasFactory;
+ private Object m_initCallbackInstance;
+ private Object m_startCallbackInstance;
+ private Object m_stopCallbackInstance;
+ private Object m_destroyCallbackInstance;
enum ComponentCallback { INIT, START, STOP, DESTROY };
@FunctionalInterface
- interface MethodRef<I> {
- public void accept(I instance, Component c);
+ interface MethodRef {
+ public void accept(Component c);
}
public ComponentBuilderImpl(DependencyManager dm) {
@@ -297,6 +299,10 @@
public Object create() {
return create.get();
}
+ @Override
+ public String toString() {
+ return create.getClass().getName() + " (Factory)";
+ }
};
return this;
}
@@ -314,6 +320,10 @@
U factoryImpl = supplier.get();
return create.apply(factoryImpl);
}
+ @Override
+ public String toString() {
+ return supplier.getClass().getName() + " (Factory)";
+ }
};
return this;
}
@@ -335,6 +345,11 @@
public Object[] getComposite() { // Create Factory instance
return getComposite.get();
}
+
+ @Override
+ public String toString() {
+ return create.getClass().getName() + " (Factory)";
+ }
};
m_factoryHasComposite = true;
return this;
@@ -361,6 +376,11 @@
public Object[] getComposite() {
return factoryGetComposite.apply(m_factoryInstance);
}
+
+ @Override
+ public String toString() {
+ return factorySupplier.getClass().getName() + " (Factory)";
+ }
};
m_factoryHasComposite = true;
return this;
@@ -388,31 +408,13 @@
}
@Override
- public ComponentBuilderImpl withSvc(Class<?> service, String filter) {
- return withSvc(service, srv->srv.filter(filter));
- }
-
- @Override
- public ComponentBuilderImpl withSvc(Class<?> ... services) {
- for (Class<?> s : services) {
- doWithService(s);
- }
- return this;
- }
-
- private <U> void doWithService(Class<U> service) {
- ServiceDependencyBuilder<U> dep = new ServiceDependencyBuilderImpl<>(m_component, service);
- m_dependencyBuilders.add(dep);
- }
-
- @Override
public <U> ComponentBuilderImpl withSvc(Class<U> service, Consumer<ServiceDependencyBuilder<U>> consumer) {
ServiceDependencyBuilder<U> dep = new ServiceDependencyBuilderImpl<>(m_component, service);
consumer.accept(dep);
m_dependencyBuilders.add(dep);
return this;
}
-
+
@Override
public ComponentBuilderImpl withCnf(Consumer<ConfigurationDependencyBuilder> consumer) {
ConfigurationDependencyBuilder dep = new ConfigurationDependencyBuilderImpl(m_component);
@@ -437,168 +439,111 @@
return this;
}
- public ComponentBuilderImpl lifecycleCallbackInstance(Object callbackInstance) {
- m_callbackInstance = callbackInstance;
- return this;
- }
-
public ComponentBuilderImpl init(String callback) {
- ensureHasNoLifecycleMethodRefs();
m_init = callback;
return this;
}
+ public ComponentBuilderImpl init(Object callbackInstance, String callback) {
+ init(callback);
+ m_initCallbackInstance = callbackInstance;
+ return this;
+ }
+
+ @Override
+ public ComponentBuilderImpl init(InstanceCb callback) {
+ setCallbackMethodRef(INIT, component -> callback.callback());
+ m_init = null;
+ m_initCallbackInstance = null;
+ return this;
+ }
+
+ @Override
+ public ComponentBuilderImpl init(InstanceCbComponent callback) {
+ setCallbackMethodRef(INIT, component -> callback.accept(component));
+ m_init = null;
+ m_initCallbackInstance = null;
+ return this;
+ }
+
public ComponentBuilderImpl start(String callback) {
- ensureHasNoLifecycleMethodRefs();
m_start = callback;
return this;
}
+
+ public ComponentBuilderImpl start(Object callbackInstance, String callback) {
+ start(callback);
+ m_startCallbackInstance = callbackInstance;
+ return this;
+ }
+
+ @Override
+ public ComponentBuilderImpl start(InstanceCb callback) {
+ setCallbackMethodRef(START, component -> callback.callback());
+ m_start = null;
+ m_startCallbackInstance = null;
+ return this;
+ }
+
+ @Override
+ public ComponentBuilderImpl start(InstanceCbComponent callback) {
+ setCallbackMethodRef(START, component -> callback.accept(component));
+ m_start = null;
+ m_startCallbackInstance = null;
+ return this;
+ }
public ComponentBuilderImpl stop(String callback) {
- ensureHasNoLifecycleMethodRefs();
m_stop = callback;
return this;
}
+ public ComponentBuilderImpl stop(Object callbackInstance, String callback) {
+ stop(callback);
+ m_stopCallbackInstance = callbackInstance;
+ return this;
+ }
+
+ @Override
+ public ComponentBuilderImpl stop(InstanceCb callback) {
+ setCallbackMethodRef(STOP, component -> callback.callback());
+ m_stop = null;
+ m_stopCallbackInstance = null;
+ return this;
+ }
+
+ @Override
+ public ComponentBuilderImpl stop(InstanceCbComponent callback) {
+ setCallbackMethodRef(STOP, component -> callback.accept(component));
+ m_stop = null;
+ m_stopCallbackInstance = null;
+ return this;
+ }
+
public ComponentBuilderImpl destroy(String callback) {
- ensureHasNoLifecycleMethodRefs();
m_destroy = callback;
return this;
}
-
- @SuppressWarnings("unchecked")
- @Override
- public <T> ComponentBuilderImpl init(Cb<T> callback) {
- if (callback != null) {
- setComponentCallbackRef(INIT, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst));
- }
- return this;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public <T> ComponentBuilderImpl start(Cb<T> callback) {
- if (callback != null) {
- setComponentCallbackRef(START, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst));
- }
- return this;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public <T> ComponentBuilderImpl stop(Cb<T> callback) {
- if (callback != null) {
- setComponentCallbackRef(STOP, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst));
- }
- return this;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public <T> ComponentBuilderImpl destroy(Cb<T> callback) {
- if (callback != null) {
- setComponentCallbackRef(DESTROY, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst));
- }
- return this;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public <T> ComponentBuilderImpl init(CbComponent<T> callback) {
- if (callback != null) {
- setComponentCallbackRef(INIT, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst, component));
- }
- return this;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public <T> ComponentBuilderImpl start(CbComponent<T> callback) {
- if (callback != null) {
- setComponentCallbackRef(START, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst, component));
- }
- return this;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public <T> ComponentBuilderImpl stop(CbComponent<T> callback) {
- if (callback != null) {
- setComponentCallbackRef(STOP, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst, component));
- }
- return this;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public <T> ComponentBuilderImpl destroy(CbComponent<T> callback) {
- if (callback != null) {
- setComponentCallbackRef(DESTROY, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst, component));
- }
- return this;
- }
-
- @Override
- public ComponentBuilderImpl initInstance(InstanceCb callback) {
- if (callback != null) {
- setInstanceCallbackRef(INIT, (inst, component) -> callback.cb());
- }
- return this;
- }
-
- @Override
- public ComponentBuilderImpl startInstance(InstanceCb callback) {
- if (callback != null) {
- setInstanceCallbackRef(START, (inst, component) -> callback.cb());
- }
+
+ public ComponentBuilderImpl destroy(Object callbackInstance, String callback) {
+ destroy(callback);
+ m_destroyCallbackInstance = callbackInstance;
return this;
}
@Override
- public ComponentBuilderImpl stopInstance(InstanceCb callback) {
- if (callback != null) {
- setInstanceCallbackRef(STOP, (inst, component) -> callback.cb());
- }
- return this;
- }
-
- @Override
- public ComponentBuilderImpl destroyInstance(InstanceCb callback) {
- if (callback != null) {
- setInstanceCallbackRef(DESTROY, (inst, component) -> callback.cb());
- }
+ public ComponentBuilderImpl destroy(InstanceCb callback) {
+ setCallbackMethodRef(DESTROY, component -> callback.callback());
+ m_destroy = null;
+ m_destroyCallbackInstance = null;
return this;
}
@Override
- public ComponentBuilderImpl initInstance(InstanceCbComponent callback) {
- if (callback != null) {
- setInstanceCallbackRef(INIT, (inst, component) -> callback.accept(component));
- }
- return this;
- }
-
- @Override
- public ComponentBuilderImpl startInstance(InstanceCbComponent callback) {
- if (callback != null) {
- setInstanceCallbackRef(START, (inst, component) -> callback.accept(component));
- }
- return this;
- }
-
- @Override
- public ComponentBuilderImpl stopInstance(InstanceCbComponent callback) {
- if (callback != null) {
- setInstanceCallbackRef(STOP, (inst, component) -> callback.accept(component));
- }
- return this;
- }
-
- @Override
- public ComponentBuilderImpl destroyInstance(InstanceCbComponent callback) {
- if (callback != null) {
- setInstanceCallbackRef(DESTROY, (inst, component) -> callback.accept(component));
- }
+ public ComponentBuilderImpl destroy(InstanceCbComponent callback) {
+ setCallbackMethodRef(DESTROY, component -> callback.accept(component));
+ m_destroy = null;
+ m_destroyCallbackInstance = null;
return this;
}
@@ -625,13 +570,23 @@
} else {
m_component.setFactory(m_factory, m_factoryCreateMethod);
}
- }
-
- if (m_refs.size() > 0) {
- setLifecycleMethodRefs();
- } else if (hasLifecleMethods()) {
- m_component.setCallbacks(m_callbackInstance, m_init, m_start, m_stop, m_destroy);
- }
+ }
+
+ if (hasCallbacks()) { // either method refs on some object instances, or a callback (reflection) on some object instances.
+ if (m_refs.get(INIT) == null) {
+ setCallbackMethodRef(INIT, component -> invokeCallbacks(component, m_initCallbackInstance, m_init, "init"));
+ }
+ if (m_refs.get(START) == null) {
+ setCallbackMethodRef(START, component -> invokeCallbacks(component, m_startCallbackInstance, m_start, "start"));
+ }
+ if (m_refs.get(STOP) == null) {
+ setCallbackMethodRef(STOP, component -> invokeCallbacks(component, m_stopCallbackInstance, m_stop, "stop"));
+ }
+ if (m_refs.get(DESTROY) == null) {
+ setCallbackMethodRef(DESTROY, component -> invokeCallbacks(component, m_destroyCallbackInstance, m_destroy, "destroy"));
+ }
+ setInternalCallbacks();
+ }
}
if (m_dependencyBuilders.size() > 0) {
@@ -642,79 +597,54 @@
}
return m_component;
}
-
- private boolean hasLifecleMethods() {
- return m_init != null || m_start != null || m_stop != null || m_destroy != null;
- }
-
- private boolean hasLifecleMethodRefs() {
- return m_refs.size() > 0;
- }
-
- private void ensureHasNoLifecycleMethods() {
- if (hasLifecleMethods()) {
- throw new IllegalStateException("Can't mix method references and name names for lifecycle callbacks");
- }
- }
-
- private void ensureHasNoLifecycleMethodRefs() {
- if (hasLifecleMethodRefs()) {
- throw new IllegalStateException("Can't mix method references and name names for lifecycle callbacks");
- }
- }
-
- protected <U> ComponentBuilderImpl setInstanceCallbackRef(ComponentCallback cbType, MethodRef<U> ref) {
- ensureHasNoLifecycleMethods();
- List<MethodRef<Object>> list = m_refs.computeIfAbsent(cbType, l -> new ArrayList<>());
- list.add((instance, component) -> {
- ref.accept(null, component);
- });
- return this;
- }
-
- @SuppressWarnings("unchecked")
- private <U> ComponentBuilderImpl setComponentCallbackRef(ComponentCallback cbType, Class<U> type, MethodRef<U> callback) {
- ensureHasNoLifecycleMethods();
- if (type.equals(Object.class)) {
- throw new IllegalStateException("callback does not seam to be one from the possible component implementation classes");
- }
- List<MethodRef<Object>> list = m_refs.computeIfAbsent(cbType, l -> new ArrayList<>());
- list.add((instance, component) -> {
- Object componentImpl = Stream.of(component.getInstances())
- .filter(impl -> Helpers.getClass(impl).equals(type))
- .findFirst()
- .orElseThrow(() -> new IllegalStateException("The method reference " + callback + " does not match any available component impl classes."));
- callback.accept((U) componentImpl, component);
- });
- return this;
- }
+ private boolean hasCallbacks() {
+ return m_refs.size() > 0 || m_init != null || m_start != null || m_stop != null || m_destroy != null;
+ }
+
+ private void invokeCallbacks(Component component, Object callbackInstance, String callback, String defaultCallback) {
+ boolean logIfNotFound = (callback != null);
+ callback = callback != null ? callback : defaultCallback;
+ ComponentContext ctx = (ComponentContext) component;
+ Object[] instances = callbackInstance != null ? new Object[] { callbackInstance } : ctx.getInstances();
+
+ ctx.invokeCallbackMethod(instances, callback,
+ new Class[][] {{ Component.class }, {}},
+ new Object[][] {{ component }, {}},
+ logIfNotFound);
+ }
+
+ private ComponentBuilderImpl setCallbackMethodRef(ComponentCallback cbType, MethodRef ref) {
+ m_refs.put(cbType, ref);
+ return this;
+ }
+
@SuppressWarnings("unused")
- private void setLifecycleMethodRefs() {
+ private void setInternalCallbacks() {
Object cb = new Object() {
void init(Component comp) {
- invokeLfcleCallbacks(ComponentCallback.INIT, comp);
+ invokeLifecycleCallback(ComponentCallback.INIT, comp);
}
void start(Component comp) {
- invokeLfcleCallbacks(ComponentCallback.START, comp);
+ invokeLifecycleCallback(ComponentCallback.START, comp);
}
void stop(Component comp) {
- invokeLfcleCallbacks(ComponentCallback.STOP, comp);
+ invokeLifecycleCallback(ComponentCallback.STOP, comp);
}
void destroy(Component comp) {
- invokeLfcleCallbacks(ComponentCallback.DESTROY, comp);
+ invokeLifecycleCallback(ComponentCallback.DESTROY, comp);
}
};
m_component.setCallbacks(cb, "init", "start", "stop", "destroy");
}
- private void invokeLfcleCallbacks(ComponentCallback cbType, Component component) {
- m_refs.computeIfPresent(cbType, (k, mrefs) -> {
- mrefs.forEach(mref -> mref.accept(null, component));
- return mrefs;
+ private void invokeLifecycleCallback(ComponentCallback cbType, Component component) {
+ m_refs.computeIfPresent(cbType, (k, mref) -> {
+ mref.accept(component);
+ return mref;
});
}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/Helpers.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/Helpers.java
index 2fd6dee..c7c96b7 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/Helpers.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/Helpers.java
@@ -30,14 +30,17 @@
import java.util.stream.Stream;
import org.apache.felix.dm.Component;
+import org.apache.felix.dm.context.ComponentContext;
import org.apache.felix.dm.lambda.callbacks.SerializableLambda;
+import org.osgi.framework.BundleContext;
/**
* Various helper methods related to generics and lambda expressions.
*/
public class Helpers {
private final static Pattern LAMBDA_INSTANCE_METHOD_TYPE = Pattern.compile("(L[^;]+)+");
-
+ private final static String DEFAULT_REQUIRED_DEPENDENCY = "org.apache.felix.dependencymanager.lambda.defaultRequiredDependency";
+
/**
* Gets the class name of a given object.
* @param obj the object whose class has to be returned.
@@ -129,6 +132,29 @@
}
/**
+ * Is a dependency required by default ?
+ *
+ * @param c the component on which the dependency is added
+ * @param ctx the bundle context
+ * @return true if the dependency is required by default, false if not
+ */
+ public static boolean isDependencyRequiredByDefault(Component c) {
+ BundleContext ctx = ((ComponentContext) c).getBundleContext();
+ String defaultRequiredDependency = ctx.getProperty(DEFAULT_REQUIRED_DEPENDENCY);
+ if (defaultRequiredDependency != null) {
+ defaultRequiredDependency = defaultRequiredDependency.trim();
+ String componentName = c.getComponentDeclaration().getName();
+ for (String pkg : defaultRequiredDependency.split(",")) {
+ if (componentName.startsWith(pkg)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /**
* Extracts the actual types of all lambda generic parameters.
* Example: for "BiConsumer<String, Integer>", this method returns ["java.lang.String", "java.lang.Integer"].
*/
@@ -161,5 +187,5 @@
.findFirst()
.orElseThrow(() -> new RuntimeException("Lambda Method not found"));
}
-
+
}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ServiceDependencyBuilderImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ServiceDependencyBuilderImpl.java
index 28929a2..ffa8d1f 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ServiceDependencyBuilderImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ServiceDependencyBuilderImpl.java
@@ -33,13 +33,14 @@
private final Component m_component;
private String m_filter;
private ServiceReference<S> m_ref;
- private boolean m_required = true;
+ private boolean m_required;
private String m_debug;
private boolean m_propagate;
private Object m_propagateInstance;
private String m_propagateMethod;
private Object m_defaultImpl;
private long m_timeout = -1;
+ private boolean m_requiredSet;
public ServiceDependencyBuilderImpl(Component component, Class<S> service) {
super(service);
@@ -67,6 +68,7 @@
public ServiceDependencyBuilder<S> required(boolean required) {
m_required = required;
+ m_requiredSet = true;
return this;
}
@@ -119,6 +121,7 @@
public ServiceDependencyBuilder<S> timeout(long timeout) {
m_timeout = timeout;
+ required();
return this;
}
@@ -129,12 +132,18 @@
if (m_ref != null && m_filter != null) {
throw new IllegalArgumentException("Can not set ref and filter at the same time");
}
+ if (m_serviceIface == null && (m_ref == null || m_filter == null)) {
+ throw new IllegalArgumentException("service interface not specified, and no service reference or service filter specified.");
+ }
ServiceDependency sd = m_timeout > -1 ? dm.createTemporalServiceDependency(m_timeout) : dm.createServiceDependency();
if (m_ref != null) {
sd.setService(m_serviceIface, m_ref);
} else {
sd.setService(m_serviceIface, m_filter);
}
+ if (! m_requiredSet) {
+ m_required = Helpers.isDependencyRequiredByDefault(m_component);
+ }
sd.setRequired(m_required);
sd.setDefaultImplementation(m_defaultImpl);
if (m_debug != null) {
diff --git a/dependencymanager/release/resources/changelog.txt b/dependencymanager/release/resources/changelog.txt
index d81582a..8cc8ad5 100644
--- a/dependencymanager/release/resources/changelog.txt
+++ b/dependencymanager/release/resources/changelog.txt
@@ -12,16 +12,18 @@
* [FELIX-5188] - No error log when a factory pid adapter update callback is not found
* [FELIX-5192] - ConfigurationDependency race condition when component is stopped
* [FELIX-5193] - Factory Pid Adapter race condition when component is stopped
-
+ * [FELIX-5200] - Factory configuration adapter not restarted
+
** Improvement
- * [FELIX-4689] - Create a more fluent syntax for the dependency manager builder
+ * [FELIX-5126] - Build DM using Java 8
* [FELIX-5164] - Add support for callback instance in Aspects
* [FELIX-5177] - Support injecting configuration proxies
* [FELIX-5180] - Support for Java8 Repeatable Properties in DM annotations.
* [FELIX-5182] - Cleanup DM samples
+ * [FELIX-5201] - Improve how components are displayed with gogo shell
** New Feature
- * [FELIX-5126] - Build DM using Java 8
+ * [FELIX-4689] - Create a more fluent syntax for the dependency manager builder
Release Notes - Felix - Version org.apache.felix.dependencymanager-r6
======================================================================