Author: pderop
Date: Fri Dec 18 16:58:58 2015
New Revision: 1720825

URL: http://svn.apache.org/viewvc?rev=1720825&view=rev
Log:
Finished BundleDependency + Tests.

Added:
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/BundleDependencyReflectTest.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/BundleDependencyTest.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleDependencyBuilder.java
Removed:
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleDepenencyBuilder.java
Modified:
    
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/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/ExtendedComponentBase.java

Added: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/BundleDependencyReflectTest.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/BundleDependencyReflectTest.java?rev=1720825&view=auto
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/BundleDependencyReflectTest.java
 (added)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/BundleDependencyReflectTest.java
 Fri Dec 18 16:58:58 2015
@@ -0,0 +1,175 @@
+/*
+ * 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.component;
+
+/**
+ * @author <a href="mailto:[email protected]";>Felix Project Team</a>
+ */
+public class BundleDependencyReflectTest extends TestBase {
+    private final static String BSN = "org.apache.felix.metatype";
+    
+    public void testBundleDependencies() {
+        DependencyManager m = getDM();
+        // create a service provider and consumer
+        MyConsumer c = new MyConsumer();        
+        Component consumer = component(m, comp -> 
comp.impl(c).withBundle(bundle -> bundle.callbacks("add", "remove")));
+        
+        // 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();
+        
+        // helper class that ensures certain steps get executed in sequence
+        Ensure e = new Ensure();
+        String filter = "(Bundle-SymbolicName=" + BSN + ")";
+        Component consumerWithFilter = 
+                       component(m, comp -> comp.impl(new 
FilteredConsumer(e)).withBundle(bundle-> bundle.filter(filter).callbacks("add", 
null, "remove")));
+        e.step(2);
+        // remove the consumer again
+        m.remove(consumerWithFilter);
+        e.step(4);
+    }
+    
+    public void testRequiredBundleDependency() {
+        DependencyManager m = getDM();
+        
+        // helper class that ensures certain steps get executed in sequence
+        Ensure e = new Ensure();
+        Component consumerWithFilter = m.createComponent()
+            .setImplementation(new FilteredConsumerRequired(e))
+            .add(m.createBundleDependency()
+                .setRequired(true)
+                .setFilter("(Bundle-SymbolicName=" + BSN + ")")
+                .setCallbacks("add", "remove")
+                );
+        // add a consumer with a filter
+        m.add(consumerWithFilter);
+        e.waitForStep(1, 5000);
+        // remove the consumer again
+        m.remove(consumerWithFilter);
+        e.waitForStep(2, 5000);
+    }
+    
+    public void testRequiredBundleDependencyWithComponentArgInCallbackMethod() 
{
+        DependencyManager m = getDM();
+        
+        // helper class that ensures certain steps get executed in sequence
+        Ensure e = new Ensure();
+        Component consumerWithFilter = m.createComponent()
+            .setImplementation(new FilteredConsumerRequiredWithComponentArg(e))
+            .add(m.createBundleDependency()
+                .setRequired(true)
+                .setFilter("(Bundle-SymbolicName=" + BSN + ")")
+                .setCallbacks("add", "remove")
+                );
+        // add a consumer with a filter
+        m.add(consumerWithFilter);
+        e.waitForStep(1, 5000);
+        // remove the consumer again
+        m.remove(consumerWithFilter);
+        e.waitForStep(2, 5000);
+    }
+    
+    static class MyConsumer {
+        private volatile int m_count = 0;
+
+        public void add(Bundle b) {
+            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(Bundle b) {
+            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);
+        }
+    }
+    
+    static class FilteredConsumer {
+        private final Ensure m_ensure;
+
+        public FilteredConsumer(Ensure e) {
+            m_ensure = e;
+        }
+        
+        public void add(Bundle b) {
+            m_ensure.step(1);
+        }
+        
+        public void remove(Bundle b) {
+            m_ensure.step(3);
+        }
+    }
+    
+    static class FilteredConsumerRequired {
+        private final Ensure m_ensure;
+
+        public FilteredConsumerRequired(Ensure e) {
+            m_ensure = e;
+        }
+        
+        public void add(Bundle b) {
+            System.out.println("Bundle is " + b);
+//            Assert.assertNotNull(b);
+            if (b.getSymbolicName().equals(BSN)) {
+                m_ensure.step(1);
+            }
+        }
+        
+        public void remove(Bundle b) {
+            Assert.assertNotNull(b);
+            if (b.getSymbolicName().equals(BSN)) {
+                m_ensure.step(2);
+            }
+        }
+    }
+
+    static class FilteredConsumerRequiredWithComponentArg extends 
FilteredConsumerRequired {
+        public FilteredConsumerRequiredWithComponentArg(Ensure e) {
+            super(e);
+        }
+        
+        public void add(Component component, Bundle b) {
+               Assert.assertNotNull(component);
+               super.add(b);
+        }
+        
+        public void remove(Component component, Bundle b) {
+               Assert.assertNotNull(component);
+               super.remove(b);
+        }
+    }
+}

Added: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/BundleDependencyTest.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/BundleDependencyTest.java?rev=1720825&view=auto
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/BundleDependencyTest.java
 (added)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/BundleDependencyTest.java
 Fri Dec 18 16:58:58 2015
