Author: pderop
Date: Tue Jan 19 23:00:49 2016
New Revision: 1725647

URL: http://svn.apache.org/viewvc?rev=1725647&view=rev
Log:
Added support for Bundle Adapter. Added tests. Fixed component lifecycle 
callbacks. cleaned API.

Added:
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/BundleAdapterTest.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/BundleAdapterWithCallbacksNotAutoConfiguredTest.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleAdapterBuilder.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleAdapterBuilderImpl.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.itest/src/org/apache/felix/dm/builder/lambda/itest/FactoryInjectedWithConfigurationBeforeTheCreateMethod.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/MultipleExtraDependencyTest.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/MultipleExtraDependencyTest2.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/ServiceDependencyPropagateTest.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/factory/Activator.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/hello/Activator.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/rx/observable/ObservableComponent.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/ComponentBuilder.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/DependencyActivatorBase.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/Functions.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceAdapterBuilder.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceAspectBuilder.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/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/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/ServiceAdapterBuilderImpl.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceAspectBuilderImpl.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java

Modified: felix/sandbox/pderop/dependencymanager-lambda/TODO
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/TODO?rev=1725647&r1=1725646&r2=1725647&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-lambda/TODO (original)
+++ felix/sandbox/pderop/dependencymanager-lambda/TODO Tue Jan 19 23:00:49 2016
@@ -1,5 +1,3 @@
-- add BundeAdapter
-
 - Javadocs
 
 

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=1725647&r1=1725646&r2=1725647&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
 Tue Jan 19 23:00:49 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(s1AdapterCB, 
"set"));
+        adapter(m, S1.class, a -> a.impl(S1Adapter.class).cbi(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=1725647&r1=1725646&r2=1725647&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
 Tue Jan 19 23:00:49 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(callbackInstance,
 "set", "changed", "unset")
+            .provides(AdaptedService.class).impl(new 
ServiceAdapter(e)).autoConfig("m_originalService").propagate(true).cbi(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/BundleAdapterTest.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/BundleAdapterTest.java?rev=1725647&view=auto
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/BundleAdapterTest.java
 (added)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/BundleAdapterTest.java
 Tue Jan 19 23:00:49 2016
@@ -0,0 +1,187 @@
+/*
+ * 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.junit.Assert;
+
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.DependencyManager;
+import org.apache.felix.dm.builder.lambda.Cb;
+import org.osgi.framework.Bundle;
+import static org.apache.felix.dm.builder.lambda.DependencyActivatorBase.*;
+
+/**
+ * @author <a href="mailto:[email protected]";>Felix Project Team</a>
+ */
+public class BundleAdapterTest extends TestBase {    
+    public void testBundleAdapter() {
+        DependencyManager m = getDM();
+        // create a bundle adapter service (one is created for each bundle)
+        Component adapter = bundleAdapter(m)
+            .mask(Bundle.INSTALLED | Bundle.RESOLVED | Bundle.ACTIVE)
+            .impl(BundleAdapter.class)
+            .provides(BundleAdapter.class)
+            .build();
+
+        // create a service provider and consumer
+        Consumer c = new Consumer();
+        Component consumer = m.createComponent().setImplementation(c)
+            
.add(m.createServiceDependency().setService(BundleAdapter.class).setCallbacks("add",
 "remove"));
+        
+        // add the bundle adapter
+        m.add(adapter);
+        // add the service consumer
+        m.add(consumer);
+        // check if at least one bundle was found
+        c.check();
+        // remove the consumer again
+        m.remove(consumer);
+        // check if all bundles were removed correctly
+        c.doubleCheck();
+        // remove the bundle adapter
+        m.remove(adapter);
+    }
+    
+    public void testBundleAdapterWithCallbackInstance() {
+        DependencyManager m = getDM();
+        // create a bundle adapter service (one is created for each bundle)
+        BundleAdapterWithCallback baWithCb = new BundleAdapterWithCallback();
+        BundleAdapterCallbackInstance cbInstance = new 
BundleAdapterCallbackInstance(baWithCb);
+        
+        Component adapter = bundleAdapter(m)
+            .mask(Bundle.INSTALLED | Bundle.RESOLVED | Bundle.ACTIVE)
+            .cbi(cbInstance, "add", "remove")
+            .impl(baWithCb)
+            .provides(BundleAdapter.class.getName())
+            .build();
+
+        // create a service provider and consumer
+        Consumer c = new Consumer();
+        Component consumer = component(m)
+            .impl(c)
+            .withService(BundleAdapter.class, s->s.cb("add", "remove"))
+            .build();
+        
+        // add the bundle adapter
+        m.add(adapter);
+        // add the service consumer
+        m.add(consumer);
+        // check if at least one bundle was found
+        c.check();
+        // remove the consumer again
+        m.remove(consumer);
+        // check if all bundles were removed correctly
+        c.doubleCheck();
+        // remove the bundle adapter
+        m.remove(adapter);
+    }
+        
+    public void testBundleAdapterWithCallbackInstanceRef() {
+        DependencyManager m = getDM();
+        // create a bundle adapter service (one is created for each bundle)
+        BundleAdapterWithCallback baWithCb = new BundleAdapterWithCallback();
+        BundleAdapterCallbackInstance cbInstance = new 
BundleAdapterCallbackInstance(baWithCb);
+        
+        Component adapter = bundleAdapter(m)
+            .mask(Bundle.INSTALLED | Bundle.RESOLVED | Bundle.ACTIVE)
+            .cbi(Cb.ADD, cbInstance::add).cbi(Cb.REM, cbInstance::remove)
+            .impl(baWithCb)
+            .provides(BundleAdapter.class.getName())
+            .build();
+
+        // create a service provider and consumer
+        Consumer c = new Consumer();
+        Component consumer = component(m)
+            .impl(c)
+            .withService(BundleAdapter.class, s->s.cb("add", "remove"))
+            .build();
+        
+        // add the bundle adapter
+        m.add(adapter);
+        // add the service consumer
+        m.add(consumer);
+        // check if at least one bundle was found
+        c.check();
+        // remove the consumer again
+        m.remove(consumer);
+        // check if all bundles were removed correctly
+        c.doubleCheck();
+        // remove the bundle adapter
+        m.remove(adapter);
+    }
+        
+    public static class BundleAdapter {
+        volatile Bundle m_bundle;
+        
+        Bundle getBundle() {
+            return m_bundle;
+        }
+    }
+    
+    public static class BundleAdapterWithCallback extends BundleAdapter {
+        void add(Bundle b) {
+               m_bundle = b;           
+        }
+        
+        void remove(Bundle b) {
+               m_bundle = null;
+        }
+    }
+    
+    public static class BundleAdapterCallbackInstance {
+       final BundleAdapterWithCallback m_ba;
+       
+       BundleAdapterCallbackInstance(BundleAdapterWithCallback ba) {
+               m_ba = ba;
+       }
+       
+        void add(Component c, Bundle b) {
+               m_ba.add(b);    
+        }
+        
+        void remove(Bundle b) {
+               m_ba.remove(b);
+        }
+    }
+    
+    static class Consumer {
+        private volatile int m_count = 0;
+
+        public void add(BundleAdapter ba) {
+            Bundle b = ba.getBundle();
+            System.out.println("Consumer.add(" + b.getSymbolicName() + ")");
+            Assert.assertNotNull("bundle instance must not be null", b);
+            m_count++;
+        }
+        
+        public void check() {
+            Assert.assertTrue("we should have found at least one bundle", 
m_count > 0);
+        }
+        
+        public void remove(BundleAdapter ba) {
+            Bundle b = ba.getBundle();
+            System.out.println("Consumer.remove(" + b.getSymbolicName() + ")");
+            m_count--;
+        }
+        
+        public void doubleCheck() {
+            Assert.assertEquals("all bundles we found should have been removed 
again", 0, m_count);
+        }
+    }
+}

Added: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/BundleAdapterWithCallbacksNotAutoConfiguredTest.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/BundleAdapterWithCallbacksNotAutoConfiguredTest.java?rev=1725647&view=auto
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/BundleAdapterWithCallbacksNotAutoConfiguredTest.java
 (added)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/BundleAdapterWithCallbacksNotAutoConfiguredTest.java
 Tue Jan 19 23:00:49 2016
@@ -0,0 +1,70 @@
+/*
+ * 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.junit.Assert;
+
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.DependencyManager;
+import org.osgi.framework.Bundle;
+import static org.apache.felix.dm.builder.lambda.DependencyActivatorBase.*;
+
+/**
+ * @author <a href="mailto:[email protected]";>Felix Project Team</a>
+ */
+public class BundleAdapterWithCallbacksNotAutoConfiguredTest extends TestBase 
{  
+    final Ensure m_e = new Ensure();
+    
+    public void testBundleAdapterWithCallbacksNotAutoConfigured() {
+        DependencyManager m = getDM();
+        // create a bundle adapter service (one is created for each bundle)
+        BundleAdapterWithCallback baWithCb = new BundleAdapterWithCallback();
+        String bsn = "org.apache.felix.dependencymanager";
+        String filter = "(Bundle-SymbolicName=" + bsn + ")";
+
+        Component adapter = bundleAdapter(m)
+            .mask(Bundle.ACTIVE).filter(filter).cb("add")                      
                                                                                
 
+            .impl(baWithCb)
+            .build();
+        
+        // add the bundle adapter
+        m.add(adapter);
+        
+        // Check if adapter has not been auto configured (because it has 
callbacks defined).
+        m_e.waitForStep(1, 3000);
+        Assert.assertNull("bundle adapter must not be auto configured", 
baWithCb.getBundle());
+        
+        // remove the bundle adapters
+        m.remove(adapter);
+    }
+                
+    class BundleAdapterWithCallback {
+        volatile Bundle m_bundle; // must not be auto configured because we 
are using callbacks.
+        
+        Bundle getBundle() {
+            return m_bundle;
+        }
+        
+        void add(Bundle b) {
+            Assert.assertNotNull(b);
+            Assert.assertEquals("org.apache.felix.dependencymanager", 
b.getSymbolicName());
+            m_e.step(1);
+        }
+    }
+}

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/FactoryInjectedWithConfigurationBeforeTheCreateMethod.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/FactoryInjectedWithConfigurationBeforeTheCreateMethod.java?rev=1725647&r1=1725646&r2=1725647&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/FactoryInjectedWithConfigurationBeforeTheCreateMethod.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/FactoryInjectedWithConfigurationBeforeTheCreateMethod.java
 Tue Jan 19 23:00:49 2016
@@ -51,7 +51,7 @@ public class FactoryInjectedWithConfigur
         MyFactory factory = new MyFactory();
         
         // Create the Component for the MyComponent class that is created 
using the factory above.
-        Component myComponent = component(m).factory(factory, 
"create").withConfiguration(b->b.pid("foobar").cb(factory, "updated")).build();
+        Component myComponent = component(m).factory(factory, 
"create").withConfiguration(b->b.pid("foobar").cbi(factory, "updated")).build();
         
         // provide the configuration
         m.add(configurator);

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/MultipleExtraDependencyTest.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/MultipleExtraDependencyTest.java?rev=1725647&r1=1725646&r2=1725647&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/MultipleExtraDependencyTest.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/MultipleExtraDependencyTest.java
 Tue Jan 19 23:00:49 2016
@@ -41,7 +41,7 @@ public class MultipleExtraDependencyTest
               .impl(ServiceProvider2.class).provides(ServiceProvider2.class)
               .withService(Runnable.class, 
srv->srv.filter("(foo=bar)").required(false).autoConfig("m_runnable"))
               .withService(Sequencer.class, srv->srv.cb("bind"))
-              .cb(null, "start", "stop", null)
+              .life(null, "start", "stop", null)
               .composition("getComposition")
               .build();
 
@@ -51,14 +51,14 @@ public class MultipleExtraDependencyTest
                             new Hashtable() {{ put("foo", "bar"); }})
               .withService(Sequencer.class, srv->srv.autoConfig("m_sequencer"))
               .withService(ServiceProvider2.class, srv->srv.cb("bind", 
"unbind"))
-              .cb(null, "start", "stop", null)
+              .life(null, "start", "stop")
               .build();
         
         Component sc = component(m)
               .impl(ServiceConsumer.class)
               .withService(Sequencer.class, srv->srv.autoConfig("m_sequencer"))
               .withService(ServiceInterface.class, 
srv->srv.filter("(foo=bar)").autoConfig("m_service"))
-              .cb(null, "start", "stop", null)
+              .life(null, "start", "stop")
               .build();
         
         Component sequencer = component(m)

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/MultipleExtraDependencyTest2.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/MultipleExtraDependencyTest2.java?rev=1725647&r1=1725646&r2=1725647&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/MultipleExtraDependencyTest2.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/MultipleExtraDependencyTest2.java
 Tue Jan 19 23:00:49 2016
@@ -30,7 +30,6 @@ import org.apache.felix.dm.ServiceDepend
  * 
  * @author <a href="mailto:[email protected]";>Felix Project Team</a>
  */
-@SuppressWarnings({"unchecked", "rawtypes", "serial"})
 public class MultipleExtraDependencyTest2 extends TestBase {
     public void testMultipleExtraDependencies() {
         DependencyManager m = getDM();
@@ -39,19 +38,19 @@ public class MultipleExtraDependencyTest
         Component sp2 = component(m)
             .impl(ServiceProvider2.class)
             .provides(ServiceProvider2.class)
-            .cb("init", "start", "stop", null)
+            .life("init", "start", "stop")
             .composition("getComposition").build();
         
         Component sp = component(m)
-              .impl(ServiceProvider.class)
-              .provides(ServiceInterface.class, "foo", "bar")                  
          
-              .cb("init", "start", "stop", null)
-              .build();
+            .impl(ServiceProvider.class)
+            .provides(ServiceInterface.class, "foo", "bar")                    
        
+            .life("init", "start", "stop")
+            .build();
         
         Component sc = component(m)
-              .impl(ServiceConsumer.class)
-              .cb("init", "start", "stop", null)
-              .build();
+            .impl(ServiceConsumer.class)
+            .life("init", "start", "stop")
+            .build();
         
         // Provide the Sequencer service to the MultipleAnnotationsTest class.
         Component sequencer =  component(m)

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/ServiceDependencyPropagateTest.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/ServiceDependencyPropagateTest.java?rev=1725647&r1=1725646&r2=1725647&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/ServiceDependencyPropagateTest.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/ServiceDependencyPropagateTest.java
 Tue Jan 19 23:00:49 2016
@@ -46,7 +46,7 @@ public class ServiceDependencyPropagateT
         
         Component c1 = component(m)
                       .impl(new C1(e))
-                      .withService(C2.class, s->s.cb("bind", null)).build();
+                      .withService(C2.class, s->s.cb("bind")).build();
 
         Component c2 = component(m)
                       .provides(C2.class.getName(), new Hashtable() {{ 
put("foo", "bar"); }})

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=1725647&r1=1725646&r2=1725647&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
 Tue Jan 19 23:00:49 2016
@@ -52,7 +52,7 @@ public class Activator extends Dependenc
         // before creating the composition of classes.
         component(comp -> comp
             .factory(factory::create, factory::getComposition)
-            .cb(START, ProviderImpl::start) // only call start on ProviderImpl
+            .life(START, ProviderImpl::start) // only call start on 
ProviderImpl
             .withService(LogService.class, srv -> srv.cb(ADD, 
ProviderImpl::bind).cb(ADD, ProviderComposite1::bind))
             .withConfiguration(conf -> 
conf.pid(ProviderFactory.class).cbi(factory::updated)));
                 

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/factory/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/factory/Activator.java?rev=1725647&r1=1725646&r2=1725647&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/factory/Activator.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/factory/Activator.java
 Tue Jan 19 23:00:49 2016
@@ -36,7 +36,7 @@ public class Activator extends Dependenc
         component(comp -> comp
             .factory(ProviderFactory::new, ProviderFactory::create)       
             .provides(Provider.class)
-            .cb(START, ProviderImpl::start)                      
+            .life(START, ProviderImpl::start)                      
             .withService(LogService.class, srv -> srv.required().cb(ADD, 
ProviderImpl::set)));
     }
 }

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/hello/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/hello/Activator.java?rev=1725647&r1=1725646&r2=1725647&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/hello/Activator.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/hello/Activator.java
 Tue Jan 19 23:00:49 2016
@@ -37,7 +37,7 @@ public class Activator extends Dependenc
         component(comp -> comp
             .impl(ServiceProviderImpl.class)
             .provides(ServiceProvider.class, property1 -> "value1", property2 
-> 123) // property names are deduced from lambda parameter names
-            .cb(START, ServiceProviderImpl::activate)
+            .life(START, ServiceProviderImpl::activate)
             .withService(LogService.class, srv -> srv.cb(ADD, 
ServiceProviderImpl::bind)));
 
         component(comp -> comp

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/rx/observable/ObservableComponent.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/observable/ObservableComponent.java?rev=1725647&r1=1725646&r2=1725647&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/rx/observable/ObservableComponent.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/rx/observable/ObservableComponent.java
 Tue Jan 19 23:00:49 2016
@@ -80,7 +80,7 @@ public class ObservableComponent {
                publisher.onSubscribe(EmptySubscription.INSTANCE);
                        component(m_dm, builder -> builder
                                        .factory(() -> new 
DocumentViewer(title))
-                                       .cbi(Cb.START, publisher::onNext));
+                                       .lifeInst(Cb.START, publisher::onNext));
                });
        }
 }

