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;
     }