@@ -0,0 +1,177 @@
+/*
+ * 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.component;
+
+/**
+ * @author <a href="mailto:[email protected]";>Felix Project Team</a>
+ */
+public class BundleDependencyTest extends TestBase {
+    private final static String BSN = "org.apache.felix.metatype";
+    
+    public void testBundleDependencies() {
+        DependencyManager m = getDM();
+        // create a service provider and consumer
+        MyConsumer c = new MyConsumer();        
+        Component consumer = component(m, comp -> comp
+                       .impl(c).withBundle(bundle -> 
bundle.onAdd(MyConsumer::add).onRemove(MyConsumer::remove)));
+        
+        // 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();
+        
+        // helper class that ensures certain steps get executed in sequence
+        Ensure e = new Ensure();
+        String filter = "(Bundle-SymbolicName=" + BSN + ")";
+        Component consumerWithFilter = component(m, comp -> comp
+                       .impl(new FilteredConsumer(e))
+                       .withBundle(bundle-> 
bundle.filter(filter).onAdd(FilteredConsumer::add).onRemove(FilteredConsumer::remove)));
+        e.step(2);
+        // remove the consumer again
+        m.remove(consumerWithFilter);
+        e.step(4);
+    }
+    
+    public void testRequiredBundleDependency() {
+        DependencyManager m = getDM();
+        
+        // helper class that ensures certain steps get executed in sequence
+        Ensure e = new Ensure();
+        Component consumerWithFilter = m.createComponent()
+            .setImplementation(new FilteredConsumerRequired(e))
+            .add(m.createBundleDependency()
+                .setRequired(true)
+                .setFilter("(Bundle-SymbolicName=" + BSN + ")")
+                .setCallbacks("add", "remove")
+                );
+        // add a consumer with a filter
+        m.add(consumerWithFilter);
+        e.waitForStep(1, 5000);
+        // remove the consumer again
+        m.remove(consumerWithFilter);
+        e.waitForStep(2, 5000);
+    }
+    
+    public void testRequiredBundleDependencyWithComponentArgInCallbackMethod() 
{
+        DependencyManager m = getDM();
+        
+        // helper class that ensures certain steps get executed in sequence
+        Ensure e = new Ensure();
+        Component consumerWithFilter = m.createComponent()
+            .setImplementation(new FilteredConsumerRequiredWithComponentArg(e))
+            .add(m.createBundleDependency()
+                .setRequired(true)
+                .setFilter("(Bundle-SymbolicName=" + BSN + ")")
+                .setCallbacks("add", "remove")
+                );
+        // add a consumer with a filter
+        m.add(consumerWithFilter);
+        e.waitForStep(1, 5000);
+        // remove the consumer again
+        m.remove(consumerWithFilter);
+        e.waitForStep(2, 5000);
+    }
+    
+    static class MyConsumer {
+        private volatile int m_count = 0;
+
+        public void add(Bundle b) {
+            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(Bundle b) {
+            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);
+        }
+    }
+    
+    static class FilteredConsumer {
+        private final Ensure m_ensure;
+
+        public FilteredConsumer(Ensure e) {
+            m_ensure = e;
+        }
+        
+        public void add(Bundle b) {
+            m_ensure.step(1);
+        }
+        
+        public void remove(Bundle b) {
+            m_ensure.step(3);
+        }
+    }
+    
+    static class FilteredConsumerRequired {
+        private final Ensure m_ensure;
+
+        public FilteredConsumerRequired(Ensure e) {
+            m_ensure = e;
+        }
+        
+        public void add(Bundle b) {
+            System.out.println("Bundle is " + b);
+//            Assert.assertNotNull(b);
+            if (b.getSymbolicName().equals(BSN)) {
+                m_ensure.step(1);
+            }
+        }
+        
+        public void remove(Bundle b) {
+            Assert.assertNotNull(b);
+            if (b.getSymbolicName().equals(BSN)) {
+                m_ensure.step(2);
+            }
+        }
+    }
+
+    static class FilteredConsumerRequiredWithComponentArg extends 
FilteredConsumerRequired {
+        public FilteredConsumerRequiredWithComponentArg(Ensure e) {
+            super(e);
+        }
+        
+        public void add(Component component, Bundle b) {
+               Assert.assertNotNull(component);
+               super.add(b);
+        }
+        
+        public void remove(Component component, Bundle b) {
+               Assert.assertNotNull(component);
+               super.remove(b);
+        }
+    }
+}

Added: 
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=1720825&view=auto
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleDependencyBuilder.java
 (added)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleDependencyBuilder.java
 Fri Dec 18 16:58:58 2015
