Author: pderop
Date: Thu Jan 14 23:51:12 2016
New Revision: 1724712

URL: http://svn.apache.org/viewvc?rev=1724712&view=rev
Log:
reworked callbacks in FactoryPidAdapterBuilder, ConfigurationDependencyBuilder.
Added support for composition in ComponentBuilder.
Added more tests.

Added:
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AutoConfigTest.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/CompositionTest.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/DynamicProxyAspectTest.java
Modified:
    felix/sandbox/pderop/dependencymanager-lambda/TODO
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AdapterNoAutoConfigIfInstanceCallbackIsUsed.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AdapterWithCallbackInstanceTest.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/compositefactory/Activator.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/dictionary/Activator.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/rx/completable/SiteInfoImpl.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleDependencyBuilder.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ComponentBuilderBase.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ConfigurationDependencyBuilder.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/FactoryPidAdapterBuilder.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/FutureDependencyBuilder.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceCallbacksBuilder.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceDependencyBuilder.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/AdapterBase.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleDependencyBuilderImpl.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/CompletableFutureDependencyImpl.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ComponentBuilderImpl.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ConfigurationDependencyBuilderImpl.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/FactoryPidAdapterBuilderImpl.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceDependencyBuilderImpl.java

Modified: felix/sandbox/pderop/dependencymanager-lambda/TODO
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/TODO?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-lambda/TODO (original)
+++ felix/sandbox/pderop/dependencymanager-lambda/TODO Thu Jan 14 23:51:12 2016
@@ -1,7 +1,10 @@
-- in ServiceDependencyBuilder:
+- add factories methods in ComponentImpl that take object/string params (like 
in original DM API)
+  and update DynamicProxyAspectTest.java
 
-  * add support for method references in the "propagateTo" method
-  * add a withService method that takes a string (class name)
+- when a component instance method ref is not found, log an error.
+
+- ConfigurationDependency:
+  * allow to set "needsInstance" flag
 
 - Finish to adapt all DependencyManager integration tests
 
@@ -9,7 +12,7 @@
 
 - Javadocs
 
-- rework callbacks for ComponentBuilder, ConfigurationDependencyBuilder, 
BundleDepnendencyBuilder
+- rework callbacks for ComponentBuilder
 
 
 

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AdapterNoAutoConfigIfInstanceCallbackIsUsed.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AdapterNoAutoConfigIfInstanceCallbackIsUsed.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AdapterNoAutoConfigIfInstanceCallbackIsUsed.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AdapterNoAutoConfigIfInstanceCallbackIsUsed.java
 Thu Jan 14 23:51:12 2016
@@ -41,7 +41,7 @@ public class AdapterNoAutoConfigIfInstan
         
         // Declare S1 adapter
         S1AdapterCallback s1AdapterCB = new S1AdapterCallback();
-        adapter(m, S1.class, a -> 
a.impl(S1Adapter.class).cb("set").cbInst(s1AdapterCB));
+        adapter(m, S1.class, a -> a.impl(S1Adapter.class).cb(s1AdapterCB, 
"set"));
         
         // At this point, the s1AdapterCB.set(S1 s1) method should be called, 
and s1Adapter.start() method should then be called.
         // but s1 should not be injected on s1Adapter class fields.

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AdapterWithCallbackInstanceTest.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AdapterWithCallbackInstanceTest.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AdapterWithCallbackInstanceTest.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AdapterWithCallbackInstanceTest.java
 Thu Jan 14 23:51:12 2016
@@ -48,7 +48,7 @@ public class AdapterWithCallbackInstance
         
         ServiceAdapterCallbackInstance callbackInstance = new 
ServiceAdapterCallbackInstance(e);
         Component adapter = adapter(m, OriginalService.class)
-            .provides(AdaptedService.class).impl(new 
ServiceAdapter(e)).autoConfig("m_originalService").propagate(true).cb("set", 
"changed", "unset").cbInst(callbackInstance)
+            .provides(AdaptedService.class).impl(new 
ServiceAdapter(e)).autoConfig("m_originalService").propagate(true).cb(callbackInstance,
 "set", "changed", "unset")
             .build();
        
         // add the provider and the adapter

Added: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AutoConfigTest.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AutoConfigTest.java?rev=1724712&view=auto
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AutoConfigTest.java
 (added)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AutoConfigTest.java
 Thu Jan 14 23:51:12 2016
@@ -0,0 +1,251 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.dm.builder.lambda.itest;
+
+import static 
org.apache.felix.dm.builder.lambda.DependencyActivatorBase.component;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.DependencyManager;
+import org.junit.Assert;
+import org.osgi.framework.Constants;
+
+/**
+ * @author <a href="mailto:[email protected]";>Felix Project Team</a>
+ */
+@SuppressWarnings({"unchecked", "rawtypes"})
+public class AutoConfigTest extends TestBase {
+    private final Ensure m_ensure = new Ensure();
+
+    public void testField() throws Exception {
+        final DependencyManager dm = getDM();
+        // Create a consumer, depending on some providers (autoconfig field).
+        ConsumeWithProviderField consumer = new ConsumeWithProviderField();
+        Component c = createConsumer(dm, consumer);
+        // Create two providers
+        Component p1 = createProvider(dm, 10, new Provider() {
+            public String toString() { return "provider1"; }
+            public void run() { m_ensure.step(); }
+        });
+        Component p2 = createProvider(dm, 20, new Provider() {
+            public String toString() { return "provider2"; }
+            public void run() { m_ensure.step(); }
+        });
+
+        // add the two providers
+        dm.add(p2);
+        dm.add(p1);
+        // add the consumer, which should have been injected with provider2 
(highest rank)
+        dm.add(c);
+        m_ensure.waitForStep(1, 5000);
+        // remove the provider2, the consumer should now be injected with 
provider1
+        dm.remove(p2);
+        Assert.assertNotNull(consumer.getProvider());
+        Assert.assertEquals("provider1", consumer.getProvider().toString());
+        // remove the provider1, the consumer should have been stopped
+        dm.remove(p1);
+        m_ensure.waitForStep(2, 5000);
+        dm.clear();
+    }
+    
+    public void testIterableField() throws Exception {
+        final DependencyManager dm = getDM();
+        ConsumerWithIterableField consumer = new ConsumerWithIterableField();
+        Component c = createConsumer(dm, consumer);
+        Component p1 = createProvider(dm, 10, new Provider() {
+            public void run() { m_ensure.step(); }
+            public String toString() { return "provider1"; }
+        });
+        Component p2 = createProvider(dm, 20, new Provider() {
+            public void run() { m_ensure.step();}
+            public String toString() { return "provider2"; }
+        });
+
+        dm.add(p2);
+        dm.add(p1);
+        dm.add(c);
+        // the consumer should have been injected with all providers.
+        m_ensure.waitForStep(3, 5000);
+        
+        // check if all providers are there
+        Assert.assertNotNull(consumer.getProvider("provider1"));
+        Assert.assertNotNull(consumer.getProvider("provider2"));
+        
+        // remove provider1
+        dm.remove(p1);
+        
+        // check if provider1 has been removed and if provider2 is still there
+        Assert.assertNull(consumer.getProvider("provider1"));
+        Assert.assertNotNull(consumer.getProvider("provider2"));
+
+        // remove provider2, the consumer should be stopped
+        dm.remove(p2);
+        m_ensure.waitForStep(4, 5000);
+        dm.clear();
+    }   
+    
+    public void testMapField() throws Exception {
+        final DependencyManager dm = getDM();
+        ConsumerWithMapField consumer = new ConsumerWithMapField();
+        Component c = createConsumer(dm, consumer);
+        Component p1 = createProvider(dm, 10, new Provider() {
+            public void run() { m_ensure.step(); }
+            public String toString() { return "provider1"; }
+        });
+        Component p2 = createProvider(dm, 20, new Provider() {
+            public void run() { m_ensure.step();}
+            public String toString() { return "provider2"; }
+        });
+
+        dm.add(p2);
+        dm.add(p1);
+        dm.add(c);
+        // the consumer should have been injected with all providers.
+        m_ensure.waitForStep(3, 5000);
+        
+        // check if all providers are there
+        Assert.assertNotNull(consumer.getProvider("provider1"));
+        Assert.assertNotNull(consumer.getProvider("provider2"));
+        
+        // remove provider1
+        dm.remove(p1);
+        
+        // check if provider1 has been removed and if provider2 is still there
+        Assert.assertNull(consumer.getProvider("provider1"));
+        Assert.assertNotNull(consumer.getProvider("provider2"));
+
+        // remove provider2, the consumer should be stopped
+        dm.remove(p2);
+        m_ensure.waitForStep(4, 5000);
+        dm.clear();
+    }
+
+    private Component createProvider(DependencyManager dm, int rank, Provider 
provider) {
+        return component(dm).impl(provider).provides(Provider.class, 
Constants.SERVICE_RANKING, new Integer(rank)).build();
+    }
+
+    private Component createConsumer(DependencyManager dm, Object consumer) {
+        return 
component(dm).impl(consumer).withService(Provider.class).build();
+    }
+
+    public static interface Provider extends Runnable {      
+    }
+    
+    public class ConsumeWithProviderField {
+        volatile Provider m_provider;
+        
+        void start() {
+            Assert.assertNotNull(m_provider);
+            Assert.assertEquals("provider2", m_provider.toString());
+            m_ensure.step(1);
+        }
+        
+        public Provider getProvider() {
+            return m_provider;
+        }
+
+        void stop() {
+            m_ensure.step(2);
+        }
+    }
+    
+    public class ConsumerWithIterableField {
+        final Iterable<Provider> m_providers = new ConcurrentLinkedQueue<>();
+        final List m_notInjectMe = new ArrayList();
+        
+        void start() {
+            Assert.assertNotNull(m_providers);
+            int found = 0;
+            for (Provider provider : m_providers) {
+                provider.run();
+                found ++;
+            }
+            Assert.assertTrue(found == 2);
+            // The "m_notInjectMe" should not be injected with anything
+            Assert.assertEquals(m_notInjectMe.size(), 0);
+            m_ensure.step(3);
+        }
+        
+        public Provider getProvider(String name) {
+            System.out.println("getProvider(" + name + ") : proviers=" + 
m_providers);
+            for (Provider provider : m_providers) {
+                if (provider.toString().equals(name)) {
+                    return provider;
+                }
+            }
+            return null;
+        }
+        
+        void stop() {
+            m_ensure.step(4);
+        }
+    }    
+    
+    public class ConsumerWithMapField {
+        final Map<Provider, Dictionary> m_providers = new 
ConcurrentHashMap<>();
+        final Map m_notInjectMe = new HashMap<>();
+        
+        void start() {
+            Assert.assertNotNull(m_providers);
+            System.out.println("ConsumerMap.start: injected providers=" + 
m_providers);
+            Assert.assertTrue(m_providers.size() == 2);
+            Assert.assertEquals(0, m_notInjectMe.size());
+            for (Map.Entry<Provider, Dictionary> e : m_providers.entrySet()) {
+                Provider provider = e.getKey();
+                Dictionary props = e.getValue();
+                
+                provider.run();
+                if (provider.toString().equals("provider1")) {
+                    Assert.assertEquals(props.get(Constants.SERVICE_RANKING), 
10);
+                } else if (provider.toString().equals("provider2")) {
+                    Assert.assertEquals(props.get(Constants.SERVICE_RANKING), 
20);
+                } else {
+                    Assert.fail("Did not find any properties for provider " + 
provider);
+                }
+            }
+            
+            m_ensure.step(3);
+        }
+        
+        public Provider getProvider(String name) {
+            System.out.println("getProvider(" + name + ") : providers=" + 
m_providers);
+            for (Provider provider : m_providers.keySet()) {
+                if (provider.toString().equals(name)) {
+                    return provider;
+                }
+            }
+            return null;
+        }
+
+        Map<Provider, Dictionary> getProviders() {
+            return m_providers;
+        }
+        
+        void stop() {
+            m_ensure.step(4);
+        }
+    }    
+}