Added: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleAdapterBuilder.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleAdapterBuilder.java?rev=1725647&view=auto
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleAdapterBuilder.java
 (added)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleAdapterBuilder.java
 Tue Jan 19 23:00:49 2016
@@ -0,0 +1,73 @@
+package org.apache.felix.dm.builder.lambda;
+
+import org.apache.felix.dm.builder.lambda.Functions.CbBundle;
+import org.apache.felix.dm.builder.lambda.Functions.CbComponentBundle;
+import org.apache.felix.dm.builder.lambda.Functions.CbComponentDictionary;
+import org.apache.felix.dm.builder.lambda.Functions.CbDictionary;
+import org.apache.felix.dm.builder.lambda.Functions.CbTypeBundle;
+import org.apache.felix.dm.builder.lambda.Functions.CbTypeComponentBundle;
+import org.apache.felix.dm.builder.lambda.Functions.CbTypeComponentDictionary;
+import org.apache.felix.dm.builder.lambda.Functions.CbTypeDictionary;
+
+/**
+ * Defines the interface for a Dependency Manager Factory Configuration 
Adapter.
+ * 
+ * Example that defines a factory configuration adapter service for the 
"foo.bar" factory pid.
+ * 
+ * <pre> {@code
+ * public class Activator extends DependencyActivatorBase {
+ *     public void init() throws Exception { 
+ *         factoryPidAdapter(comp -> comp
+ *             
.factoryPid("foo.bar").onUpdate(ServiceImpl::updated).propagate()
+ *             .impl(DictionaryImpl.class)
+ *             .withService(LogService.class, dep -> dep.required(false)));
+ *    }
+ * }</pre>
+ *
+ * TODO: javadoc
+ */
+public interface BundleAdapterBuilder extends 
ComponentBuilder<BundleAdapterBuilder> {
+    /**
+     * Sets the bundle state mask to depend on. The OSGi BundleTracker 
explains this mask in more detail, but
+     * it is basically a mask with flags for each potential state a bundle can 
be in.
+     * 
+     * @param mask the mask to use
+     */
+    BundleAdapterBuilder mask(int mask);
+    
+    /**
+     * Sets the filter condition to depend on. Filters are matched against the 
full manifest of a bundle.
+     * 
+     * @param filter the filter condition
+     * @return the bundle dependency builder
+     * @throws IllegalArgumentException if the filter is invalid
+     */
+    BundleAdapterBuilder filter(String filter);
+
+    /**
+     * Sets property propagation. If set to <code>true</code> any bundle 
manifest properties will be added
+     * to the service properties of the component that has this dependency (if 
it registers as a service).
+     * 
+     * @param propagate <code>true</code> to propagate the bundle manifest 
properties
+     * @return the bundle dependency builder
+     */
+    BundleAdapterBuilder propagate(boolean propagate);
+    
+    /**
+     * Sets property propagation. If set to <code>true</code> any bundle 
manifest properties will be added
+     * to the service properties of the component that has this dependency (if 
it registers as a service).
+     * 
+     * @param propagate <code>true</code> to propagate the bundle manifest 
properties
+     * @return the bundle dependency builder
+     */
+    BundleAdapterBuilder propagate();
+    
+    BundleAdapterBuilder cb(String ... callbacks);
+    BundleAdapterBuilder cbi(Object callbackInstance, String ... callbacks);
+
+    <T> BundleAdapterBuilder cb(Cb callbackType, CbTypeBundle<T> callback);
+    BundleAdapterBuilder cbi(Cb callbackType, CbBundle callback);
+    
+    <T> BundleAdapterBuilder cb(Cb callbackType, CbTypeComponentBundle<T> 
callback);         
+    BundleAdapterBuilder cbi(Cb callbackType, CbComponentBundle callback);
+}

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=1725647&r1=1725646&r2=1725647&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
 Tue Jan 19 23:00:49 2016