@@ -0,0 +1,320 @@
+package org.apache.felix.dm.builder.lambda;
+
+import java.util.Dictionary;
+import java.util.function.Supplier;
+
+import org.apache.felix.dm.BundleDependency;
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.builder.lambda.Functions.Consumer;
+import org.apache.felix.dm.builder.lambda.Functions.Consumer2;
+import org.apache.felix.dm.builder.lambda.Functions.SerializableLambda;
+import org.osgi.framework.Bundle;
+
+/**
+ * Defines a dependency on a bundle.
+ * 
+ * @author <a href="mailto:[email protected]";>Felix Project Team</a>
+ */
+public interface BundleDependencyBuilder extends 
DependencyBuilder<BundleDependency> {
+       /**
+        * Defines a method reference on a component class method. The callback 
method takes Bundle parameter.
+        * @param <I> the type of the component instance on which this method 
reference is applied
+        */
+    @FunctionalInterface
+    public interface InstanceBundle<I> extends SerializableLambda {
+       /**
+        * Signature of the callback method.
+        * @param instance the component instance on which the callback has to 
be called
+        * @param bundle to inject
+        */
+       void call(I instance, Bundle bundle);
+    }
+    
+       /**
+        * Defines a method reference on a component instance. The callback 
method takes Component and a Bundle in parameters. 
+        * @param <I> the type of the component instance on which this method 
reference is applied
+        */
+    @FunctionalInterface
+    public interface InstanceComponentBundle<I> extends SerializableLambda {
+       /**
+        * Signature of the callback method.
+        * @param instance the component instance on which the callback has to 
be called
+        * @param component the component on which this dependency has been 
added.
+        * @param bundle the bundle to inject.
+        */
+       void call(I instance, Component component, Bundle bundle);
+    }
+    
+    /**
+     * Sets the add callbacks for this dependency. The callback can be used as 
hooks whenever a dependency is added. 
+     * When you specify callbacks, the auto configuration feature is 
automatically turned off, because we're assuming
+     * you don't need it in this case.
+     * 
+     * @param callback the method to call when a bundle was added
+     * @return the bundle dependency
+     */
+    public BundleDependencyBuilder onAdd(String callback);
+
+    /**
+     * Sets the change callbacks for this dependency. The callback can be used 
as hooks whenever a dependency is changed. 
+     * When you specify callbacks, the auto configuration feature is 
automatically turned off, because we're assuming
+     * you don't need it in this case.
+     * 
+     * @param callback the method to call when a bundle was changed
+     * @return the bundle dependency
+     */
+    public BundleDependencyBuilder onChange(String callback);
+
+    /**
+     * Sets the remove callbacks for this dependency. The callback can be used 
as hooks whenever a dependency is removed. 
+     * When you specify callbacks, the auto configuration feature is 
automatically turned off, because we're assuming
+     * you don't need it in this case.
+     * 
+     * @param callback the method to call when a bundle was removed
+     * @return the bundle dependency
+     */
+    public BundleDependencyBuilder onRemove(String callback);
+
+    /**
+     * Sets the callbacks for this dependency. These callbacks can be used as 
hooks whenever a dependency is added, changed or
+     * removed. When you specify callbacks, the auto configuration feature is 
automatically turned off, because we're assuming
+     * you don't need it in this case.
+     * 
+     * @param added the method to call when a bundle was added
+     * @param removed the method to call when a bundle was removed
+     * @return the bundle dependency
+     */
+    public BundleDependencyBuilder callbacks(String added, String removed);
+    
+    /**
+     * Sets the callbacks for this dependency. These callbacks can be used as 
hooks whenever a dependency is added, changed or
+     * removed. When you specify callbacks, the auto configuration feature is 
automatically turned off, because we're assuming
+     * you don't need it in this case.
+     * 
+     * @param added the method to call when a bundle was added
+     * @param changed the method to call when a bundle was changed
+     * @param removed the method to call when a bundle was removed
+     * @return the bundle dependency
+     */
+    public BundleDependencyBuilder callbacks(String added, String changed, 
String removed);
+
+    /**
+     * Sets the callbacks for this dependency. These callbacks can be used as 
hooks whenever a dependency is added, changed or
+     * removed. They are called on the instance you provide. When you specify 
callbacks, the auto configuration feature is
+     * automatically turned off, because we're assuming you don't need it in 
this case.
+     * 
+     * @param instance the instance to call the callbacks on
+     * @param added the method to call when a bundle was added
+     * @param changed the method to call when a bundle was changed
+     * @param removed the method to call when a bundle was removed
+     * @return the bundle dependency builder
+     */
+    public BundleDependencyBuilder callbacks(Object instance, String added, 
String changed, String removed);
+
+    /**
+     * Sets the add callbacks instance for this dependency. These callbacks 
can be used as hooks whenever a dependency is added. When you specify 
callbacks, the auto configuration feature is automatically turned off, because 
we're assuming
+     * you don't need it in this case.
+     * 
+     * @param added the method to call when a bundle was added
+     * @return the bundle dependency
+     */
+    public BundleDependencyBuilder onAdd(Consumer<Bundle> add);
+
+    /**
+     * Sets the add callbacks instance for this dependency. These callbacks 
can be used as hooks whenever a dependency is added. When you specify 
callbacks, the auto configuration feature is automatically turned off, because 
we're assuming
+     * you don't need it in this case.
+     * 
+     * @param added the method to call when a bundle was added
+     * @return the bundle dependency
+     */
+    public <I> BundleDependencyBuilder onAdd(InstanceBundle<I> add);
+
+    /**
+     * Sets the add callbacks instance for this dependency. These callbacks 
can be used as hooks whenever a dependency is added. When you specify 
callbacks, the auto configuration feature is automatically turned off, because 
we're assuming
+     * you don't need it in this case.
+     * 
+     * @param added the method to call when a bundle was added. the callback 
is invoked with the component on which this dependency is added, and the added 
bundle.
+     * @return the bundle dependency
+     */
+    public BundleDependencyBuilder onAdd(Consumer2<Component, Bundle> add);
+
+    /**
+     * Sets the add callbacks instance for this dependency. These callbacks 
can be used as hooks whenever a dependency is added. When you specify 
callbacks, the auto configuration feature is automatically turned off, because 
we're assuming
+     * you don't need it in this case.
+     * 
+     * @param added the method to call on one of the component instances when 
a bundle was added. the callback is invoked with the component on which this 
dependency is added, and the added bundle.
+     * @return the bundle dependency
+     */
+    public <I>  BundleDependencyBuilder onAdd(InstanceComponentBundle<I> add);
+
+    /**
+     * Sets the change callbacks instance for this dependency. These callbacks 
can be used as hooks whenever a dependency is changed. When you specify 
callbacks, the auto configuration feature is automatically turned off, because 
we're assuming
+     * you don't need it in this case.
+     * 
+     * @param added the method to call when a bundle was changed
+     * @return the bundle dependency
+     */
+    public BundleDependencyBuilder onChange(Consumer<Bundle> add);
+
+    /**
+     * Sets the changed callbacks instance for this dependency. These 
callbacks can be used as hooks whenever a dependency is changed. When you 
specify callbacks, the auto configuration feature is automatically turned off, 
because we're assuming
+     * you don't need it in this case.
+     * 
+     * @param change the method to call when a bundle was changed
+     * @return the bundle dependency
+     */
+    public <I> BundleDependencyBuilder onChange(InstanceBundle<I> change);
+
+    /**
+     * Sets the changed callbacks instance for this dependency. These 
callbacks can be used as hooks whenever a dependency is changed. When you 
specify callbacks, the auto configuration feature is automatically turned off, 
because we're assuming
+     * you don't need it in this case.
+     * 
+     * @param change the method to call when a bundle was changed. the 
callback is invoked with the component on which this dependency is added, and 
the added bundle.
+     * @return the bundle dependency
+     */
+    public BundleDependencyBuilder onChange(Consumer2<Component, Bundle> 
change);
+
+    /**
+     * Sets the changed callbacks instance for this dependency. These 
callbacks can be used as hooks whenever a dependency is changed. When you 
specify callbacks, the auto configuration feature is automatically turned off, 
because we're assuming
+     * you don't need it in this case.
+     * 
+     * @param change the method to call on one of the component instances when 
a bundle was changed. the callback is invoked with the component on which this 
dependency is added, and the added bundle.
+     * @return the bundle dependency
+     */
+    public <I>  BundleDependencyBuilder onChange(InstanceComponentBundle<I> 
change);
+
+    /**
+     * Sets the remove callbacks instance for this dependency. These callbacks 
can be used as hooks whenever a dependency is removed. When you specify 
callbacks, the auto configuration feature is automatically turned off, because 
we're assuming
+     * you don't need it in this case.
+     * 
+     * @param remove the method to call when a bundle was remove
+     * @return the bundle dependency
+     */
+    public BundleDependencyBuilder onRemove(Consumer<Bundle> remove);
+
+    /**
+     * Sets the remove callbacks instance for this dependency. These callbacks 
can be used as hooks whenever a dependency is removed. When you specify 
callbacks, the auto configuration feature is automatically turned off, because 
we're assuming
+     * you don't need it in this case.
+     * 
+     * @param remove the method to call when a bundle was removed
+     * @return the bundle dependency
+     */
+    public <I> BundleDependencyBuilder onRemove(InstanceBundle<I> remove);
+
+    /**
+     * Sets the remove callbacks instance for this dependency. These callbacks 
can be used as hooks whenever a dependency is remove. When you specify 
callbacks, the auto configuration feature is automatically turned off, because 
we're assuming
+     * you don't need it in this case.
+     * 
+     * @param removed the method to call when a bundle was removed. the 
callback is invoked with the component on which this dependency is removed, and 
the added bundle.
+     * @return the bundle dependency
+     */
+    public BundleDependencyBuilder onRemove(Consumer2<Component, Bundle> 
remove);
+
+    /**
+     * Sets the remove callbacks instance for this dependency. These callbacks 
can be used as hooks whenever a dependency is removed. When you specify 
callbacks, the auto configuration feature is automatically turned off, because 
we're assuming
+     * you don't need it in this case.
+     * 
+     * @param remove the method to call on one of the component instances when 
a bundle was removed. the callback is invoked with the component on which this 
dependency is added, and the added bundle.
+     * @return the bundle dependency
+     */
+    public <I> BundleDependencyBuilder onRemove(InstanceComponentBundle<I> 
remove);
+
+    /**
+     * Enables auto configuration for this dependency. This means the 
component implementation (composition) will be
+     * injected with this bundle dependency automatically.
+     * 
+     * @param autoConfig <code>true</code> to enable auto configuration
+     * @return the bundle dependency builder
+     */
+    public BundleDependencyBuilder autoConfig(boolean autoConfig);
+
+    /**
+     * Enables auto configuration for this dependency. This means the 
component implementation (composition) will be
+     * injected with this bundle dependency automatically.
+     * 
+     * @return the bundle dependency builder
+     */
+    public BundleDependencyBuilder autoConfig();
+
+    /**
+     * Sets the dependency to be required.
+     * 
+     * @param required <code>true</code> if this bundle dependency is required
+     * @return the bundle dependency builder
+     */
+    public BundleDependencyBuilder required(boolean required);
+
+    /**
+     * Sets the dependency to be required.
+     * 
+     * @param required <code>true</code> if this bundle dependency is required
+     * @return the bundle dependency builder
+     */
+    public BundleDependencyBuilder required();
+
+    /**
+     * Sets the bundle to depend on directly.
+     * 
+     * @param bundle the bundle to depend on
+     * @return the bundle dependency builder
+     */
+    public BundleDependencyBuilder bundle(Bundle bundle);
+
+    /**
+     * 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
+     */
+    public BundleDependencyBuilder filter(String filter) throws 
IllegalArgumentException;
+
+    /**
+     * 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
+     * @return the bundle dependency builder
+     */
+    public BundleDependencyBuilder mask(int mask);
+
+    /**
+     * 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
+     */
+    public BundleDependencyBuilder propagate(boolean propagate);
+    
+    /**
+     * Sets property propagation. any bundle manifest properties will be added
+     * to the service properties of the component that has this dependency (if 
it registers as a service).
+     * 
+     * @return the bundle dependency builder
+     */
+    public BundleDependencyBuilder propagate();
+    
+    /**
+     * Sets an Object instance and a callback method used to propagate some 
properties to the provided service properties.
+     * The method will be invoked on the specified object instance and must 
have one of the following signatures:
+     * <ul><li>Dictionary callback(ServiceReference, Object service) 
+     * <li>Dictionary callback(ServiceReference)
+     * </ul>
+     * @param instance the Object instance which is used to retrieve 
propagated service properties 
+     * @param method the method to invoke for retrieving the properties to be 
propagated to the service properties.
+     * @return this service dependency. builder
+     */
+    public BundleDependencyBuilder propagate(Object instance, String method);
+    
+    /**
+     * Sets an Object instance and a callback method used to propagate some 
properties to the provided service properties.
+     * The method will be invoked on the specified object instance and must 
have one of the following signatures:
+     * <ul><li>Dictionary callback(ServiceReference, Object service) 
+     * <li>Dictionary callback(ServiceReference)
+     * </ul>
+     * @param instance the Object instance which is used to retrieve 
propagated service properties 
+     * @return this service dependency. builder
+     */
+    public BundleDependencyBuilder propagate(Supplier<Dictionary<?, ?>> 
instance);
+}

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=1720825&r1=1720824&r2=1720825&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
 Fri Dec 18 16:58:58 2015
