You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by pd...@apache.org on 2017/02/06 21:53:18 UTC
svn commit: r1781960 - in
/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda:
ComponentBuilder.java ServiceCallbacksBuilder.java impl/AdapterBase.java
impl/ComponentBuilderImpl.java
Author: pderop
Date: Mon Feb 6 21:53:18 2017
New Revision: 1781960
URL: http://svn.apache.org/viewvc?rev=1781960&view=rev
Log:
FELIX-5526: Allow to use custom DM dependency with dm-lambda library.
Modified:
felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ComponentBuilder.java
felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceCallbacksBuilder.java
felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/AdapterBase.java
felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ComponentBuilderImpl.java
Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ComponentBuilder.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ComponentBuilder.java?rev=1781960&r1=1781959&r2=1781960&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ComponentBuilder.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ComponentBuilder.java Mon Feb 6 21:53:18 2017
@@ -27,6 +27,7 @@ import java.util.stream.Stream;
import org.apache.felix.dm.Component;
import org.apache.felix.dm.ComponentStateListener;
+import org.apache.felix.dm.Dependency;
import org.apache.felix.dm.lambda.callbacks.InstanceCb;
import org.apache.felix.dm.lambda.callbacks.InstanceCbComponent;
@@ -477,6 +478,12 @@ public interface ComponentBuilder<B exte
<U> B withFuture(CompletableFuture<U> future, Consumer<FutureDependencyBuilder<U>> consumer);
/**
+ * Adds a generic Dependency Manager dependency. You can use this method if you want to add a dependency
+ * that you have built using the Dependency Manager API, or a specific custom DM dependency (like toggles, etc ...).
+ */
+ B withDep(Dependency dependency);
+
+ /**
* 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.
* This method is useful because when it is invoked, all required dependencies defines in the Activator
Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceCallbacksBuilder.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceCallbacksBuilder.java?rev=1781960&r1=1781959&r2=1781960&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceCallbacksBuilder.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceCallbacksBuilder.java Mon Feb 6 21:53:18 2017
@@ -799,11 +799,12 @@ public interface ServiceCallbacksBuilder
/**
* Configures whether or not this dependency should internally obtain the service object for all tracked service references.
*
- * By default, DM internally dereferences all discovered service references (using
- * <code>BundleContext.getService(ServiceReference ref)</code> methods.
- * However, sometimes, your callback only needs the ServiceReference, and sometimes you don't want to dereference the service.
- * So, in this case you can use the <code>dereference(false)</code> method in order to tell to DM
- * that it should never internally dereference the service dependency internally.
+ * By default, if you use a java method reference as dependency callbacks, then DM lambda auto-detects if your method takes as argument a
+ * ServiceReference. And in this case, the service reference is not internally dereferenced by DM (using BundleContext.getServiceReference() method).
+ * But if you are using a reflection based callback method name, then by default DM always internally dereference the service. In this case
+ * you can invoke the <code>dereference(false)</code> method in case you don't want DM to internally dereference the service.
+ * You will use this method typically when you are using a method name as the callback and when for example you want to
+ * dereference yourself the service using the ServiceObjects OSGi API.
*/
B dereference(boolean obtainServiceBeforeInjection);
}
Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/AdapterBase.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/AdapterBase.java?rev=1781960&r1=1781959&r2=1781960&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/AdapterBase.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/AdapterBase.java Mon Feb 6 21:53:18 2017
@@ -25,6 +25,7 @@ import java.util.function.Function;
import java.util.function.Supplier;
import org.apache.felix.dm.ComponentStateListener;
+import org.apache.felix.dm.Dependency;
import org.apache.felix.dm.lambda.BundleDependencyBuilder;
import org.apache.felix.dm.lambda.ComponentBuilder;
import org.apache.felix.dm.lambda.ConfigurationDependencyBuilder;
@@ -174,6 +175,11 @@ public interface AdapterBase<B extends C
return (B) this;
}
+ default B withDep(Dependency dependency) {
+ andThenBuild(compBuilder -> compBuilder.withDep(dependency));
+ return (B) this;
+ }
+
default <U> B withSvc(Class<U> service, Consumer<ServiceDependencyBuilder<U>> consumer) {
andThenBuild(compBuilder -> compBuilder.withSvc(service, consumer));
return (B) this;
Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ComponentBuilderImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ComponentBuilderImpl.java?rev=1781960&r1=1781959&r2=1781960&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ComponentBuilderImpl.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ComponentBuilderImpl.java Mon Feb 6 21:53:18 2017
@@ -54,6 +54,7 @@ import org.apache.felix.dm.lambda.callba
public class ComponentBuilderImpl implements ComponentBuilder<ComponentBuilderImpl> {
private final List<DependencyBuilder<?>> m_dependencyBuilders = new ArrayList<>();
+ private final List<Dependency> m_dependencies = new ArrayList<>();
private final Component m_component;
private final boolean m_componentUpdated;
private String[] m_serviceNames;
@@ -408,8 +409,14 @@ public class ComponentBuilderImpl implem
m_compositionMethod = "getComposition";
return this;
}
-
+
@Override
+ public ComponentBuilderImpl withDep(Dependency dep) {
+ m_dependencies.add(dep);
+ return this;
+ }
+
+ @Override
public <U> ComponentBuilderImpl withSvc(Class<U> service, Consumer<ServiceDependencyBuilder<U>> consumer) {
ServiceDependencyBuilder<U> dep = new ServiceDependencyBuilderImpl<>(m_component, service);
consumer.accept(dep);
@@ -600,9 +607,10 @@ public class ComponentBuilderImpl implem
if (m_dependencyBuilders.size() > 0) {
// add atomically in case we are building some component dependencies from a component init method.
- // We first transform the list of builders into a stream of built Dependencies, then we collect the result
- // to an array of Dependency[].
- m_component.add(m_dependencyBuilders.stream().map(builder -> builder.build()).toArray(Dependency[]::new));
+ List<Dependency> depList = new ArrayList<>();
+ m_dependencyBuilders.stream().map(builder -> builder.build()).forEach(depList::add);
+ depList.addAll(m_dependencies);
+ m_component.add(depList.stream().toArray(Dependency[]::new));
}
return m_component;
}