@@ -18,12 +18,8 @@ import org.osgi.framework.Bundle;
  */
 public interface BundleDependencyBuilder extends 
DependencyBuilder<BundleDependency> {
     
-    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);
+    BundleDependencyBuilder cb(String ... callbacks);
+    BundleDependencyBuilder cbi(Object callbackInstance, String ... callbacks);
 
     <T> BundleDependencyBuilder cb(Cb callbackType, CbTypeBundle<T> callback);
     <T> BundleDependencyBuilder cb(Cb callbackType, CbTypeComponentBundle<T> 
callback); 
@@ -76,9 +72,8 @@ public interface BundleDependencyBuilder
      * 
      * @param filter the filter condition
      * @return the bundle dependency builder
-     * @throws IllegalArgumentException if the filter is invalid
      */
-    public BundleDependencyBuilder filter(String filter) throws 
IllegalArgumentException;
+    public BundleDependencyBuilder filter(String filter);
 
     /**
      * Sets the bundle state mask to depend on. The OSGi BundleTracker 
explains this mask in more detail, but

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ComponentBuilder.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ComponentBuilder.java?rev=1725647&r1=1725646&r2=1725647&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ComponentBuilder.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ComponentBuilder.java
 Tue Jan 19 23:00:49 2016
@@ -7,9 +7,9 @@ import java.util.function.Function;
 import java.util.function.Supplier;
 
 import org.apache.felix.dm.Component;
-import org.apache.felix.dm.builder.lambda.Functions.CbBiConsumer;
 import org.apache.felix.dm.builder.lambda.Functions.CbComponent;
 import org.apache.felix.dm.builder.lambda.Functions.CbConsumer;
+import org.apache.felix.dm.builder.lambda.Functions.CbTypeComponent;
 import org.apache.felix.dm.builder.lambda.Functions.FluentProperties;
 
 /**
@@ -189,15 +189,15 @@ public interface ComponentBuilder<B exte
      * @return
      */
     <U> B withFuture(CompletableFuture<U> future, 
Consumer<FutureDependencyBuilder<U>> consumer);
-
     