Added: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/CompositionTest.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/CompositionTest.java?rev=1724712&view=auto
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/CompositionTest.java
 (added)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/CompositionTest.java
 Thu Jan 14 23:51:12 2016
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.dm.builder.lambda.itest;
+
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.DependencyManager;
+import static org.apache.felix.dm.builder.lambda.DependencyActivatorBase.*;
+
+
+/**
+ * @author <a href="mailto:[email protected]";>Felix Project Team</a>
+ */
+public class CompositionTest extends TestBase {
+    public void testComposition() {
+        DependencyManager m = getDM();
+        // helper class that ensures certain steps get executed in sequence
+        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)).composition("getComposition")
+            .withService(ServiceInterface.class, sb->sb.cb("add")).build();
+        m.add(sp);
+        m.add(sc);
+        // ensure we executed all steps inside the component instance
+        e.step(6);
+        m.clear();
+    }
+    
+    public void testCompositionRef() {
+        DependencyManager m = getDM();
+        // helper class that ensures certain steps get executed in sequence
+        Ensure e = new Ensure();
+        // create a service provider and consumer
+        Component sp = component(m).impl(new 
ServiceProvider(e)).provides(ServiceInterface.class).build();
+        ServiceConsumer scimpl = new ServiceConsumer(e);
+        Component sc = 
component(m).impl(scimpl).composition(scimpl::getComposition)
+            .withService(ServiceInterface.class, sb->sb.cb("add")).build();
+        m.add(sp);
+        m.add(sc);
+        // ensure we executed all steps inside the component instance
+        e.step(6);
+        m.clear();
+    }
+    
+    static interface ServiceInterface {
+        public void invoke();
+    }
+
+    static class ServiceProvider implements ServiceInterface {
+        private final Ensure m_ensure;
+        public ServiceProvider(Ensure e) {
+            m_ensure = e;
+        }
+        public void invoke() {
+            m_ensure.step(4);
+        }
+    }
+
+    static class ServiceConsumer {
+        private final Ensure m_ensure;
+        private ServiceConsumerComposite m_composite;
+        @SuppressWarnings("unused")
+        private ServiceInterface m_service;
+
+        public ServiceConsumer(Ensure e) {
+            m_ensure = e;
+            m_composite = new ServiceConsumerComposite(m_ensure);
+        }
+        
+        public Object[] getComposition() {
+            return new Object[] { this, m_composite };
+        }
+        
+        void add(ServiceInterface service) {
+            m_ensure.step(1);
+            m_service = service; // This method seems to not being called 
anymore 
+        }
+        
+        void start() {
+            m_composite.invoke();
+            m_ensure.step(5); 
+        }
+    }
+    
+    static class ServiceConsumerComposite {
+        ServiceInterface m_service;
+        private Ensure m_ensure;
+        
+        ServiceConsumerComposite(Ensure ensure)
+        {
+            m_ensure = ensure;
+        }
+
+        void add(ServiceInterface service) {
+
+            m_ensure.step(2);
+            m_service = service;
+        }
+
+        void invoke()
+        {
+            m_ensure.step(3);
+            m_service.invoke();
+        }
+    }
+}

Added: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/DynamicProxyAspectTest.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/DynamicProxyAspectTest.java?rev=1724712&view=auto
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/DynamicProxyAspectTest.java
 (added)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/DynamicProxyAspectTest.java
 Thu Jan 14 23:51:12 2016