@@ -146,19 +146,26 @@ public interface ComponentBuilder<B exte
     /**
      * Adds a service dependency.
      * @param service the service
-     * @param consumer the lambda for configuring the service dependency
+     * @param consumer the lambda for building the service dependency
      * @return this builder.
      */
     <T> B withService(Class<T> service, Consumer<ServiceDependencyBuilder<T>> 
consumer);
     
     /**
      * Adds a configuration dependency.
-     * @param consumer the lambda used to configuration the configuration 
dependency.
+     * @param consumer the lambda used to build the configuration dependency.
      * @return this builder.
      */
     B withConfiguration(Consumer<ConfigurationDependencyBuilder> consumer);    
    
     
     /**
+     * Adds a bundle dependency.
+     * @param consumer the lambda used to build the bundle dependency.
+     * @return this builder.
+     */
+    B withBundle(Consumer<BundleDependencyBuilder> consumer);        
+
+    /**
      * TODO
      * @param future
      * @return

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=1720825&r1=1720824&r2=1720825&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
 Fri Dec 18 16:58:58 2015
@@ -11,12 +11,28 @@ import java.util.stream.Stream;
 
 import org.apache.felix.dm.BundleDependency;
 import org.apache.felix.dm.Component;
-import org.apache.felix.dm.builder.lambda.BundleDepenencyBuilder;
+import org.apache.felix.dm.DependencyManager;
+import org.apache.felix.dm.builder.lambda.BundleDependencyBuilder;
 import org.apache.felix.dm.builder.lambda.Functions.Consumer;
 import org.apache.felix.dm.builder.lambda.Functions.Consumer2;
 import org.osgi.framework.Bundle;
 
-public class BundleDependencyBuilderImpl implements BundleDepenencyBuilder {
+public class BundleDependencyBuilderImpl implements BundleDependencyBuilder {
+       private String m_added;
+       private String m_changed;
+       private String m_removed;
+       private Object m_instance;
+       private boolean m_autoConfig = true;
+       private boolean m_required = true;
+       private Bundle m_bundle;
+       private String m_filter;
+       private int m_stateMask = -1;
+       private boolean m_propagate;
+       private Object m_propagateInstance;
+       private String m_propagateMethod;
+       private Supplier<Dictionary<?, ?>> m_propagateSupplier;
+       private final Component m_component;
+       
        /**
         * This interface (lambda) is called when we want to invoke a method 
reference. the lambda is called with all necessary dependency 
         * informations.
@@ -31,50 +47,74 @@ public class BundleDependencyBuilderImpl
     }
 
        /**
-        * List of service (add/change/remove) callbacks.
+        * List of service (add/change/remove) callbacks (method references).
         */
        private final Map<String, List<MethodRef<Object>>> m_refs = new 