-    B cb(String init, String start, String stop, String destroy);
-    B cb(Object callbackInstance, String init, String start, String stop, 
String destroy);
+    B life(String ... callbacks);
+    B lifeInst(Object callbackInstance, String ... callbacks);
+
+    <U> B life(Cb callbackType, CbConsumer<U> componentCallback);
+    B lifeInst(Cb callbackType, Runnable instanceCallback);
     
-    <U> B cb(Cb callbackType, CbConsumer<U> callback);
-    <U> B cb(Cb callbackType, CbBiConsumer<U, Component> callback);
-    B cbi(Cb callbackType, Runnable callback);
-    B cbi(Cb callbackType, CbComponent callback);
+    <U> B life(Cb callbackType, CbTypeComponent<U> componentCallback);
+    B lifeInst(Cb callbackType, CbComponent instanceCallback);
 
     /**
      * Configures OSGi object (BundleContext, Component, etc ...) that will be 
injected in any field having the same OSGi object type.

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=1725647&r1=1725646&r2=1725647&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
 Tue Jan 19 23:00:49 2016
@@ -30,10 +30,11 @@ public interface ConfigurationDependency
     ConfigurationDependencyBuilder needsInstance(boolean needsInstance);
     
     ConfigurationDependencyBuilder cb(String updateMethod);
-    ConfigurationDependencyBuilder cb(Object callbackInstance, String 
updateMethod);
+    ConfigurationDependencyBuilder cbi(Object callbackInstance, String 
updateMethod);
 
     <T> ConfigurationDependencyBuilder cb(CbTypeDictionary<T> callback);
-    <T> ConfigurationDependencyBuilder cb(CbTypeComponentDictionary<T> 
callback);
     ConfigurationDependencyBuilder cbi(CbDictionary updated);   
+
+    <T> ConfigurationDependencyBuilder cb(CbTypeComponentDictionary<T> 
callback);
     ConfigurationDependencyBuilder cbi(CbComponentDictionary updated);   
 }

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/DependencyActivatorBase.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/DependencyActivatorBase.java?rev=1725647&r1=1725646&r2=1725647&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/DependencyActivatorBase.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/DependencyActivatorBase.java
 Tue Jan 19 23:00:49 2016
@@ -5,6 +5,7 @@ import java.util.function.Consumer;
 
 import org.apache.felix.dm.Component;
 import org.apache.felix.dm.DependencyManager;
+import org.apache.felix.dm.builder.lambda.impl.BundleAdapterBuilderImpl;
 import org.apache.felix.dm.builder.lambda.impl.BundleDependencyBuilderImpl;
 import org.apache.felix.dm.builder.lambda.impl.CompletableFutureDependencyImpl;
 import org.apache.felix.dm.builder.lambda.impl.ComponentBuilderImpl;
@@ -13,7 +14,6 @@ import org.apache.felix.dm.builder.lambd
 import org.apache.felix.dm.builder.lambda.impl.ServiceAdapterBuilderImpl;
 import org.apache.felix.dm.builder.lambda.impl.ServiceAspectBuilderImpl;
 import org.apache.felix.dm.builder.lambda.impl.ServiceDependencyBuilderImpl;
-import org.apache.felix.dm.impl.ServiceDependencyImpl;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
 
@@ -144,7 +144,17 @@ public abstract class DependencyActivato
     protected Component factoryPidAdapter(Consumer<FactoryPidAdapterBuilder> 
consumer) {
         return factoryPidAdapter(m_manager, consumer);
     }
-    
+
+    /**
+     * Builds a DM Bundle Adapter Component.
+     * @param consumer the lambda used to build the actual bundle adapter. 
+     * The component is auto-added to the DependencyManager, unless the lambda 
calls the BundleAdapter.autoAdd(false) method.
+     * @return a newly built DM component.
+     */
+    protected Component bundleAdapter(Consumer<BundleAdapterBuilder> consumer) 
{
+        return bundleAdapter(m_manager, consumer);
+    }
+       
     // These static methods can be used when building DM components outside of 