@@ -0,0 +1,197 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.dm.builder.lambda.itest;
+
+import static 
org.apache.felix.dm.builder.lambda.DependencyActivatorBase.aspect;
+import static 
org.apache.felix.dm.builder.lambda.DependencyActivatorBase.component;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.DependencyManager;
+import org.junit.Assert;
+
+/**
+ * @author <a href="mailto:[email protected]";>Felix Project Team</a>
+ */
+@SuppressWarnings({"rawtypes"})
+public class DynamicProxyAspectTest extends TestBase {
+    public void testImplementGenericAspectWithDynamicProxyAndFactoryRef() {
+        DependencyManager m = getDM();
+        // helper class that ensures certain steps get executed in sequence
+        Ensure e = new Ensure();
+        
+        // create two service providers, each providing a different service 
interface
+        Component sp1 = component(m).impl(new 
ServiceProvider(e)).provides(ServiceInterface.class).build();
+        Component sp2 = component(m).impl(new 
ServiceProvider2(e)).provides(ServiceInterface2.class).build();
+        
+        // create a dynamic proxy based aspect and hook it up to both services
+        Component a1 = aspect(m, 
ServiceInterface.class).rank(10).autoConfig("m_service")
+            .factory(() -> new Factory(e, ServiceInterface.class, 
"ServiceInterfaceProxy"), Factory::create).build();
+        Component a2 = aspect(m, 
ServiceInterface2.class).rank(10).autoConfig("m_service")
+            .factory(() -> new Factory(e, ServiceInterface2.class, 
"ServiceInterfaceProxy2"), Factory::create).build();
+
+        // create a client that invokes a method on boths services, validate 
that it goes
+        // through the proxy twice
+        Component sc = component(m)
+            .impl(new ServiceConsumer(e))
+            .withService(ServiceInterface.class, 
ServiceInterface2.class).build();
+        
+        // register both producers, validate that both services are started
+        m.add(sp1);
+        e.waitForStep(1, 2000);
+        m.add(sp2);
+        e.waitForStep(2, 2000);
+        
+        // add both aspects, and validate that both instances have been created
+        m.add(a1);
+        m.add(a2);
+        e.waitForStep(4, 4000);
+        
+        // add the client, which will automatically invoke both services
+        m.add(sc);
+        
+        // wait until both services have been invoked
+        e.waitForStep(6, 4000);
+        
+        // make sure the proxy has been called twice
+        Assert.assertEquals("Proxy should have been invoked this many times.", 
2, DynamicProxyHandler.getCounter());
+        
+        m.remove(sc);
+        m.remove(a2);
+        m.remove(a1);
+        m.remove(sp2);
+        m.remove(sp1);
+        m.remove(a2);
+        m.remove(a1);
+        
+        try {
+            Thread.sleep(2000);
+        }
+        catch (InterruptedException e1) {
+            // TODO Auto-generated catch block
+            e1.printStackTrace();
+        }
+    }
+    
+    static interface ServiceInterface {
+        public void invoke(Runnable run);
+    }
+    
+    static interface ServiceInterface2 {
+        public void invoke(Runnable run);
+    }
+    
+    static class ServiceProvider implements ServiceInterface {
+        private final Ensure m_ensure;
+        public ServiceProvider(Ensure e) {
+            m_ensure = e;
+        }
+        public void start() {
+            m_ensure.step(1);
+        }
+        public void invoke(Runnable run) {
+            run.run();
+        }
+    }
+    
+    static class ServiceProvider2 implements ServiceInterface2 {
+        private final Ensure m_ensure;
+        public ServiceProvider2(Ensure ensure) {
+            m_ensure = ensure;
+        }
+        public void start() {
+            m_ensure.step(2);
+        }
+        public void invoke(Runnable run) {
+            run.run();
+        }
+    }
+    
+    static class ServiceConsumer implements Runnable {
+        private volatile ServiceInterface m_service;
+        private volatile ServiceInterface2 m_service2;
+        private final Ensure m_ensure;
+
+        public ServiceConsumer(Ensure e) {
+            m_ensure = e;
+        }
+        
+        public void init() {
+            Thread t = new Thread(this);
+            t.start();
+        }
+        
+        public void run() {
+            m_service.invoke(Ensure.createRunnableStep(m_ensure, 5));
+            m_service2.invoke(Ensure.createRunnableStep(m_ensure, 6));
+        }
+    }
+    
+    static class DynamicProxyHandler implements InvocationHandler {
+        public volatile Object m_service; // ISSUE, we cannot inject into 
"Object" at the moment
+        private final String m_label;
+        private static volatile int m_counter = 0;
+
+        public DynamicProxyHandler(String label) {
+            m_label = label;
+        }
+
+        public Object invoke(Object proxy, Method method, Object[] args) 
throws Throwable {
+            System.out.println("IIIIIIINVOKE--------------------------" + 
method.getName());
+            if (m_service == null) {
+                Assert.fail("No service was injected into dynamic proxy 
handler " + m_label);
+            }
+            Method m = m_service.getClass().getMethod(method.getName(), 
method.getParameterTypes());
+            if (m == null) {
+                Assert.fail("No method " + method.getName() + " was found in 
instance " + m_service + " in dynamic proxy handler " + m_label);
+            }
+            if (method.getName().equals("invoke")) {
+                // only count methods called 'invoke' because those are 
actually the ones
+                // both interfaces implement (and the dynamic proxy might be 
invoked for
+                // other methods, such as toString() as well)
+                m_counter++;
+            }
+            return m.invoke(m_service, args);
+        }
+        
+        public static int getCounter() {
+            return m_counter;
+        }
+    }
+    
+    static class Factory {
+        private final String m_label;
+        private Class m_class;
+        private final Ensure m_ensure;
+        
+        public Factory(Ensure ensure, Class clazz, String label) {
+            m_ensure = ensure;
+            m_class = clazz;
+            m_label = label;
+        }
+        
+        public Object create() {
+            m_ensure.step();
+            return Proxy.newProxyInstance(m_class.getClassLoader(), new 
Class[] { m_class }, new DynamicProxyHandler(m_label));
+        }
+    }
+}

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/compositefactory/Activator.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/compositefactory/Activator.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/compositefactory/Activator.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/compositefactory/Activator.java
 Thu Jan 14 23:51:12 2016
@@ -53,7 +53,7 @@ public class Activator extends Dependenc
         component(comp -> comp
             .factory(factory::create, factory::getComposition)
             .withService(LogService.class, srv -> srv.cb(ADD, 
ProviderImpl::bind).cb(ADD, ProviderComposite1::bind))
-            .withConfiguration(conf -> 
conf.pid(ProviderFactory.class).cb(factory::updated)));
+            .withConfiguration(conf -> 
conf.pid(ProviderFactory.class).cbi(factory::updated)));
                 
         // Creates a configuration with pid name = 
"org.apache.felix.dependencymanager.lambda.samples.compositefactory.ProviderFactory"
         component(comp -> comp

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/dictionary/Activator.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/dictionary/Activator.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/dictionary/Activator.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/dictionary/Activator.java
 Thu Jan 14 23:51:12 2016
@@ -36,10 +36,10 @@ public class Activator extends Dependenc
         // Create the factory configuration for our DictionaryImpl service.
         factoryPidAdapter(adapter -> adapter
             .impl(DictionaryImpl.class)
+            .provides(DictionaryService.class)
             .factoryPid(DictionaryConfiguration.class)
-            .cb(DictionaryImpl::updated)
             .propagate()
-            .provides(DictionaryService.class)
+            .cb(DictionaryImpl::updated)
             .withService(LogService.class, dep -> dep.required(false)));
                             
         // Create the Dictionary Aspect
@@ -52,8 +52,7 @@ public class Activator extends Dependenc
         // Create the SpellChecker component        
         component(comp -> comp
             .impl(SpellChecker.class)
-            .provides(SpellChecker.class)
-            .properties(COMMAND_SCOPE, "dictionary", COMMAND_FUNCTION, new 
String[] {"spellcheck"}) 
+            .provides(SpellChecker.class, COMMAND_SCOPE, "dictionary", 
COMMAND_FUNCTION, new String[] {"spellcheck"}) 
             .withService(DictionaryService.class, srv -> srv.required())
             .withService(LogService.class, srv -> srv.required(false)));
     }

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/rx/completable/SiteInfoImpl.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/rx/completable/SiteInfoImpl.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/rx/completable/SiteInfoImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/rx/completable/SiteInfoImpl.java
 Thu Jan 14 23:51:12 2016
@@ -45,7 +45,7 @@ public class SiteInfoImpl implements Sit
                // our component until the page has been downloaded and parsed.
                
                Observable<List<String>> links = 
downloadSite(m_url).map(this::getSiteLinks);
-        component(c, comp -> comp.withFuture(toFuture(links), futuredep -> 
futuredep.cb(this::setLinks)));
+        component(c, comp -> comp.withFuture(toFuture(links), futuredep -> 
futuredep.cbi(this::setLinks)));
        }
        
        // Called when our future has completed.

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleDependencyBuilder.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleDependencyBuilder.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleDependencyBuilder.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleDependencyBuilder.java
 Thu Jan 14 23:51:12 2016
@@ -17,13 +17,14 @@ import org.osgi.framework.Bundle;
  * @author <a href="mailto:[email protected]";>Felix Project Team</a>
  */
 public interface BundleDependencyBuilder extends 