HashMap<>();
-       
-       private String m_added;
-       private String m_changed;
-       private String m_removed;
-       private Object m_instance;
-       private boolean m_reflection;
 
-       
+       /**
+        * Class used to call a supplier that returns Propagated properties
+        */
+       private class Propagate {
+               @SuppressWarnings("unused")
+               Dictionary<?, ?> propagate() {
+                       return m_propagateSupplier.get();
+               }
+       }
 
+    public BundleDependencyBuilderImpl (Component component) {
+        m_component = component;
+    }
 
-       @Override
-       public BundleDepenencyBuilder callbacks(String added, String changed, 
String removed) {
-               m_added = added;
-               m_changed = changed;
-               m_removed = removed;
-               m_reflection = true;
+    @Override
+       public BundleDependencyBuilder onAdd(String callback) {
+       return callbacks(callback, null, null);
+       }
+
+    @Override
+       public BundleDependencyBuilder onChange(String callback) {
+       return callbacks(null, callback, null);
+       }
+
+    @Override
+       public BundleDependencyBuilder onRemove(String callback) {
+       return callbacks(null, null, callback);
+       }
+
+    @Override
+       public BundleDependencyBuilder callbacks(String added, String removed) {
+       return callbacks(added, null, removed);
+       }
+
+    @Override
+       public BundleDependencyBuilder callbacks(String added, String changed, 
String removed) {
+               if (m_refs.size() != 0) throw new 
IllegalArgumentException("some method references have already been set.");
+               m_added = added != null ? added : m_added;
+               m_changed = changed != null ? changed : m_changed;
+               m_removed = removed != null ? removed : m_removed;
+               m_autoConfig = false;
                return this;
        }
 
        @Override
-       public BundleDepenencyBuilder callbacks(Object instance, String added, 
String changed, String removed) {
+       public BundleDependencyBuilder callbacks(Object instance, String added, 
String changed, String removed) {
                callbacks(added, changed, removed);
                m_instance = instance;
                return this;
        }
 
        @Override
-       public BundleDepenencyBuilder onAdd(Consumer<Bundle> add) {
-               Objects.equals(m_reflection, false);
+       public BundleDependencyBuilder onAdd(Consumer<Bundle> add) {
        return setCallbackRef("add", (instance, component, bundle) -> 
add.accept(bundle));             
        }
 
        @Override
-       public BundleDepenencyBuilder onAdd(Consumer2<Component, Bundle> add) {
-               return this;
+       public BundleDependencyBuilder onAdd(Consumer2<Component, Bundle> add) {
+       return setCallbackRef("add", (instance, component, bundle) -> 
add.accept(component, bundle));             
        }
 
        @SuppressWarnings("unchecked")
        @Override
-       public <I> BundleDepenencyBuilder onAdd(InstanceBundle<I> add) {
-               Objects.equals(m_reflection, false);
+       public <I> BundleDependencyBuilder onAdd(InstanceBundle<I> add) {
        String type = Helpers.getLambdaGenericType(add);
        return setComponentInstanceCallbackRef("add", type,   
                        (inst, component, bundle) -> add.call((I) inst, 
bundle));             
@@ -82,96 +122,228 @@ public class BundleDependencyBuilderImpl
 
        @SuppressWarnings("unchecked")
        @Override
-       public <I> BundleDepenencyBuilder onAdd(InstanceComponentBundle<I> add) 
{
-               Objects.equals(m_reflection, false);
+       public <I> BundleDependencyBuilder onAdd(InstanceComponentBundle<I> 
add) {
        String type = Helpers.getLambdaGenericType(add);
        return setComponentInstanceCallbackRef("add", type,   
                        (inst, component, bundle) -> add.call((I) inst, 
component, bundle));             
        }
+       
+       @Override
+       public BundleDependencyBuilder onChange(Consumer<Bundle> add) {
+       return setCallbackRef("change", (instance, component, bundle) -> 
add.accept(bundle));             
+       }
+
+       @Override
+       public BundleDependencyBuilder onChange(Consumer2<Component, Bundle> 
change) {
+       return setCallbackRef("change", (instance, component, bundle) -> 
change.accept(component, bundle));             
+       }
 
+       @SuppressWarnings("unchecked")
        @Override
-       public BundleDepenencyBuilder autoConfig(boolean autoConfig) {
-               // TODO Auto-generated method stub
+       public <I> BundleDependencyBuilder onChange(InstanceBundle<I> change) {
+       String type = Helpers.getLambdaGenericType(change);
+       return setComponentInstanceCallbackRef("change", type,   
+                       (inst, component, bundle) -> change.call((I) inst, 
bundle));             
+       }
+
+       @SuppressWarnings("unchecked")
+       @Override
+       public <I> BundleDependencyBuilder onChange(InstanceComponentBundle<I> 
change) {
+       String type = Helpers.getLambdaGenericType(change);
+       return setComponentInstanceCallbackRef("change", type,   
+                       (inst, component, bundle) -> change.call((I) inst, 
component, bundle));             
+       }
+       
+       @Override
+       public BundleDependencyBuilder onRemove(Consumer<Bundle> remove) {
+       return setCallbackRef("remove", (instance, component, bundle) -> 
remove.accept(bundle));             
+       }
+
+       @Override
+       public BundleDependencyBuilder onRemove(Consumer2<Component, Bundle> 
remove) {
+       return setCallbackRef("remove", (instance, component, bundle) -> 
remove.accept(component, bundle));             
+       }
+
+       @SuppressWarnings("unchecked")
+       @Override
+       public <I> BundleDependencyBuilder onRemove(InstanceBundle<I> remove) {
+       String type = Helpers.getLambdaGenericType(remove);
+       return setComponentInstanceCallbackRef("remove", type,   
+                       (inst, component, bundle) -> remove.call((I) inst, 
bundle));             
+       }
+
+       @SuppressWarnings("unchecked")
+       @Override
+       public <I> BundleDependencyBuilder onRemove(InstanceComponentBundle<I> 
remove) {
+       String type = Helpers.getLambdaGenericType(remove);
+       return setComponentInstanceCallbackRef("remove", type,   
+                       (inst, component, bundle) -> remove.call((I) inst, 
component, bundle));             
+       }
+       
+       @Override
+       public BundleDependencyBuilder autoConfig(boolean autoConfig) {
+               m_autoConfig = true;
+               return this;
+       }
+
+       @Override
+       public BundleDependencyBuilder autoConfig() {
+               autoConfig(true);
                return this;
        }
 
        @Override
-       public BundleDepenencyBuilder autoConfig() {
-               // TODO Auto-generated method stub
+       public BundleDependencyBuilder required(boolean required) {
+               m_required = required;
                return this;
        }
 
        @Override
-       public BundleDepenencyBuilder required(boolean required) {
-               // TODO Auto-generated method stub
+       public BundleDependencyBuilder required() {
+               required(true);
                return this;
        }
 
        @Override
-       public BundleDepenencyBuilder required() {
-               // TODO Auto-generated method stub
+       public BundleDependencyBuilder bundle(Bundle bundle) {
+               m_bundle = bundle;
                return this;
        }
 
        @Override
-       public BundleDepenencyBuilder bundle(Bundle bundle) {
-               // TODO Auto-generated method stub
+       public BundleDependencyBuilder filter(String filter) throws 
IllegalArgumentException {
+               m_filter = filter;
                return this;
        }
 
        @Override
-       public BundleDepenencyBuilder filter(String filter) throws 
IllegalArgumentException {
-               // TODO Auto-generated method stub
+       public BundleDependencyBuilder mask(int mask) {
+               m_stateMask = mask;
                return this;
        }
 
        @Override
-       public BundleDepenencyBuilder mask(int mask) {
-               // TODO Auto-generated method stub
+       public BundleDependencyBuilder propagate(boolean propagate) {
+               m_propagate = propagate;
                return this;
        }
 
        @Override
-       public BundleDepenencyBuilder propagate(boolean propagate) {
-               // TODO Auto-generated method stub
+       public BundleDependencyBuilder propagate() {
+               propagate(true);
                return this;
        }
 
        @Override
-       public BundleDepenencyBuilder propagate(Object instance, String method) 
{
-               // TODO Auto-generated method stub
+       public BundleDependencyBuilder propagate(Object instance, String 
method) {
+               if (m_propagateSupplier != null || m_propagate) throw new 
IllegalStateException("Propagate callback already set.");
+               Objects.nonNull(method);
+               Objects.nonNull(instance);
+               m_propagateInstance = instance;
+               m_propagateMethod = method;
                return this;
        }
 
        @Override
-       public BundleDepenencyBuilder propagate(Supplier<Dictionary<?, ?>> 
instance, String method) {
-               // TODO Auto-generated method stub
+       public BundleDependencyBuilder propagate(Supplier<Dictionary<?, ?>> 
instance) {
+               if (m_propagateInstance != null || m_propagate) throw new 
IllegalStateException("Propagate callback already set.");
+               m_propagateSupplier = instance;
                return this;
        }
        
        @Override
        public BundleDependency build() {
-               // TODO Auto-generated method stub
-               return null;
+        DependencyManager dm = m_component.getDependencyManager();
+
+        BundleDependency dep = dm.createBundleDependency();
+        dep.setRequired(m_required);
+        
+        if (m_filter != null) {
+               dep.setFilter(m_filter);
+        }
+        
+        if (m_bundle != null) {
+               dep.setBundle(m_bundle);
+        }
+        
+        if (m_stateMask != -1) {
+               dep.setStateMask(m_stateMask);
+        }
+        
+        if (m_propagate) {
+            dep.setPropagate(true);
+        } else if (m_propagateInstance != null) {
+            dep.setPropagate(m_propagateInstance, m_propagateMethod);
+        } else if (m_propagateSupplier != null) {
+               dep.setPropagate(new Propagate(), "propagate");
+        }
+        
+        if (m_added != null || m_changed != null || m_removed != null) {
+            dep.setCallbacks(m_instance, m_added, m_changed, m_removed);
+        } else if (m_refs.size() > 0) {
+            Object cb = createCallbackInstance();
+            dep.setCallbacks(cb, "add", "change", "remove");
+        } 
+        
+        if (m_autoConfig) {
+               dep.setAutoConfig(true);
+        }        
+        return dep;
        }
 
-       private <I> BundleDepenencyBuilder setCallbackRef(String cb, 
MethodRef<I> ref) {
+       private <I> BundleDependencyBuilder setCallbackRef(String cb, 
MethodRef<I> ref) {
+               requiresNoStringCallbacks();
                List<MethodRef<Object>> list = m_refs.computeIfAbsent(cb, l -> 
new ArrayList<>());
                list.add((instance, component, bundle) -> ref.accept(null, 
component, bundle));
                return this;
        }
        
        @SuppressWarnings("unchecked")
-       public <I> BundleDepenencyBuilder 
setComponentInstanceCallbackRef(String cb, String type, MethodRef<I> ref) {
-                  List<MethodRef<Object>> list = m_refs.computeIfAbsent(cb, l 
-> new ArrayList<>());
-                  list.add((instance, component, bundle) -> {
-                          Stream.of(component.getInstances()).forEach(inst -> {
-                                  if (Helpers.getClassName(inst).equals(type)) 
{
-                                          ref.accept((I) inst, component, 
bundle);
-                                  }
-                          });
-                  });
-                  return this;
-          }
+       private <I> BundleDependencyBuilder 
setComponentInstanceCallbackRef(String cb, String type, MethodRef<I> ref) {
+               requiresNoStringCallbacks();
+               List<MethodRef<Object>> list = m_refs.computeIfAbsent(cb, l -> 
new ArrayList<>());
+               list.add((instance, component, bundle) -> {
+                       Stream.of(component.getInstances()).forEach(inst -> {
+                               if (Helpers.getClassName(inst).equals(type)) {
+                                       ref.accept((I) inst, component, bundle);
+                               }
+                       });
+               });
+               return this;
+       }
+       
+       @SuppressWarnings("unused")
+       private Object createCallbackInstance() {
+               Object cb = null;
+
+               cb = new Object() {
+                       void add(Component c, Bundle bundle) {
+                               invokeMethodRefs("add", c, bundle);
+                       }
+
+                       void change(Component c, Bundle bundle) {
+                               invokeMethodRefs("change", c, bundle);
+                       }
+
+                       void remove(Component c, Bundle bundle) {
+                               invokeMethodRefs("remove", c, bundle);
+                       }
+               };
+
+               return cb;
+       }
+
+       private void invokeMethodRefs(String method, Component c, Bundle 
bundle) {
+               m_refs.computeIfPresent(method, (k, mrefs) -> {
+                       mrefs.forEach(mref -> mref.accept(null, c, bundle));
+                       return mrefs;
+               });
+       }
+       
+       private void requiresNoStringCallbacks() {
+               if (m_added != null || m_changed != null || m_removed != null) {
+                       throw new IllegalStateException("can't mix method 
references and string callbacks.");
+               }
+       }
        
 }

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=1720825&r1=1720824&r2=1720825&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
 Fri Dec 18 16:58:58 2015
@@ -16,6 +16,7 @@ import java.util.stream.Stream;
 import org.apache.felix.dm.Component;
 import org.apache.felix.dm.Dependency;
 import org.apache.felix.dm.DependencyManager;
+import org.apache.felix.dm.builder.lambda.BundleDependencyBuilder;
 import org.apache.felix.dm.builder.lambda.ComponentBuilder;
 import org.apache.felix.dm.builder.lambda.ConfigurationDependencyBuilder;
 import org.apache.felix.dm.builder.lambda.DependencyBuilder;
@@ -147,6 +148,14 @@ public class ComponentBuilderImpl implem
         consumer.accept(dep);
         m_dependencyBuilders.add(dep);
         return this;
+    }
+    
+    @Override
+    public ComponentBuilderImpl withBundle(Consumer<BundleDependencyBuilder> 
consumer) {
+       BundleDependencyBuilder dep = new 
BundleDependencyBuilderImpl(m_component);
+        consumer.accept(dep);
+        m_dependencyBuilders.add(dep);
+        return this;
     }
        
     public <U> ComponentBuilderImpl withFuture(CompletableFuture<U> future, 
Consumer<FutureDependencyBuilder<U>> consumer) {

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ExtendedComponentBase.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/ExtendedComponentBase.java?rev=1720825&r1=1720824&r2=1720825&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ExtendedComponentBase.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ExtendedComponentBase.java
 Fri Dec 18 16:58:58 2015
@@ -6,6 +6,7 @@ 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.ComponentBuilder;
 import org.apache.felix.dm.builder.lambda.ConfigurationDependencyBuilder;
 import org.apache.felix.dm.builder.lambda.Functions;
@@ -94,6 +95,11 @@ public abstract class ExtendedComponentB
         return (B) this;
     }
     
+    public B withBundle(Consumer<BundleDependencyBuilder> consumer) {
+        m_compBuilder = m_compBuilder.andThen(compBuilder -> 
compBuilder.withBundle(consumer));
+        return (B) this;
+    }
+    
     public <U> B withFuture(CompletableFuture<U> future, 
Consumer<FutureDependencyBuilder<U>> consumer) {
         m_compBuilder = m_compBuilder.andThen(compBuilder -> 
compBuilder.withFuture(future, consumer));
         return (B) this;


Reply via email to