an activator.
        
     /**
@@ -187,6 +197,15 @@ public abstract class DependencyActivato
     }
    
     /**
+     * Creates a bundle adapter builder that can be used to create a DM bundle 
adapter Component. 
+     * @param dm
+     * @return a bundle adapter builder that can be used to create a DM bundle 
adapter Component.
+     */
+    public static BundleAdapterBuilder bundleAdapter(DependencyManager dm) {
+        return new BundleAdapterBuilderImpl(dm);
+    }
+   
+    /**
      * TODO
      * 
      * @param component
@@ -292,7 +311,24 @@ public abstract class DependencyActivato
         }
         return comp;
     }
-        
+      
+    /**
+     * Builds a bundle adapter DM Component.
+     * @param dm the DependencyManager object used to register the built 
component
+     * @param consumer a lambda used to build the bundle adapter component
+     * @return a new bundle adapter component. The adapter component is 
auto-added into the dm object, unless the lambda calls
+     * the AspectBuilder.autoAdd(false) method is called.
+     */
+    public static <T> Component bundleAdapter(DependencyManager dm, 
Consumer<BundleAdapterBuilder> consumer) {
+        BundleAdapterBuilderImpl adapterBuilder = new 
BundleAdapterBuilderImpl(dm);
+        consumer.accept(adapterBuilder);
+        Component comp = adapterBuilder.build();
+        if (adapterBuilder.isAutoAdd()) {
+            dm.add(comp);
+        }
+        return comp;
+    }
+
     /**
      * Builds a DM factory configuration adapter.
      * @param dm the DependencyManager object used to create DM components.

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=1725647&r1=1725646&r2=1725647&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
 Tue Jan 19 23:00:49 2016
@@ -1,8 +1,5 @@
 package org.apache.felix.dm.builder.lambda;
 
-import java.util.function.Function;
-import java.util.function.Supplier;
-
 import org.apache.felix.dm.builder.lambda.Functions.CbComponentDictionary;
 import org.apache.felix.dm.builder.lambda.Functions.CbDictionary;
 import org.apache.felix.dm.builder.lambda.Functions.CbTypeComponentDictionary;
@@ -32,10 +29,11 @@ public interface FactoryPidAdapterBuilde
     FactoryPidAdapterBuilder propagate(boolean propagate);
     
     FactoryPidAdapterBuilder cb(String updateMethod);
-    FactoryPidAdapterBuilder cb(Object callbackInstance, String updateMethod);
+    FactoryPidAdapterBuilder cbi(Object callbackInstance, String updateMethod);
     
     <U> FactoryPidAdapterBuilder cb(CbTypeDictionary<U> callback);
-    <U> FactoryPidAdapterBuilder cb(CbTypeComponentDictionary<U> callback);
     FactoryPidAdapterBuilder cbi(CbDictionary callback);
+
+    <U> FactoryPidAdapterBuilder cb(CbTypeComponentDictionary<U> callback);
     FactoryPidAdapterBuilder cbi(CbComponentDictionary callback);
 }

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/Functions.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/Functions.java?rev=1725647&r1=1725646&r2=1725647&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/Functions.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/Functions.java
 Tue Jan 19 23:00:49 2016
@@ -48,17 +48,7 @@ public class Functions {
             return (T t) -> { accept(t); after.accept(t); };
         }
     }
-    
-    @FunctionalInterface
-    public interface CbBiConsumer<T, U> extends SerializableLambda {
-        void accept(T t, U u);
-
-        default BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> 
after) {
-            Objects.requireNonNull(after);
-            return (l, r) -> { accept(l, r); after.accept(l, r); };
-        }
-    }
-    
+        
     @FunctionalInterface
     public interface CbTypeFuture<T, F> extends SerializableLambda {
         void accept(T instance, F future);
@@ -288,27 +278,7 @@ public class Functions {
             return (T instance, Component c, ServiceReference<S> oldRef, S 
old, ServiceReference<S> replaceRef, S replace) -> { accept(instance, c, 
oldRef, old, replaceRef, replace); after.accept(instance, c, oldRef, old, 
replaceRef, replace); };
         }
     }
-    
-    @FunctionalInterface
-    public interface CbTypeMapServiceMapService<T, S> extends 
SerializableLambda {
-        void accept(T instance, Map<String, Object> oldProps, S old, 
Map<String, Object> replaceProps, S replace); 
-        
-        default CbTypeMapServiceMapService<T, S> 
andThen(CbTypeMapServiceMapService<? super T, S> after) {
-            Objects.requireNonNull(after);
-            return (T instance, Map<String, Object> oldProps, S old, 
Map<String, Object> replaceProps, S replace) -> { accept(instance, oldProps, 
old, replaceProps, replace); after.accept(instance, oldProps, old, 
replaceProps, replace); };
-        }
-    }
-    
-    @FunctionalInterface
-    public interface CbTypeDictServiceDictService<T, S> extends 
SerializableLambda {
-        void accept(T instance, Dictionary<String, Object> oldProps, S old, 
Dictionary<String, Object> replaceProps, S replace); 
         
-        default CbTypeDictServiceDictService<T, S> 
andThen(CbTypeDictServiceDictService<? super T, S> after) {
-            Objects.requireNonNull(after);
-            return (T instance, Dictionary<String, Object> oldProps, S old, 
Dictionary<String, Object> replaceProps, S replace) -> { accept(instance, 
oldProps, old, replaceProps, replace); after.accept(instance, oldProps, old, 
replaceProps, replace); };
-        }
-    }
-    
     @FunctionalInterface
     public interface CbServiceService<S> extends SerializableLambda {
         void accept(S old, S replace); 
@@ -349,46 +319,6 @@ public class Functions {
         }
     }
     
-    @FunctionalInterface
-    public interface CbMapServiceMapService<S> {
-        void accept(Map<String, Object> oldProps, S old, Map<String, Object> 
replaceProps, S replace); 
-        
-        default CbMapServiceMapService<S> andThen(CbMapServiceMapService<S> 
after) {
-            Objects.requireNonNull(after);
-            return (Map<String, Object> oldProps, S old, Map<String, Object> 
replaceProps, S replace) -> { accept(oldProps, old, replaceProps, replace); 
after.accept(oldProps, old, replaceProps, replace); };
-        }
-    }
-    
-    @FunctionalInterface
-    public interface CbComponentMapServiceMapService<S> {
-        void accept(Component c, Map<String, Object> oldProps, S old, 
Map<String, Object> replaceProps, S replace); 
-        
-        default CbComponentMapServiceMapService<S> 
andThen(CbComponentMapServiceMapService<S> after) {
-            Objects.requireNonNull(after);
-            return (Component c, Map<String, Object> oldProps, S old, 
Map<String, Object> replaceProps, S replace) -> { accept(c, oldProps, old, 
replaceProps, replace); after.accept(c, oldProps, old, replaceProps, replace); 
};
-        }
-    }
-    
-    @FunctionalInterface
-    public interface CbDictServiceDictService<S> {
-        void accept(Dictionary<String, Object> oldProps, S old, 
Dictionary<String, Object> replaceProps, S replace); 
-        
-        default CbDictServiceDictService<S> 
andThen(CbDictServiceDictService<S> after) {
-            Objects.requireNonNull(after);
-            return (Dictionary<String, Object> oldProps, S old, 
Dictionary<String, Object> replaceProps, S replace) -> { accept(oldProps, old, 
replaceProps, replace); after.accept(oldProps, old, replaceProps, replace); };
-        }
-    }
-    
-    @FunctionalInterface
-    public interface CbComponentDictServiceDictService<S> {
-        void accept(Component c, Dictionary<String, Object> oldProps, S old, 
Dictionary<String, Object> replaceProps, S replace); 
-        
-        default CbComponentDictServiceDictService<S> 
andThen(CbComponentDictServiceDictService<S> after) {
-            Objects.requireNonNull(after);
-            return (Component c, Dictionary<String, Object> oldProps, S old, 
Dictionary<String, Object> replaceProps, S replace) -> { accept(c, oldProps, 
old, replaceProps, replace); after.accept(c, oldProps, old, replaceProps, 
replace); };
-        }
-    }
-    
     @FunctionalInterface
     public interface CbComponent {
         void accept(Component component);

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceAdapterBuilder.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceAdapterBuilder.java?rev=1725647&r1=1725646&r2=1725647&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceAdapterBuilder.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceAdapterBuilder.java
 Tue Jan 19 23:00:49 2016
@@ -1,8 +1,5 @@
 package org.apache.felix.dm.builder.lambda;
 
-import java.util.function.Function;
-import java.util.function.Supplier;
-
 /**
  * Defines the interface for a DependencyManager adapter builder.
  * 

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceAspectBuilder.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceAspectBuilder.java?rev=1725647&r1=1725646&r2=1725647&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceAspectBuilder.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceAspectBuilder.java
 Tue Jan 19 23:00:49 2016
@@ -1,8 +1,5 @@
 package org.apache.felix.dm.builder.lambda;
 
-import java.util.function.Function;
-import java.util.function.Supplier;
-
 /**
  * Defines the interface for a DependencyManager aspect builder.
  *

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=1725647&r1=1725646&r2=1725647&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
 Tue Jan 19 23:00:49 2016
@@ -1,15 +1,11 @@
 package org.apache.felix.dm.builder.lambda;
 
 import org.apache.felix.dm.builder.lambda.Functions.CbComponent;
-import 
org.apache.felix.dm.builder.lambda.Functions.CbComponentDictServiceDictService;
-import 
org.apache.felix.dm.builder.lambda.Functions.CbComponentMapServiceMapService;
 import org.apache.felix.dm.builder.lambda.Functions.CbComponentRef;
 import org.apache.felix.dm.builder.lambda.Functions.CbComponentRefService;
 import 
org.apache.felix.dm.builder.lambda.Functions.CbComponentRefServiceRefService;
 import org.apache.felix.dm.builder.lambda.Functions.CbComponentService;
 import org.apache.felix.dm.builder.lambda.Functions.CbComponentServiceService;
-import org.apache.felix.dm.builder.lambda.Functions.CbDictServiceDictService;
-import org.apache.felix.dm.builder.lambda.Functions.CbMapServiceMapService;
 import org.apache.felix.dm.builder.lambda.Functions.CbRef;
 import org.apache.felix.dm.builder.lambda.Functions.CbRefService;
 import org.apache.felix.dm.builder.lambda.Functions.CbRefServiceRefService;
@@ -23,8 +19,6 @@ import org.apache.felix.dm.builder.lambd
 import 
org.apache.felix.dm.builder.lambda.Functions.CbTypeComponentRefServiceRefService;
 import org.apache.felix.dm.builder.lambda.Functions.CbTypeComponentService;
 import 
org.apache.felix.dm.builder.lambda.Functions.CbTypeComponentServiceService;
-import 
org.apache.felix.dm.builder.lambda.Functions.CbTypeDictServiceDictService;
-import org.apache.felix.dm.builder.lambda.Functions.CbTypeMapServiceMapService;
 import org.apache.felix.dm.builder.lambda.Functions.CbTypeRef;
 import org.apache.felix.dm.builder.lambda.Functions.CbTypeRefService;
 import org.apache.felix.dm.builder.lambda.Functions.CbTypeRefServiceRefService;
@@ -63,47 +57,45 @@ public interface ServiceCallbacksBuilder
      */
     B autoConfig(String field);            
         
-    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);
+    B cb(String ... callbacks);
+    B cbi(Object callbackInstance, String ... callbacks);
 
     <T> B cb(Cb callbackType, CbTypeService<T, S> callback);