DependencyBuilder<BundleDependency> {
-
-    BundleDependencyBuilder cbInst(Object callbackInstance);
     
     BundleDependencyBuilder cb(String add);
+    BundleDependencyBuilder cb(Object callbackInstance, String add);
     BundleDependencyBuilder cb(String add, String remove);
+    BundleDependencyBuilder cb(Object callbackInstance, String add, String 
remove);
     BundleDependencyBuilder cb(String add, String change, String remove);
-    
+    BundleDependencyBuilder cb(Object callbackInstance, String add, String 
change, String remove);
+
     <T> BundleDependencyBuilder cb(Cb callbackType, CbTypeBundle<T> callback);
     <T> BundleDependencyBuilder cb(Cb callbackType, CbTypeComponentBundle<T> 
callback); 
     

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ComponentBuilderBase.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ComponentBuilderBase.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ComponentBuilderBase.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ComponentBuilderBase.java
 Thu Jan 14 23:51:12 2016
@@ -3,7 +3,10 @@ package org.apache.felix.dm.builder.lamb
 import java.util.Dictionary;
 import java.util.concurrent.CompletableFuture;
 import java.util.function.BiConsumer;
+import java.util.function.BiFunction;
 import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Supplier;
 
 import org.apache.felix.dm.Component;
 import org.apache.felix.dm.builder.lambda.Functions.CbComponent;
@@ -82,7 +85,7 @@ public interface ComponentBuilderBase<T,
      * @param consumer the lambda used to build the configuration dependency.
      * @return this builder.
      */
-    B withConfiguration(Consumer<ConfigurationDependencyBuilder<T>> consumer); 
       
+    B withConfiguration(Consumer<ConfigurationDependencyBuilder> consumer);    
    
     
     /**
      * Adds a bundle dependency.
@@ -96,7 +99,7 @@ public interface ComponentBuilderBase<T,
      * @param future
      * @return
      */
-    <V> B withFuture(CompletableFuture<V> future, 
Consumer<FutureDependencyBuilder<T, V>> consumer);
+    <V> B withFuture(CompletableFuture<V> future, 
Consumer<FutureDependencyBuilder<V>> consumer);
 
     B init(Consumer<T> callback);
     B init(BiConsumer<T, Component> callback);
@@ -163,7 +166,24 @@ public interface ComponentBuilderBase<T,
     B autoAdd();
     
     /**
-     * Builds the real DependencyManager Component from this Component.
+     * TODO
+     * @param method
+     * @return
+     */
+    B composition(String getCompositionMethod);
+    
+    /**
+     * TODO
+     * @param instance
+     * @param method
+     * @return
+     */
+    B composition(Object instance, String getCompositionMethod);
+
+    B composition(Supplier<Object[]> getCompositionMethod);
+
+    /**
+     * Builds the real DependencyManager Component.
      * @return the real DependencyManager Component.
      */
     Component build();

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ConfigurationDependencyBuilder.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ConfigurationDependencyBuilder.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ConfigurationDependencyBuilder.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ConfigurationDependencyBuilder.java
 Thu Jan 14 23:51:12 2016
@@ -22,20 +22,17 @@ import org.apache.felix.dm.builder.lambd
  *
  * TODO: javadoc
  */
-public interface ConfigurationDependencyBuilder<T> extends 
DependencyBuilder<ConfigurationDependency> { 
+public interface ConfigurationDependencyBuilder extends 
DependencyBuilder<ConfigurationDependency> { 
+    ConfigurationDependencyBuilder pid(String pid);
+    ConfigurationDependencyBuilder pid(Class<?> pidClass);
+    ConfigurationDependencyBuilder propagate();
+    ConfigurationDependencyBuilder propagate(boolean propagate);
     
-    ConfigurationDependencyBuilder<T> pid(String pid);
-    ConfigurationDependencyBuilder<T> pid(Class<?> pidClass);
-    ConfigurationDependencyBuilder<T> propagate();
-    ConfigurationDependencyBuilder<T> propagate(boolean propagate);
-    
-    ConfigurationDependencyBuilder<T> cb(String updateMethod);
-    ConfigurationDependencyBuilder<T> cb(Object callbackInstance, String 
updateMethod);
+    ConfigurationDependencyBuilder cb(String updateMethod);
+    ConfigurationDependencyBuilder cb(Object callbackInstance, String 
updateMethod);
 
-    ConfigurationDependencyBuilder<T> cb(CbTypeDictionary<T> callback);
-    ConfigurationDependencyBuilder<T> cb(CbDictionary updated);   
-    ConfigurationDependencyBuilder<T> cb(CbComponentDictionary updated);   
-    
-    <U> ConfigurationDependencyBuilder<T> compositeCb(CbTypeDictionary<U> 
callback);
-    <U> ConfigurationDependencyBuilder<T> 
compositeCb(CbTypeComponentDictionary<U> callback);
+    <T> ConfigurationDependencyBuilder cb(CbTypeDictionary<T> callback);
+    <T> ConfigurationDependencyBuilder cb(CbTypeComponentDictionary<T> 
callback);
+    ConfigurationDependencyBuilder cbi(CbDictionary updated);   
+    ConfigurationDependencyBuilder cbi(CbComponentDictionary updated);   
 }

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/FactoryPidAdapterBuilder.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/FactoryPidAdapterBuilder.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/FactoryPidAdapterBuilder.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/FactoryPidAdapterBuilder.java
 Thu Jan 14 23:51:12 2016
@@ -100,11 +100,8 @@ public interface FactoryPidAdapterBuilde
     FactoryPidAdapterBuilder<T> cb(String updateMethod);
     FactoryPidAdapterBuilder<T> cb(Object callbackInstance, String 
updateMethod);
     
-    FactoryPidAdapterBuilder<T> cb(CbTypeDictionary<T> callback);
-    FactoryPidAdapterBuilder<T> cb(CbTypeComponentDictionary<T> callback);
-    FactoryPidAdapterBuilder<T> cb(CbDictionary callback);
-    FactoryPidAdapterBuilder<T> cb(CbComponentDictionary callback);
-
-    <U> FactoryPidAdapterBuilder<T> compositeCb(CbTypeDictionary<U> callback);
-    <U> FactoryPidAdapterBuilder<T> compositeCb(CbTypeComponentDictionary<U> 
callback);
+    <U> FactoryPidAdapterBuilder<T> cb(CbTypeDictionary<U> callback);
+    <U> FactoryPidAdapterBuilder<T> cb(CbTypeComponentDictionary<U> callback);
+    FactoryPidAdapterBuilder<T> cbi(CbDictionary callback);
+    FactoryPidAdapterBuilder<T> cbi(CbComponentDictionary callback);
 }

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/FutureDependencyBuilder.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/FutureDependencyBuilder.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/FutureDependencyBuilder.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/FutureDependencyBuilder.java
 Thu Jan 14 23:51:12 2016
@@ -29,7 +29,7 @@ import org.apache.felix.dm.builder.lambd
  *      component(comp -> comp
  *             .impl(MyComponent.class)
  *          .withService(LogService.class, srv -> 
srv.onAdd(SiteInfoImpl::bindLog))
- *          .withFuture(felixFuture, future -> 
future.thenAccept(SiteInfoImpl::bindFelixPage)));
+ *          .withFuture(felixFuture, future -> 
future.cb(SiteInfoImpl::bindFelixPage)));
  *     
  *   }
  * 
@@ -39,7 +39,30 @@ import org.apache.felix.dm.builder.lambd
  * 
  * @param <F> the type of the CompletableFuture result.
  */