-    <T> B cb(Cb callbackType, CbTypeServiceMap<T, S> callback);
-    <T> B cb(Cb callbackType, CbTypeServiceDict<T, S> callback);
-    <T> B cb(Cb callbackType, CbTypeRefService<T, S> callback);
-    <T> B cb(Cb callbackType, CbTypeRef<T, S> callback);
-    <T> B cb(Cb callbackType, CbTypeComponent<T> callback);
-    <T> B cb(Cb callbackType, CbTypeComponentRef<T, S> callback);
-    <T> B cb(Cb callbackType, CbTypeComponentService<T, S> callback);
-    <T> B cb(Cb callbackType, CbTypeComponentRefService<T, S> callback);
-  
     B cbi(Cb callbackType, CbService<S> callback);
+
+    <T> B cb(Cb callbackType, CbTypeServiceMap<T, S> callback);
     B cbi(Cb callbackType, CbServiceMap<S> callback);
+    
+    <T> B cb(Cb callbackType, CbTypeServiceDict<T, S> callback);
     B cbi(Cb callbackType, CbServiceDict<S> callback);
+    
+    <T> B cb(Cb callbackType, CbTypeRefService<T, S> callback);
     B cbi(Cb callbackType, CbRefService<S> callback);
+    
+    <T> B cb(Cb callbackType, CbTypeRef<T, S> callback);
     B cbi(Cb callbackType, CbRef<S> callback);
-    B cbi(Cb callbackType, CbComponentService<S> callback);  
+    
+    <T> B cb(Cb callbackType, CbTypeComponent<T> callback);
     B cbi(Cb callbackType, CbComponent callback);
+    
+    <T> B cb(Cb callbackType, CbTypeComponentRef<T, S> callback);
     B cbi(Cb callbackType, CbComponentRef<S> callback);
+    
+    <T> B cb(Cb callbackType, CbTypeComponentService<T, S> callback);
     B cbi(Cb callbackType, CbComponentRefService<S> callback);
-
+    
+    <T> B cb(Cb callbackType, CbTypeComponentRefService<T, S> callback);
+    B cbi(Cb callbackType, CbComponentService<S> callback);    
+    
     <T> B sw(CbTypeServiceService<T, S> swap);
-    <T> B sw(CbTypeComponentServiceService<T, S> swap);
-    <T> B sw(CbTypeRefServiceRefService<T, S> swap);
-    <T> B sw(CbTypeComponentRefServiceRefService<T, S> swap);
-    <T> B sw(CbTypeMapServiceMapService<T, S> swap);
-    <T> B sw(CbTypeDictServiceDictService<T, S> swap);
     B swi(CbServiceService<S> swap);
+
+    <T> B sw(CbTypeComponentServiceService<T, S> swap);
     B swi(CbComponentServiceService<S> swap);
+    
+    <T> B sw(CbTypeRefServiceRefService<T, S> swap);
     B swi(CbRefServiceRefService<S> swap);
-    B swi(CbComponentRefServiceRefService<S> swap);
-    B swi(CbMapServiceMapService<S> swap);
-    B swi(CbComponentMapServiceMapService<S> swap);
-    B swi(CbDictServiceDictService<S> swap);
-    B swi(CbComponentDictServiceDictService<S> swap);
+    
+    <T> B sw(CbTypeComponentRefServiceRefService<T, S> swap);
+    B swi(CbComponentRefServiceRefService<S> swap);        
 }

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=1725647&r1=1725646&r2=1725647&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
 Tue Jan 19 23:00:49 2016
@@ -6,14 +6,13 @@ 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;
 import org.apache.felix.dm.builder.lambda.Cb;
 import org.apache.felix.dm.builder.lambda.ComponentBuilder;
 import org.apache.felix.dm.builder.lambda.ConfigurationDependencyBuilder;
-import org.apache.felix.dm.builder.lambda.Functions.CbBiConsumer;
 import org.apache.felix.dm.builder.lambda.Functions.CbComponent;
 import org.apache.felix.dm.builder.lambda.Functions.CbConsumer;
+import org.apache.felix.dm.builder.lambda.Functions.CbTypeComponent;
 import org.apache.felix.dm.builder.lambda.Functions.FluentProperties;
 import org.apache.felix.dm.builder.lambda.FutureDependencyBuilder;
 import org.apache.felix.dm.builder.lambda.ServiceDependencyBuilder;
@@ -26,7 +25,7 @@ import org.apache.felix.dm.builder.lambd
 @SuppressWarnings({"unchecked"})
 public interface AdapterBase<B extends ComponentBuilder<B>> extends 
ComponentBuilder<B> {
        
-    void andThenBuild(Consumer<ComponentBuilder> builder);
+    void andThenBuild(Consumer<ComponentBuilder<?>> builder);
     
     default <U> B impl(U impl) {
         andThenBuild(compBuilder -> compBuilder.impl(impl));
@@ -193,33 +192,33 @@ public interface AdapterBase<B extends C
         return (B) this;
     }
     
-    default B cb(String init, String start, String stop, String destroy) {
-        andThenBuild(compBuilder -> compBuilder.cb(init, start, stop, 
destroy));
+    default B life(String ... callbacks) {
+        andThenBuild(compBuilder -> compBuilder.life(callbacks));
         return (B) this;
     }
     
-    default B cb(Object callbackInstance, String init, String start, String 
stop, String destroy) {
-        andThenBuild(compBuilder -> compBuilder.cb(callbackInstance, init, 
start, stop, destroy));
+    default B lifeInst(Object callbackInstance, String ... callbacks) {
+        andThenBuild(compBuilder -> compBuilder.lifeInst(callbackInstance, 
callbacks));
         return (B) this;
     }
 
-    default <U> B cb(Cb callbackType, CbConsumer<U> callback) {
-        andThenBuild(compBuilder -> compBuilder.cb(callbackType, callback));
+    default <U> B life(Cb callbackType, CbConsumer<U> callback) {
+        andThenBuild(compBuilder -> compBuilder.life(callbackType, callback));
         return (B) this;
     }
     
-    default <U> B cb(Cb callbackType, CbBiConsumer<U, Component> callback) {
-        andThenBuild(compBuilder -> compBuilder.cb(callbackType, callback));
+    default <U> B life(Cb callbackType, CbTypeComponent<U> callback) {
+        andThenBuild(compBuilder -> compBuilder.life(callbackType, callback));
         return (B) this;
     }
     
-    default B cbi(Cb callbackType, Runnable callback) {
-        andThenBuild(compBuilder -> compBuilder.cbi(callbackType, callback));
+    default B lifeInst(Cb callbackType, Runnable callback) {
+        andThenBuild(compBuilder -> compBuilder.lifeInst(callbackType, 
callback));
         return (B) this;
     }
     
-    default B cbi(Cb callbackType, CbComponent callback) {
-        andThenBuild(compBuilder -> compBuilder.cbi(callbackType, callback));
+    default B lifeInst(Cb callbackType, CbComponent callback) {
+        andThenBuild(compBuilder -> compBuilder.lifeInst(callbackType, 
callback));
         return (B) this;
     }
 

Added: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleAdapterBuilderImpl.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/BundleAdapterBuilderImpl.java?rev=1725647&view=auto
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleAdapterBuilderImpl.java
 (added)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleAdapterBuilderImpl.java
 Tue Jan 19 23:00:49 2016
@@ -0,0 +1,202 @@
+package org.apache.felix.dm.builder.lambda.impl;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+import java.util.stream.Stream;
+
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.DependencyManager;
+import org.apache.felix.dm.builder.lambda.BundleAdapterBuilder;
+import org.apache.felix.dm.builder.lambda.Cb;
+import org.apache.felix.dm.builder.lambda.ComponentBuilder;
+import org.apache.felix.dm.builder.lambda.Functions.CbBundle;
+import org.apache.felix.dm.builder.lambda.Functions.CbComponentBundle;
+import org.apache.felix.dm.builder.lambda.Functions.CbTypeBundle;
+import org.apache.felix.dm.builder.lambda.Functions.CbTypeComponentBundle;
+import org.osgi.framework.Bundle;
+
+public class BundleAdapterBuilderImpl implements 
AdapterBase<BundleAdapterBuilder>, BundleAdapterBuilder {
+    private Consumer<ComponentBuilder<?>> m_compBuilder = (compBuilder -> {});
+    protected final Map<Cb, List<MethodRef<Object>>> m_refs = new HashMap<>();
+    private DependencyManager m_dm;
+    private boolean m_autoAdd;
+    private String m_added;
+    private String m_changed;
+    private String m_removed;
+    private String m_filter;
+    private int m_stateMask = -1;
+    private boolean m_propagate;
+    private Object m_callbackInstance;
+    private String m_add;
+    private String m_change;
+    private String m_remove;
+
+    @FunctionalInterface
+    interface MethodRef<I> {
+        public void accept(I instance, Component c, Bundle b);
+    }
+
+    public BundleAdapterBuilderImpl(DependencyManager dm) {
+        m_dm = dm;
+    }
+    
+    public void andThenBuild(Consumer<ComponentBuilder<?>> builder) {
+        m_compBuilder = m_compBuilder.andThen(builder);
+    }
+
+    @Override
+    public BundleAdapterBuilderImpl autoAdd(boolean autoAdd) {
+        m_autoAdd = autoAdd;
+        return this;
+    }
+    
+    @Override
+    public BundleAdapterBuilderImpl autoAdd() {
+        m_autoAdd = true;
+        return this;
+    }
+    
+    public boolean isAutoAdd() {
+        return m_autoAdd;
+    }
+
+    public BundleAdapterBuilder mask(int mask) {
+        m_stateMask = mask;
+        return this;
+    }
+    
+    public BundleAdapterBuilder filter(String filter) {
+        m_filter = filter;
+        return this;
+    }
+
+    public BundleAdapterBuilder propagate(boolean propagate) {
+        m_propagate = propagate;
+        return this;
+    }
+    
+    public BundleAdapterBuilder propagate() {
+        m_propagate = true;
+        return this;
+    }
+
+    public BundleAdapterBuilder cb(String ... callbacks) {
+        return cbi(null, callbacks);
+    }
+    
+    public BundleAdapterBuilder cbi(Object callbackInstance, String ... 
callbacks) {
+        switch (callbacks.length) {
+        case 1:
+            return cbi(callbackInstance, callbacks[0], null, null);
+            
+        case 2:
+            return cbi(callbackInstance, callbacks[0], null, callbacks[1]);
+            
+        case 3:
+            return cbi(callbackInstance, callbacks[0], callbacks[1], 
callbacks[2]);
+            
+        default:
+            throw new IllegalArgumentException("wrong number of arguments: " + 
callbacks.length + ". " +
+                "Possible arguments: [add], [add, remove] or [add, change, 
remove]");
+        }
+    }
+    
+    private BundleAdapterBuilder cbi(Object callbackInstance, String add, 
String change, String remove) {
+        checkHasNoMethodRefs();
+        m_callbackInstance = callbackInstance;
+        m_add = add;
+        m_change = change;
+        m_remove = remove;
+        return this;
+    }
+
+    public <T> BundleAdapterBuilder cb(Cb callbackType, CbTypeBundle<T> 
callback) {
+        Class<T> type = Helpers.getLambdaGenericType(callback, 0);
+        return setComponentCallbackRef(callbackType, type, (instance, 
component, bundle) -> { callback.accept((T) instance, bundle); });
+    }
+    
+    public <T> BundleAdapterBuilder cb(Cb callbackType, 
CbTypeComponentBundle<T> callback) {
+        Class<T> type = Helpers.getLambdaGenericType(callback, 0);
+        return setComponentCallbackRef(callbackType, type, (instance, 
component, bundle) -> { callback.accept((T) instance, component, bundle); });
+    }
+    
+    public BundleAdapterBuilder cbi(Cb callbackType, CbBundle callback) {
+        return setInstanceCallbackRef(callbackType, (instance, component, 
bundle) -> { callback.accept(bundle); });
+    }
+    
+    public BundleAdapterBuilder cbi(Cb callbackType, CbComponentBundle 
callback) {
+        return setInstanceCallbackRef(callbackType, (instance, component, 
bundle) -> { callback.accept(component, bundle); });
+    }
+
+    @Override
+    public Component build() { 
+        Component c = null;
+        
+        if (m_refs.size() > 0) {
+            @SuppressWarnings("unused")
+            Object wrapCallback = new Object() {
+                public void add(Component comp, Bundle bundle) {
+                    invokeMethodRefs(Cb.ADD, comp, bundle);
+                }
+                
+                public void change(Component comp, Bundle bundle) {
+                    invokeMethodRefs(Cb.CHG, comp, bundle);
+                }
+
+                public void remove(Component comp, Bundle bundle) {
+                    invokeMethodRefs(Cb.REM, comp, bundle);
+                }
+            };
+            c = m_dm.createBundleAdapterService(m_stateMask, m_filter, 
m_propagate, wrapCallback, "add", "change", "remove");
+        } else {
+            c = m_dm.createBundleAdapterService(m_stateMask, m_filter, 
m_propagate, m_callbackInstance, m_add, m_change, m_remove);
+        }
+        ComponentBuilderImpl cb = new ComponentBuilderImpl(c, false);
+        m_compBuilder.accept (cb);
+        return cb.build();        
+    }
+    
+    private <U> BundleAdapterBuilder setInstanceCallbackRef(Cb cbType, 
MethodRef<U> ref) {
+        checkHasNoReflectionCallbacks();
+        List<MethodRef<Object>> list = m_refs.computeIfAbsent(cbType, l -> new 
ArrayList<>());
+        list.add((instance, component, bundle) -> ref.accept(null, component, 
bundle));
+        return this;
+    }
+    
+    @SuppressWarnings("unchecked")
+    private <U> BundleAdapterBuilder setComponentCallbackRef(Cb cbType, 
Class<U> type, MethodRef<U> ref) {
+        cbType.ensureServiceCallback();
+        checkHasNoReflectionCallbacks();
+        List<MethodRef<Object>> list = m_refs.computeIfAbsent(cbType, l -> new 
ArrayList<>());
+        list.add((instance, component, bundle) -> {
+            Stream.of(component.getInstances()).forEach(inst -> {
+                if (Helpers.getClass(inst).equals(type)) {
+                    ref.accept((U) inst, component, bundle);
+                }
+            });
+        });
+        return this;
+    }
+    
+    private void invokeMethodRefs(Cb cbType, Component comp, Bundle bundle) {
+        m_refs.computeIfPresent(cbType, (k, mrefs) -> {
+            mrefs.forEach(mref -> mref.accept(null, comp, bundle));
+            return mrefs;
+         });
+     }
+
+    private void checkHasNoMethodRefs() {
+        if (m_refs.size() > 0) {
+            throw new IllegalStateException("Can't mix method references with 
reflection based callbacks");
+        }
+    }
+    
+    private void checkHasNoReflectionCallbacks() {
+        if (m_added != null || m_changed != null || m_removed != null) {
+            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/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=1725647&r1=1725646&r2=1725647&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
 Tue Jan 19 23:00:49 2016
@@ -130,36 +130,35 @@ public class BundleDependencyBuilderImpl
         m_propagateSupplier = instance;
         return this;
     }
-    
-    @Override
-    public BundleDependencyBuilder cb(String add) {
-        cb(add, null, null);
-        return this;
-    }
-    
-    @Override
-    public BundleDependencyBuilder cb(Object callbackInstance, String add) {
-        cb(callbackInstance, add, null, null);
-        return this;
+        
+    public BundleDependencyBuilder cb(String ... callbacks) {
+        return cbi(null, callbacks);
     }
     
     @Override
-    public BundleDependencyBuilder cb(String add, String remove) {
-        cb(add, null, remove);
+    public BundleDependencyBuilder cbi(Object callbackInstance, String ... 
callbacks) {
+        switch (callbacks.length) {
+        case 1:
+            cbi(callbackInstance, callbacks[0], null, null);
+            break;
+            
+        case 2:
+            cbi(callbackInstance, callbacks[0], null, callbacks[1]);
+            break;
+            
+        case 3:
+            cbi(callbackInstance, callbacks[0], callbacks[1], callbacks[2]);
+            break;
+            
+        default:
+            throw new IllegalArgumentException("wrong number of arguments: " + 
callbacks.length + ". " +
+                "Possible arguments: [add], [add, remove] or [add, change, 
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) {
+    private BundleDependencyBuilder cbi(Object callbackInstance, String added, 
String changed, String removed) {
         requiresNoMethodRefs();
         m_instance = callbackInstance;
         m_added = added != null ? added : m_added;

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=1725647&r1=1725646&r2=1725647&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
 Tue Jan 19 23:00:49 2016
@@ -22,9 +22,9 @@ import org.apache.felix.dm.builder.lambd
 import org.apache.felix.dm.builder.lambda.ComponentBuilder;
 import org.apache.felix.dm.builder.lambda.ConfigurationDependencyBuilder;
 import org.apache.felix.dm.builder.lambda.DependencyBuilder;
-import org.apache.felix.dm.builder.lambda.Functions.CbBiConsumer;
 import org.apache.felix.dm.builder.lambda.Functions.CbComponent;
 import org.apache.felix.dm.builder.lambda.Functions.CbConsumer;
+import org.apache.felix.dm.builder.lambda.Functions.CbTypeComponent;
 import org.apache.felix.dm.builder.lambda.Functions.FluentProperties;
 import org.apache.felix.dm.builder.lambda.FutureDependencyBuilder;
 import org.apache.felix.dm.builder.lambda.ServiceDependencyBuilder;
@@ -424,39 +424,61 @@ public class ComponentBuilderImpl implem
         return this;
     }
     
-    public ComponentBuilderImpl cb(String init, String start, String stop, 
String destroy) {
+    public ComponentBuilderImpl life(String ...callbacks) {
         ensureHasNoLifecycleMethodRefs();
-        m_init = init;
-        m_start = start;
-        m_stop = stop;
-        m_destroy = destroy;
+        switch (callbacks.length) {
+            case 1:
+                m_init = callbacks[0];
+                break;
+                
+            case 2:
+                m_init = callbacks[0];
+                m_start = callbacks[1];
+                break;
+                
+            case 3:
+                m_init = callbacks[0];
+                m_start = callbacks[1];
+                m_stop = callbacks[2];
+                break;
+                
+            case 4:
+                m_init = callbacks[0];
+                m_start = callbacks[1];
+                m_stop = callbacks[2];
+                m_destroy = callbacks[3];
+                break;
+                
+            default:
+                throw new IllegalArgumentException("life method may take at 
max four parameters (first one for \"init\" callback, second for \"start\", 
third for \"stop\", and fourth for \"destroy\" callback");
+        }
         return this;
     }
     
-    public ComponentBuilderImpl cb(Object callbackInstance, String init, 
String start, String stop, String destroy) {
+    public ComponentBuilderImpl lifeInst(Object callbackInstance, String 
...callbacks) {
         m_callbackInstance = callbackInstance;
-        return cb(init, start, stop, destroy);
+        return life(callbacks);
     }    
 
     @Override
-    public <U> ComponentBuilderImpl cb(Cb callbackType, CbConsumer<U> 
callback) {
+    public <U> ComponentBuilderImpl life(Cb callbackType, CbConsumer<U> 
callback) {
         Class<U> type = Helpers.getLambdaGenericType(callback, 0);
        return setComponentCallbackRef(callbackType, type, (inst, component) -> 
callback.accept((U) inst));
     }
 
     @Override
-    public <U> ComponentBuilderImpl cb(Cb callbackType, CbBiConsumer<U, 
Component> callback) {
+    public <U> ComponentBuilderImpl life(Cb callbackType, CbTypeComponent<U> 
callback) {
         Class<U> type = Helpers.getLambdaGenericType(callback, 0);
         return setComponentCallbackRef(callbackType, type, (inst, component) 
-> callback.accept((U) inst, component));
     }
 
     @Override
-    public ComponentBuilderImpl cbi(Cb callbackType, Runnable callback) {
+    public ComponentBuilderImpl lifeInst(Cb callbackType, Runnable callback) {
         return setInstanceCallbackRef(callbackType, (inst, component) -> 
callback.run());
     }
 
     @Override
-    public ComponentBuilderImpl cbi(Cb callbackType, CbComponent callback) {
+    public ComponentBuilderImpl lifeInst(Cb callbackType, CbComponent 
callback) {
         return setInstanceCallbackRef(callbackType, (inst, component) -> 
callback.accept(component));
     }
 

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=1725647&r1=1725646&r2=1725647&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
 Tue Jan 19 23:00:49 2016
@@ -66,7 +66,7 @@ public class ConfigurationDependencyBuil
         return this;
     }
     
-    public ConfigurationDependencyBuilder cb(Object callbackInstance, String 
update) {
+    public ConfigurationDependencyBuilder cbi(Object callbackInstance, String 
update) {
         m_updateCallbackInstance = callbackInstance;
         cb(update);
         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=1725647&r1=1725646&r2=1725647&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
 Tue Jan 19 23:00:49 2016
@@ -25,7 +25,7 @@ public class FactoryPidAdapterBuilderImp
     private Object m_updateCallbackInstance;
     private boolean m_hasMethodRefs;
     private boolean m_hasReflectionCallback;
-    private Consumer<ComponentBuilder> m_compBuilder = (componentBuilder -> 
{});
+    private Consumer<ComponentBuilder<?>> m_compBuilder = (componentBuilder -> 
{});
     private final List<MethodRef<Object>> m_refs = new ArrayList<>();
 
     @FunctionalInterface
@@ -37,7 +37,7 @@ public class FactoryPidAdapterBuilderImp
         m_dm = dm;
     }
     
-    public void andThenBuild(Consumer<ComponentBuilder> builder) {
+    public void andThenBuild(Consumer<ComponentBuilder<?>> builder) {
         m_compBuilder = m_compBuilder.andThen(builder);
     }
 
@@ -88,7 +88,7 @@ public class FactoryPidAdapterBuilderImp
         return this;
     }
     
-    public FactoryPidAdapterBuilder cb(Object callbackInstance, String update) 
{
+    public FactoryPidAdapterBuilder cbi(Object callbackInstance, String 
update) {
         cb(update);
         m_updateCallbackInstance = callbackInstance;
         return this;

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceAdapterBuilderImpl.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/ServiceAdapterBuilderImpl.java?rev=1725647&r1=1725646&r2=1725647&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceAdapterBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceAdapterBuilderImpl.java
 Tue Jan 19 23:00:49 2016
@@ -2,8 +2,6 @@ package org.apache.felix.dm.builder.lamb
 
 import java.util.Objects;
 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.DependencyManager;
@@ -19,7 +17,7 @@ public class ServiceAdapterBuilderImpl<T
     private boolean m_propagate = true;
     private final DependencyManager m_dm;
     private boolean m_autoAdd = true;
-    private Consumer<ComponentBuilder> m_compBuilder = (componentBuilder -> 
{});
+    private Consumer<ComponentBuilder<?>> m_compBuilder = (componentBuilder -> 
{});
 
     public ServiceAdapterBuilderImpl(DependencyManager dm, Class<T> type) {
         super(type);
@@ -28,7 +26,7 @@ public class ServiceAdapterBuilderImpl<T
     }    
 
     @Override
-    public void andThenBuild(Consumer<ComponentBuilder> after) {
+    public void andThenBuild(Consumer<ComponentBuilder<?>> after) {
         m_compBuilder = m_compBuilder.andThen(after);        
     }
 



Reply via email to