-public interface FutureDependencyBuilder<T, F> extends 
DependencyBuilder<Dependency> {    
+public interface FutureDependencyBuilder<F> extends 
DependencyBuilder<Dependency> {    
+    /**
+     * Sets the action to perform when the future task has completed. The 
action is one of the Component instance method that accepts the
+     * result of the completed future.
+     * @param action the action to perform when the future task as completed. 
+     * @return this dependency
+     */
+    <T> FutureDependencyBuilder<F> cb(CbTypeFuture<T, ? super F> action);
+    
+    /**
+     * TODO
+     * @param action
+     * @param async
+     * @return
+     */
+    <T> FutureDependencyBuilder<F> cb(CbTypeFuture<T, ? super F> action, 
boolean async);
+
+    /**
+     * TODO
+     * @param action
+     * @param executor
+     * @return
+     */
+    <T> FutureDependencyBuilder<F> cb(CbTypeFuture<T, ? super F> action, 
Executor executor);   
         
     /**
      * Sets the action to perform when the future task has completed. The 
action is a Consumer instance which accepts the
@@ -47,7 +70,7 @@ public interface FutureDependencyBuilder
      * @param action the action to perform when the future task as completed. 
      * @return this dependency
      */
-    FutureDependencyBuilder<T, F> cb(CbFuture<? super F> action);
+    FutureDependencyBuilder<F> cbi(CbFuture<? super F> action);
     
     /**
      * Sets the action to perform asynchronously when the future task has 
completed. The action is a Consumer instance which accepts the
@@ -55,7 +78,7 @@ public interface FutureDependencyBuilder
      * @param action the action to perform when the future task as completed. 
      * @return this dependency
      */
-    FutureDependencyBuilder<T, F> cb(CbFuture<? super F> action, boolean 
async);
+    FutureDependencyBuilder<F> cbi(CbFuture<? super F> action, boolean async);
 
     /**
      * Sets the action to perform asynchronously when the future task has 
completed. The action is a Consumer instance which accepts the
@@ -64,28 +87,5 @@ public interface FutureDependencyBuilder
      * @param executor the executor to use for asynchronous execution of the 
action.
      * @return this dependency
      */
-    FutureDependencyBuilder<T, F> cb(CbFuture<? super F> action, Executor 
executor);   
-
-       /**
-        * Sets the action to perform when the future task has completed. The 
action is one of the Component instance method that accepts the
-        * result of the completed future.
-        * @param action the action to perform when the future task as 
completed. 
-        * @return this dependency
-        */
-       FutureDependencyBuilder<T, F> cb(CbTypeFuture<T, ? super F> action);
-       
-    FutureDependencyBuilder<T, F> cb(CbTypeFuture<T, ? super F> action, 
boolean async);
-
-    FutureDependencyBuilder<T, F> cb(CbTypeFuture<T, ? super F> action, 
Executor executor);   
-
-       /**
-        * Sets the action to perform asynchronously when the future task has 
completed. The action is one of the Component instance method that accepts the
-        * result of the completed future.
-        * @param action the action to perform when the future task as 
completed. 
-        * @param executor the executor to use for asynchronous execution of 
the action.
-        * @return this dependency
-        */
-    <C> FutureDependencyBuilder<T, F> compositeCb(CbTypeFuture<C, ? super F> 
action);
-    <C> FutureDependencyBuilder<T, F> compositeCb(CbTypeFuture<C, ? super F> 
action, boolean async);
-    <C> FutureDependencyBuilder<T, F> compositeCb(CbTypeFuture<C, ? super F> 
action, Executor executor); 
+    FutureDependencyBuilder<F> cbi(CbFuture<? super F> action, Executor 
executor);   
 }

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceCallbacksBuilder.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceCallbacksBuilder.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceCallbacksBuilder.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceCallbacksBuilder.java
 Thu Jan 14 23:51:12 2016
@@ -60,13 +60,15 @@ public interface ServiceCallbacksBuilder
         * @return this builder
      */
     B autoConfig(String field);            
-    
-    B cbInst(Object callbackInstance);
-    
+        
     B cb(String add);
+    B cb(Object callbackInstance, String add);
     B cb(String add, String remove);
+    B cb(Object callbackInstance, String add, String remove);
     B cb(String add, String change, String remove);
+    B cb(Object callbackInstance, String add, String change, String remove);
     B cb(String add, String change, String remove, String swap);
+    B cb(Object callbackInstance, String add, String change, String remove, 
String swap);
 
     <T> B cb(Cb callbackType, CbTypeService<T, S> callback);
     <T> B cb(Cb callbackType, CbTypeServiceMap<T, S> callback);

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceDependencyBuilder.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceDependencyBuilder.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceDependencyBuilder.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceDependencyBuilder.java
 Thu Jan 14 23:51:12 2016
@@ -1,5 +1,9 @@
 package org.apache.felix.dm.builder.lambda;
 
+import java.util.Dictionary;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+
 import org.apache.felix.dm.ServiceDependency;
 import org.osgi.framework.ServiceReference;
 
@@ -65,6 +69,21 @@ public interface ServiceDependencyBuilde
     ServiceDependencyBuilder<S> propagate(Object instance, String method);
     
     /**
+     * TODO
+     * @param propagate
+     * @return
+     */
+    ServiceDependencyBuilder<S> propagate(Function<ServiceReference<S>, 
Dictionary<String, Object>> propagate);
+
+    /**
+     * TODO
+     * @param propagate
+     * @return
+     */
+    ServiceDependencyBuilder<S> propagate(BiFunction<ServiceReference<S>, S, 
Dictionary<String, Object>> propagate);
+
+    
+    /**
      * Sets the default implementation if the service is not available.
      * @param defaultImpl the implementation used by default when the service 
is not available.
         * @return this builder

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/AdapterBase.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/AdapterBase.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/AdapterBase.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/AdapterBase.java
 Thu Jan 14 23:51:12 2016
@@ -4,6 +4,8 @@ import java.util.Dictionary;
 import java.util.concurrent.CompletableFuture;
 import java.util.function.BiConsumer;
 import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Supplier;
 
 import org.apache.felix.dm.Component;
 import org.apache.felix.dm.builder.lambda.BundleDependencyBuilder;
@@ -64,8 +66,6 @@ public interface AdapterBase<T, B extend
         andThenBuild(compBuilder -> compBuilder.provides(ifaces, properties));
         return (B) this;
     }
-
-
     
     default B provides(String  iface) {
         andThenBuild(compBuilder -> compBuilder.provides(iface));
@@ -132,7 +132,7 @@ public interface AdapterBase<T, B extend
         return (B) this;
     }
     
-    default B withConfiguration(Consumer<ConfigurationDependencyBuilder<T>> 
consumer) {
+    default B withConfiguration(Consumer<ConfigurationDependencyBuilder> 
consumer) {
         andThenBuild(compBuilder -> compBuilder.withConfiguration(consumer));
         return (B) this;
     }
@@ -142,7 +142,7 @@ public interface AdapterBase<T, B extend
         return (B) this;
     }
     
-    default <U> B withFuture(CompletableFuture<U> future, 
Consumer<FutureDependencyBuilder<T, U>> consumer) {
+    default <U> B withFuture(CompletableFuture<U> future, 
Consumer<FutureDependencyBuilder<U>> consumer) {
         andThenBuild(compBuilder -> compBuilder.withFuture(future, consumer));
         return (B) this;
     }
@@ -282,4 +282,18 @@ public interface AdapterBase<T, B extend
         return (B) this;
     }
     
+    default B composition(String getCompositionMethod) {
+        andThenBuild(compBuilder -> 
compBuilder.composition(getCompositionMethod));
+        return (B) this;
+    }
+
+    default B composition(Object instance, String getCompositionMethod) {
+        andThenBuild(compBuilder -> compBuilder.composition(instance, 
getCompositionMethod));
+        return (B) this;
+    }
+    
+    default B composition(Supplier<Object[]> getCompositionMethod) {
+        andThenBuild(compBuilder -> 
compBuilder.composition(getCompositionMethod));
+        return (B) this;
+    }
 }

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleDependencyBuilderImpl.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleDependencyBuilderImpl.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleDependencyBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleDependencyBuilderImpl.java
 Thu Jan 14 23:51:12 2016
@@ -38,19 +38,8 @@ public class BundleDependencyBuilderImpl
        private Supplier<Dictionary<?, ?>> m_propagateSupplier;
        private final Component m_component;
     
-       /**
-        * List of service (add/change/remove) callbacks (method references).
-        */
        private final Map<String, List<MethodRef<Object>>> m_refs = new 
HashMap<>();
 
-       /**
-     * This interface (lambda) is called when we want to invoke a method 
reference. the lambda is called with all necessary dependency 
-     * informations.
-     * 
-     * When the lambda is called, it will invoke the proper callback on the 
given component instance.
-     *
-     * @param <I> type of a component instance
-     */
     @FunctionalInterface
     interface MethodRef<I> {
         public void accept(I instance, Component c, Bundle bundle);
@@ -149,13 +138,30 @@ public class BundleDependencyBuilderImpl
     }
     
     @Override
+    public BundleDependencyBuilder cb(Object callbackInstance, String add) {
+        cb(callbackInstance, add, null, null);
+        return this;
+    }
+    
+    @Override
     public BundleDependencyBuilder cb(String add, String remove) {
         cb(add, null, remove);
         return this;
     }
-        
+    
+    @Override
+    public BundleDependencyBuilder cb(Object callbackInstance, String add, 
String remove) {
+        cb(callbackInstance, add, null, remove);
+        return this;
+    }
+    
     public BundleDependencyBuilder cb(String added, String changed, String 
removed) {
+        return cb(null, added, changed, removed);
+    }
+    
+    public BundleDependencyBuilder cb(Object callbackInstance, String added, 
String changed, String removed) {
         requiresNoMethodRefs();
+        m_instance = callbackInstance;
         m_added = added != null ? added : m_added;
         m_changed = changed != null ? changed : m_changed;
         m_removed = removed != null ? removed : m_removed;
@@ -164,12 +170,6 @@ public class BundleDependencyBuilderImpl
     }
 
     @Override
-    public BundleDependencyBuilder cbInst(Object instance) {
-        m_instance = instance;
-        return this;
-    }    
-
-    @Override
     public <T> BundleDependencyBuilder cb(Cb callbackType, CbTypeBundle<T> 
callback) {      
         return setComponentCallbackRef(callbackType.getCallback(), 
Helpers.getLambdaGenericType(callback, 0),
             (inst, component, bundle) -> callback.accept ((T) inst, bundle));

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/CompletableFutureDependencyImpl.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/CompletableFutureDependencyImpl.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/CompletableFutureDependencyImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/CompletableFutureDependencyImpl.java
 Thu Jan 14 23:51:12 2016
@@ -15,7 +15,7 @@ import org.apache.felix.dm.context.Event
 import org.apache.felix.dm.context.EventType;
 import org.osgi.service.log.LogService;
 
-public class CompletableFutureDependencyImpl<T, F> extends 
AbstractDependency<CompletableFutureDependencyImpl<T, F>> implements 
FutureDependencyBuilder<T, F> {
+public class CompletableFutureDependencyImpl<F> extends 
AbstractDependency<CompletableFutureDependencyImpl<F>> implements 
FutureDependencyBuilder<F> {
 
        private final CompletableFuture<F> m_future;
        private Component m_comp;
@@ -37,7 +37,7 @@ public class CompletableFutureDependency
         * @param prototype
         *            the existing PathDependency.
         */
-       public CompletableFutureDependencyImpl(Component component, 
CompletableFutureDependencyImpl<T, F> prototype) {
+       public CompletableFutureDependencyImpl(Component component, 
CompletableFutureDependencyImpl<F> prototype) {
                super(prototype);
                m_future = prototype.m_future;
                m_comp = component;
@@ -49,68 +49,45 @@ public class CompletableFutureDependency
        }
 
        @Override
-       public FutureDependencyBuilder<T, F> cb(CbFuture<? super F> consumer) {
-           cb(consumer, false);
-               return this;
+       public <T> FutureDependencyBuilder<F> cb(CbTypeFuture<T, ? super F> 
consumer) {
+           return cb(consumer, false);
        }
-       
+
+       @SuppressWarnings("unchecked")
        @Override
-       public FutureDependencyBuilder<T, F> cb(CbFuture<? super F> consumer, 
boolean async) {
-           m_accept = m_accept.andThen(future -> consumer.accept(future));
+       public <T> FutureDependencyBuilder<F> cb(CbTypeFuture<T, ? super F> 
consumer, boolean async) {
+           m_accept2Type = Helpers.getLambdaGenericType(consumer, 0);;
+           m_accept2 = (instance, result) -> consumer.accept((T) instance, 
result);
            m_async = async;
            return this;
        }   
 
-    @Override
-    public FutureDependencyBuilder<T, F> cb(CbFuture<? super F> consumer, 
Executor executor) {
-        cb(consumer, true /* async */);
-        m_exec = executor;
-        return this;
-    }
-
-
        @Override
-       public FutureDependencyBuilder<T, F> cb(CbTypeFuture<T, ? super F> 
consumer) {
-           cb(consumer, false);
-               return this;
+       public <T> FutureDependencyBuilder<F> cb(CbTypeFuture<T, ? super F> 
consumer, Executor executor) {
+           cb(consumer, true /* async */);
+           m_exec = executor;
+           return this;
        }
 
-       @SuppressWarnings("unchecked")
-    @Override
-       public FutureDependencyBuilder<T, F> cb(CbTypeFuture<T, ? super F> 
consumer, boolean async) {
-        m_accept2 = (instance, result) -> consumer.accept((T) instance, 
result);
-               m_async = async;
-               return this;
-       }       
-
-
        @Override
-       public FutureDependencyBuilder<T, F> cb(CbTypeFuture<T, ? super F> 
consumer, Executor executor) {
-               cb(consumer, true /* async */);
-               m_exec = executor;
+       public FutureDependencyBuilder<F> cbi(CbFuture<? super F> consumer) {
+           cbi(consumer, false);
                return this;
        }
-
-       public <C> FutureDependencyBuilder<T, F> compositeCb(CbTypeFuture<C, ? 
super F> consumer) {
-           compositeCb(consumer, false);
-           return this;
-       }    
-
-       @SuppressWarnings("unchecked")
-    @Override
-       public <C> FutureDependencyBuilder<T, F> compositeCb(CbTypeFuture<C, ? 
super F> consumer, boolean async) {
+       
+       @Override
+       public FutureDependencyBuilder<F> cbi(CbFuture<? super F> consumer, 
boolean async) {
+           m_accept = m_accept.andThen(future -> consumer.accept(future));
            m_async = async;
-        m_accept2Type = Helpers.getLambdaGenericType(consumer, 0);;
-           m_accept2 = (instance, result) -> consumer.accept((C) instance, 
result);
            return this;
        }   
 
     @Override
-       public <C> FutureDependencyBuilder<T, F> compositeCb(CbTypeFuture<C, ? 
super F> consumer, Executor executor) {
-           compositeCb(consumer, true /* async */);
-           m_exec = executor;
-           return this;
-       }
+    public FutureDependencyBuilder<F> cbi(CbFuture<? super F> consumer, 
Executor executor) {
+        cbi(consumer, true /* async */);
+        m_exec = executor;
+        return this;
+    }
 
        // ---------- DependencyContext interface ----------
 
@@ -134,7 +111,7 @@ public class CompletableFutureDependency
 
        @Override
        public DependencyContext createCopy() {
-               return new CompletableFutureDependencyImpl<T, F>(m_comp, this);
+               return new CompletableFutureDependencyImpl<F>(m_comp, this);
        }
 
        @Override

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ComponentBuilderImpl.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ComponentBuilderImpl.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ComponentBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ComponentBuilderImpl.java
 Thu Jan 14 23:51:12 2016
@@ -37,7 +37,9 @@ public class ComponentBuilderImpl<T> imp
     private Object m_factory;
     private boolean m_factoryHasComposite;     
     private boolean m_autoAdd = true;
-       private final Map<String, Consumer<Component>> m_lfclCallbacks = new 
HashMap<>();       
+       private final Map<String, Consumer<Component>> m_lfclCallbacks = new 
HashMap<>();
+    private Object m_compositionInstance;
+    private String m_compositionMethod;        
 
     public ComponentBuilderImpl(DependencyManager dm) {
         m_component = dm.createComponent();
@@ -318,6 +320,26 @@ public class ComponentBuilderImpl<T> imp
         return (ComponentBuilder<V>) this;
     }
         
+    public ComponentBuilderImpl<T> composition(String getCompositionMethod) {
+        return composition(null, getCompositionMethod);
+    }
+    
+    public ComponentBuilderImpl<T> composition(Object instance, String 
getCompositionMethod) {
+        m_compositionInstance = instance;
+        m_compositionMethod = getCompositionMethod;
+        return this;
+    }
+    
+    public ComponentBuilderImpl<T> composition(Supplier<Object[]> 
getCompositionMethod) {
+        m_compositionInstance = new Object() {
+            public Object[] getComposition() {
+                return getCompositionMethod.get();
+            }
+        };
+        m_compositionMethod = "getComposition";
+        return this;
+    }
+
     @Override
     public ComponentBuilderImpl<T> withService(Class<?> service, Class<?> ... 
services) {
         doWithService(service);
@@ -341,8 +363,8 @@ public class ComponentBuilderImpl<T> imp
     }   
     
     @Override
-    public ComponentBuilderImpl<T> 
withConfiguration(Consumer<ConfigurationDependencyBuilder<T>> consumer) {
-        ConfigurationDependencyBuilder<T> dep = new 
ConfigurationDependencyBuilderImpl<>(m_component);
+    public ComponentBuilderImpl<T> 
withConfiguration(Consumer<ConfigurationDependencyBuilder> consumer) {
+        ConfigurationDependencyBuilder dep = new 
ConfigurationDependencyBuilderImpl(m_component);
         consumer.accept(dep);
         m_dependencyBuilders.add(dep);
         return this;
@@ -357,8 +379,8 @@ public class ComponentBuilderImpl<T> imp
     }
            
     @Override
-    public <V> ComponentBuilder<T> withFuture(CompletableFuture<V> future, 
Consumer<FutureDependencyBuilder<T, V>> consumer) {
-        FutureDependencyBuilder<T, V> dep = new 
CompletableFutureDependencyImpl<>(m_component, future);
+    public <V> ComponentBuilder<T> withFuture(CompletableFuture<V> future, 
Consumer<FutureDependencyBuilder<V>> consumer) {
+        FutureDependencyBuilder<V> dep = new 
CompletableFutureDependencyImpl<>(m_component, future);
         consumer.accept(dep);
         m_dependencyBuilders.add(dep);
         return this;
@@ -499,6 +521,7 @@ public class ComponentBuilderImpl<T> imp
         if (! m_componentUpdated) { // Don't override impl or set callbacks if 
component is being updated
            if (m_impl != null) {               
                m_component.setImplementation(m_impl);
+               m_component.setComposition(m_compositionInstance, 
m_compositionMethod);
            } else {
                Objects.nonNull(m_factory);
                m_component.setFactory(m_factory, "create");

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ConfigurationDependencyBuilderImpl.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ConfigurationDependencyBuilderImpl.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ConfigurationDependencyBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ConfigurationDependencyBuilderImpl.java
 Thu Jan 14 23:51:12 2016
@@ -1,8 +1,10 @@
 package org.apache.felix.dm.builder.lambda.impl;
 
+import java.util.ArrayList;
 import java.util.Dictionary;
+import java.util.List;
 import java.util.Objects;
-import java.util.function.BiConsumer;
+import java.util.stream.Stream;
 
 import org.apache.felix.dm.Component;
 import org.apache.felix.dm.ConfigurationDependency;
@@ -12,7 +14,7 @@ import org.apache.felix.dm.builder.lambd
 import org.apache.felix.dm.builder.lambda.Functions.CbTypeComponentDictionary;
 import org.apache.felix.dm.builder.lambda.Functions.CbTypeDictionary;
 
-public class ConfigurationDependencyBuilderImpl<T>  implements 
ConfigurationDependencyBuilder<T> {
+public class ConfigurationDependencyBuilderImpl implements 
ConfigurationDependencyBuilder {
     private String m_pid;
     private boolean m_propagate;
     private final Component m_component;
@@ -20,81 +22,74 @@ public class ConfigurationDependencyBuil
     private Object m_updateCallbackInstance;
     private boolean m_hasMethodRefs;
     private boolean m_hasReflectionCallback;
-
-    private BiConsumer<Component, Dictionary<String, Object>> m_callbacks = 
(component, props) -> {};
+    private final List<MethodRef<Object>> m_refs = new ArrayList<>();
+    
+    @FunctionalInterface
+    interface MethodRef<I> {
+        public void accept(I instance, Component c, Dictionary<String, Object> 
props);
+    }
     
     public ConfigurationDependencyBuilderImpl(Component component) {
         m_component = component;
     }
 
     @Override
-    public ConfigurationDependencyBuilder<T> pid(String pid) {
+    public ConfigurationDependencyBuilder pid(String pid) {
         m_pid = pid;
         return this;
     }
 
     @Override
-    public ConfigurationDependencyBuilder<T> pid(Class<?> pidClass) {
+    public ConfigurationDependencyBuilder pid(Class<?> pidClass) {
         m_pid = pidClass.getName();
         return this;
     }
 
     @Override
-    public ConfigurationDependencyBuilder<T> propagate() {
+    public ConfigurationDependencyBuilder propagate() {
         m_propagate = true;
         return this;
     }
 
     @Override
-    public ConfigurationDependencyBuilder<T> propagate(boolean propagate) {
+    public ConfigurationDependencyBuilder propagate(boolean propagate) {
         m_propagate = propagate;
         return this;
     }
 
-    public ConfigurationDependencyBuilder<T> cb(String update) {
+    public ConfigurationDependencyBuilder cb(String update) {
         checkHasNoMethodRefs();
         m_hasReflectionCallback = true;
         m_updateMethodName = update;
         return this;
     }
     
-    public ConfigurationDependencyBuilder<T> cb(Object callbackInstance, 
String update) {
-        cb(update);
+    public ConfigurationDependencyBuilder cb(Object callbackInstance, String 
update) {
         m_updateCallbackInstance = callbackInstance;
+        cb(update);
         return this;
     }
 
     @Override
-    public ConfigurationDependencyBuilder<T> cb(CbTypeDictionary<T>  callback) 
{
-        return addMethodRef((component, props) -> { 
callback.accept(component.getInstance(), props); });
+    public <T> ConfigurationDependencyBuilder cb(CbTypeDictionary<T>  
callback) {
+        Class<T> type = Helpers.getLambdaGenericType(callback, 0);
+        return setComponentCallbackRef(type, (instance, component, props) -> { 
callback.accept((T) instance, props); });
     }
 
     @Override
-    public <U> ConfigurationDependencyBuilder<T> 
compositeCb(CbTypeDictionary<U> callback) {
-        Class<U> type = Helpers.getLambdaGenericType(callback, 0); 
-        return addMethodRef((component, props) -> { 
-            U instance = Helpers.findCompositeInstance(component, type);
-            callback.accept(instance, props);                       
-        });
+    public <T> ConfigurationDependencyBuilder cb(CbTypeComponentDictionary<T>  
callback) {
+        Class<T> type = Helpers.getLambdaGenericType(callback, 0);
+        return setComponentCallbackRef(type, (instance, component, props) -> { 
callback.accept((T) instance, component, props); });
     }
 
     @Override
-    public <U> ConfigurationDependencyBuilder<T> 
compositeCb(CbTypeComponentDictionary<U> callback) {
-        Class<U> type = Helpers.getLambdaGenericType(callback, 0); 
-        return addMethodRef((component, props) -> { 
-            U instance = Helpers.findCompositeInstance(component, type);
-            callback.accept(instance, component, props);                       
-        });
+    public ConfigurationDependencyBuilder cbi(CbDictionary callback) {
+        return setInstanceCallbackRef((instance, component, props) -> { 
callback.accept(props); });
     }
     
     @Override
-    public ConfigurationDependencyBuilder<T> cb(CbDictionary callback) {
-        return addMethodRef((component, props) -> { callback.accept(props); });
-    }
-    
-    @Override
-    public ConfigurationDependencyBuilder<T> cb(CbComponentDictionary 
callback) {
-        return addMethodRef((component, props) -> { callback.accept(component, 
props); });
+    public ConfigurationDependencyBuilder cbi(CbComponentDictionary callback) {
+        return setInstanceCallbackRef((instance, component, props) -> { 
callback.accept(component, props); });
     }
 
     @Override
@@ -109,17 +104,31 @@ public class ConfigurationDependencyBuil
             dep.setCallback(new Object() {
                 @SuppressWarnings("unused")
                 void updated(Component comp, Dictionary<String, Object> props) 
{
-                    m_callbacks.accept(comp, props);
+                    m_refs.forEach(mref -> mref.accept(null, comp, props));
                 }
             }, "updated", true /* we need component instances before updated 
is called */);
         }
         return dep;
     }
     
-    private ConfigurationDependencyBuilder<T> 
addMethodRef(BiConsumer<Component, Dictionary<String, Object>> callback) {
+    private <T> ConfigurationDependencyBuilder 
setInstanceCallbackRef(MethodRef<T> ref) {
+        checkHasNoReflectionCallbacks();
+        m_hasMethodRefs = true;
+        m_refs.add((instance, component, props) -> ref.accept(null, component, 
props));
+        return this;
+    }
+    
+    @SuppressWarnings("unchecked")
+    private <T> ConfigurationDependencyBuilder 
setComponentCallbackRef(Class<T> type, MethodRef<T> ref) {
         checkHasNoReflectionCallbacks();
         m_hasMethodRefs = true;
-        m_callbacks = m_callbacks.andThen(callback);
+        m_refs.add((instance, component, props) -> {
+            Stream.of(component.getInstances()).forEach(inst -> {
+                if (Helpers.getClass(inst).equals(type)) {
+                    ref.accept((T) inst, component, props);
+                }
+            });
+        });
         return this;
     }
     

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/FactoryPidAdapterBuilderImpl.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/FactoryPidAdapterBuilderImpl.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/FactoryPidAdapterBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/FactoryPidAdapterBuilderImpl.java
 Thu Jan 14 23:51:12 2016
@@ -1,11 +1,13 @@
 package org.apache.felix.dm.builder.lambda.impl;
 
+import java.util.ArrayList;
 import java.util.Dictionary;
+import java.util.List;
 import java.util.Objects;
-import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
+import java.util.stream.Stream;
 
 import org.apache.felix.dm.Component;
 import org.apache.felix.dm.DependencyManager;
@@ -24,12 +26,17 @@ public class FactoryPidAdapterBuilderImp
     private boolean m_propagate;
     private final DependencyManager m_dm;
     private boolean m_autoAdd = true;
-    private BiConsumer<Component, Dictionary<String, Object>> m_callbacks = 
(component, props) -> {};
     private String m_updateMethodName;
     private Object m_updateCallbackInstance;
     private boolean m_hasMethodRefs;
     private boolean m_hasReflectionCallback;
     private Consumer<ComponentBuilder<T>> m_compBuilder = (componentBuilder -> 
{});
+    private final List<MethodRef<Object>> m_refs = new ArrayList<>();
+
+    @FunctionalInterface
+    interface MethodRef<I> {
+        public void accept(I instance, Component c, Dictionary<String, Object> 
props);
+    }
 
     public FactoryPidAdapterBuilderImpl(DependencyManager dm) {
         m_dm = dm;
@@ -129,52 +136,28 @@ public class FactoryPidAdapterBuilderImp
     }
     
     @Override
-    public FactoryPidAdapterBuilder<T> cb(CbTypeDictionary<T> callback) {
-        return addMethodRef((component, props) -> { 
-            callback.accept(component.getInstance(), props);
-        });
+    public <U> FactoryPidAdapterBuilder<T> cb(CbTypeDictionary<U> callback) {
+        Class<U> type = Helpers.getLambdaGenericType(callback, 0);
+        return setComponentCallbackRef(type, (instance, component, props) -> { 
callback.accept((U) instance, props); });
     }
     
     @Override
-    public FactoryPidAdapterBuilder<T> cb(CbDictionary callback) {
-        return addMethodRef((component, props) -> { 
-            callback.accept(props);
-        });
+    public <U> FactoryPidAdapterBuilder<T> cb(CbTypeComponentDictionary<U> 
callback) {
+        Class<U> type = Helpers.getLambdaGenericType(callback, 0);
+        return setComponentCallbackRef(type, (instance, component, props) -> { 
callback.accept((U) instance, component, props); });
     }
 
     @Override
-    public FactoryPidAdapterBuilder<T> cb(CbComponentDictionary callback) {
-        return addMethodRef((component, props) -> { 
-            callback.accept(component, props);
-        });
+    public FactoryPidAdapterBuilder<T> cbi(CbDictionary callback) {
+        return setInstanceCallbackRef((instance, component, props) -> { 
callback.accept(props); });
     }
 
     @Override
-    public FactoryPidAdapterBuilder<T> cb(CbTypeComponentDictionary<T> 
callback) {
-        return addMethodRef((component, props) -> { 
-            callback.accept(component.getInstance(), component, props); 
-        });
+    public FactoryPidAdapterBuilder<T> cbi(CbComponentDictionary callback) {
+        return setInstanceCallbackRef((instance, component, props) -> { 
callback.accept(component, props); });
     }
 
     @Override
-    public <U> FactoryPidAdapterBuilder<T> compositeCb(CbTypeDictionary<U> 
callback) {
-        Class<U> type = Helpers.getLambdaGenericType(callback, 0);
-        return addMethodRef((component, props) -> { 
-            U instance = Helpers.findCompositeInstance(component, type);
-            callback.accept(instance, props);                       
-        });
-    }
-    
-    @Override
-    public <U> FactoryPidAdapterBuilder<T> 
compositeCb(CbTypeComponentDictionary<U> callback) {
-        Class<U> type = Helpers.getLambdaGenericType(callback, 0);
-        return addMethodRef((component, props) -> { 
-            U instance = Helpers.findCompositeInstance(component, type);
-            callback.accept(instance, component, props);                       
-        });
-    }
-    
-    @Override
     public Component build() {        
         Objects.nonNull(m_factoryPid);
         Component c = null;
@@ -183,7 +166,7 @@ public class FactoryPidAdapterBuilderImp
             Object wrapCallback = new Object() {
                 @SuppressWarnings("unused")
                 public void updated(Component comp, Dictionary<String, Object> 
conf) {
-                    m_callbacks.accept(comp, conf);
+                    m_refs.forEach(mref -> mref.accept(null, comp, conf));
                 }
             };
             c = m_dm.createFactoryConfigurationAdapterService(m_factoryPid, 
"updated", m_propagate, wrapCallback);
@@ -195,13 +178,27 @@ public class FactoryPidAdapterBuilderImp
         return cb.build();
     }
     
-    private FactoryPidAdapterBuilder<T> addMethodRef(BiConsumer<Component, 
Dictionary<String, Object>> callback) {
+    private <U> FactoryPidAdapterBuilder<T> 
setInstanceCallbackRef(MethodRef<U> ref) {
         checkHasNoReflectionCallbacks();
         m_hasMethodRefs = true;
-        m_callbacks = m_callbacks.andThen(callback);
+        m_refs.add((instance, component, props) -> ref.accept(null, component, 
props));
         return this;
     }
     
+    @SuppressWarnings("unchecked")
+    private <U> FactoryPidAdapterBuilder<T> setComponentCallbackRef(Class<U> 
type, MethodRef<U> ref) {
+        checkHasNoReflectionCallbacks();
+        m_hasMethodRefs = true;
+        m_refs.add((instance, component, props) -> {
+            Stream.of(component.getInstances()).forEach(inst -> {
+                if (Helpers.getClass(inst).equals(type)) {
+                    ref.accept((U) inst, component, props);
+                }
+            });
+        });
+        return this;
+    }
+
     private void checkHasNoMethodRefs() {
         if (m_hasMethodRefs) {
             throw new IllegalStateException("Can't mix method references with 
reflection based callbacks");

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java
 Thu Jan 14 23:51:12 2016
@@ -117,25 +117,37 @@ public abstract class ServiceCallbacksBu
         return (B) this;
     }
        
-    public B cbInst(Object callbackInstance) {
-        m_callbackInstance = callbackInstance;
-        return (B) this;
-    }
-    
     public B cb(String add) {
         return cb(add, null, null, null);
     }
+    
+    public B cb(Object callbackInstance, String add) {
+        return cb(callbackInstance, add, null, null, null);
+    }
 
     public B cb(String add, String remove) {
         return cb(add, null, remove, null);
     }
 
+    public B cb(Object callbackInstance, String add, String remove) {
+        return cb(callbackInstance, add, null, remove, null);
+    }
+
     public B cb(String add, String change, String remove) {
         return cb(add, change, remove, null);
     }
 
+    public B cb(Object callbackInstance, String add, String change, String 
remove) {
+        return cb(callbackInstance, add, change, remove, null);
+    }
+
     public B cb(String added, String changed, String removed, String swapped) {
+        return cb(null, added, changed, removed, swapped);
+    }
+    
+    public B cb(Object callbackInstance, String added, String changed, String 
removed, String swapped) {
                requiresNoMethodRefs();
+        m_callbackInstance = callbackInstance;
                m_added = added != null ? added : m_added;
                m_changed = changed != null ? changed : m_changed;
                m_removed = removed != null ? removed : m_removed;

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceDependencyBuilderImpl.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceDependencyBuilderImpl.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceDependencyBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceDependencyBuilderImpl.java
 Thu Jan 14 23:51:12 2016
@@ -1,5 +1,9 @@
 package org.apache.felix.dm.builder.lambda.impl;
 
+import java.util.Dictionary;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+
 import org.apache.felix.dm.Component;
 import org.apache.felix.dm.DependencyManager;
 import org.apache.felix.dm.ServiceDependency;
@@ -62,6 +66,28 @@ public class ServiceDependencyBuilderImp
         m_propagateMethod = method;
         return this;
     }
+    
+    public ServiceDependencyBuilder<S> propagate(Function<ServiceReference<S>, 
Dictionary<String, Object>> propagate) {
+        Object wrappedCallback = new Object() {
+            @SuppressWarnings("unused")
+            Dictionary<String, Object> propagate(ServiceReference<S> ref) {
+                return propagate.apply(ref);
+            }
+        };
+        propagate(wrappedCallback, "propagate");
+        return this;
+    }    
+
+    public ServiceDependencyBuilder<S> 
propagate(BiFunction<ServiceReference<S>, S, Dictionary<String, Object>> 
propagate) {
+        Object wrappedCallback = new Object() {
+            @SuppressWarnings("unused")
+            Dictionary<String, Object> propagate(ServiceReference<S> ref, S 
service) {
+                return propagate.apply(ref, service);
+            }
+        };
+        propagate(wrappedCallback, "propagate");
+        return this;
+    }    
 
     public ServiceDependencyBuilder<S> defImpl(Object defaultImpl) {
         m_defaultImpl = defaultImpl;



Reply via email to