You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by pd...@apache.org on 2018/10/17 14:04:40 UTC

svn commit: r1844108 - in /felix/trunk/dependencymanager: ./ .gradle-wrapper/ org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ org.apache.fel...

Author: pderop
Date: Wed Oct 17 14:04:40 2018
New Revision: 1844108

URL: http://svn.apache.org/viewvc?rev=1844108&view=rev
Log:
FELIX-5967: DM does not support java9+

Added:
    felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/DynamicScopedServiceTest.java
Modified:
    felix/trunk/dependencymanager/.gradle-wrapper/gradle-wrapper.properties
    felix/trunk/dependencymanager/changelog.txt
    felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithModifiedInstanceBoundDependencyTest.java
    felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithPropagationTest.java
    felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithoutPropagationTest.java
    felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectBaseTest.java
    felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectWithPropagationTest.java
    felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FELIX5406_FluentPropertyWithDotTest.java
    felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependenciesTest.java
    felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependencyTest.java
    felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/TestBase.java
    felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ComponentBuilder.java
    felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/FluentProperty.java
    felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/Configurable.java
    felix/trunk/dependencymanager/release/README.release
    felix/trunk/dependencymanager/release/build.gradle
    felix/trunk/dependencymanager/release/resources/src/README.src

Modified: felix/trunk/dependencymanager/.gradle-wrapper/gradle-wrapper.properties
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/.gradle-wrapper/gradle-wrapper.properties?rev=1844108&r1=1844107&r2=1844108&view=diff
==============================================================================
--- felix/trunk/dependencymanager/.gradle-wrapper/gradle-wrapper.properties (original)
+++ felix/trunk/dependencymanager/.gradle-wrapper/gradle-wrapper.properties Wed Oct 17 14:04:40 2018
@@ -20,4 +20,4 @@ distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-bin.zip

Modified: felix/trunk/dependencymanager/changelog.txt
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/changelog.txt?rev=1844108&r1=1844107&r2=1844108&view=diff
==============================================================================
--- felix/trunk/dependencymanager/changelog.txt (original)
+++ felix/trunk/dependencymanager/changelog.txt Wed Oct 17 14:04:40 2018
@@ -1,4 +1,4 @@
-Release Notes - Felix - Version org.apache.felix.dependencymanager-r12
+Release Notes - Felix - Version org.apache.felix.dependencymanager-r13
 ======================================================================
 
 ** List of bundles being part of the release:
@@ -21,6 +21,7 @@ Release Notes - Felix - Version org.apac
 
 
 ** Improvement
+    * [FELIX-5967] - DM does not support java9+
     * [FELIX-5937] - Refactor DM bndtools/gradle project
     * [FELIX-5939] - DM annotations enhancements
     * [FELIX-5941] - DM APi enhancements

Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithModifiedInstanceBoundDependencyTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithModifiedInstanceBoundDependencyTest.java?rev=1844108&r1=1844107&r2=1844108&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithModifiedInstanceBoundDependencyTest.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithModifiedInstanceBoundDependencyTest.java Wed Oct 17 14:04:40 2018
@@ -115,7 +115,7 @@ public class AdapterWithModifiedInstance
         DependencyManager m = getDM();
         Ensure e = new Ensure();
 
-        Component a = component(m).impl(new AImpl(e)).provides(A.class).properties(foo -> "bar").build();
+        Component a = component(m).impl(new AImpl(e)).provides(A.class).properties("foo", "bar").build();
         Component b = adapter(m, A.class).provides(B.class).impl(new BImpl(e)).add("addA").change("changeA").remove("removeA").build();
         Component c = component(m).impl(new CImpl()).provides(C.class).withSvc(A.class, "(foo=bar)", true).build();
                       
@@ -143,7 +143,7 @@ public class AdapterWithModifiedInstance
         DependencyManager m = getDM();
         Ensure e = new Ensure();
 
-        Component a = component(m).impl(new AImpl(e)).provides(A.class).properties(foo -> "bar").build();        
+        Component a = component(m).impl(new AImpl(e)).provides(A.class).properties("foo", "bar").build();        
         Component b = adapter(m, A.class).impl(new BImpl(e)).provides(B.class).add(BImpl::addA).change(BImpl::changeA).remove(BImpl::removeA).build();        
         Component c = component(m).impl(new CImpl()).provides(C.class).withSvc(A.class, s -> s.filter("(foo=bar)")).build();
                       

Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithPropagationTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithPropagationTest.java?rev=1844108&r1=1844107&r2=1844108&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithPropagationTest.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithPropagationTest.java Wed Oct 17 14:04:40 2018
@@ -101,8 +101,8 @@ public class AdapterWithPropagationTest
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure(); 
         
-        Component s1 = component(m).impl(new S1Impl(e)).provides(S1.class).properties(p1 -> "v1", p2 -> "v2overriden").build();
-        Component s1Adapter = adapter(m, S1.class).add("add").change("change").impl(new S1Adapter(e)).provides(S2.class).properties(p2 -> "v2").build();   
+        Component s1 = component(m).impl(new S1Impl(e)).provides(S1.class).properties("p1", "v1", "p2", "v2overriden").build();
+        Component s1Adapter = adapter(m, S1.class).add("add").change("change").impl(new S1Adapter(e)).provides(S2.class).properties("p2", "v2").build();   
         Component s3 = component(m).impl(new S3(e)).withSvc(S2.class, s -> s.add("add").change("change")).build();
                                           
         m.add(s1);

Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithoutPropagationTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithoutPropagationTest.java?rev=1844108&r1=1844107&r2=1844108&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithoutPropagationTest.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithoutPropagationTest.java Wed Oct 17 14:04:40 2018
@@ -41,7 +41,7 @@ public class AdapterWithoutPropagationTe
 
         // The provider has a "foo=bar" property
         ServiceProvider serviceProvider = new ServiceProvider(e);
-        Component provider = component(m).provides(OriginalService.class).properties(foo -> "bar").impl(serviceProvider).build();
+        Component provider = component(m).provides(OriginalService.class).properties("foo", "bar").impl(serviceProvider).build();
 
         // The Adapter will see the "foo=bar" property from the adaptee
         Component adapter = adapter(m, OriginalService.class)
@@ -76,7 +76,7 @@ public class AdapterWithoutPropagationTe
 
         // The provider has a "foo=bar" property
         ServiceProvider serviceProvider = new ServiceProvider(e);
-        Component provider = component(m).provides(OriginalService.class).properties(foo -> "bar").impl(serviceProvider).build();
+        Component provider = component(m).provides(OriginalService.class).properties("foo", "bar").impl(serviceProvider).build();
 
         // The Adapter will see the "foo=bar" property from the adaptee
         ServiceAdapter saimpl = new ServiceAdapter(e);

Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectBaseTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectBaseTest.java?rev=1844108&r1=1844107&r2=1844108&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectBaseTest.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectBaseTest.java Wed Oct 17 14:04:40 2018
@@ -44,7 +44,7 @@ public class AspectBaseTest extends Test
         ServiceProvider p = new ServiceProvider("a");
         ServiceConsumer c = new ServiceConsumer(e);
         
-        Component sp = component(m).impl(p).provides(ServiceInterface.class).properties(name -> "a").build();
+        Component sp = component(m).impl(p).provides(ServiceInterface.class).properties("name", "a").build();
         Component sc = component(m).impl(c).withSvc(ServiceInterface.class, srv -> srv.add("add").remove("remove").autoConfig("m_service")).build();
         Component sa = aspect(m, ServiceInterface.class).rank(20).impl(ServiceAspect.class).build();
             
@@ -79,7 +79,7 @@ public class AspectBaseTest extends Test
         ServiceProvider p = new ServiceProvider("a");
         ServiceConsumer c = new ServiceConsumer(e);
         
-        Component sp = component(m).impl(p).provides(ServiceInterface.class).properties(name -> "a").build();        
+        Component sp = component(m).impl(p).provides(ServiceInterface.class).properties("name", "a").build();        
         Component sc = component(m)
             .impl(c).withSvc(ServiceInterface.class, srv -> srv.add(c::addRef).remove(c::removeRef).autoConfig("m_service")).build();
         Component sa = aspect(m, ServiceInterface.class).rank(20).impl(ServiceAspect.class).build();
@@ -114,7 +114,7 @@ public class AspectBaseTest extends Test
         // create a service provider and consumer
         ServiceProvider p = new ServiceProvider("a");
         ServiceConsumer c = new ServiceConsumer(e);
-        Component sp = component(m).impl(p).provides(ServiceInterface.class).properties(name -> "a").build();            
+        Component sp = component(m).impl(p).provides(ServiceInterface.class).properties("name", "a").build();            
         Component sc = component(m).impl(c).withSvc(ServiceInterface.class, srv -> srv.add("add").remove("remove").autoConfig("m_service")).build();
         Component sa = aspect(m, ServiceInterface.class).rank(20).impl(ServiceAspect.class).build();
 
@@ -156,7 +156,7 @@ public class AspectBaseTest extends Test
         ServiceProvider p = new ServiceProvider("a");
         ServiceConsumer c = new ServiceConsumer(e);
         
-        Component sp = component(m).impl(p).provides(ServiceInterface.class).properties(name -> "a").build();
+        Component sp = component(m).impl(p).provides(ServiceInterface.class).properties("name", "a").build();
         Component sc = component(m).impl(c).withSvc(ServiceInterface.class, srv -> srv.add(c::addRef).remove(c::removeRef).autoConfig("m_service")).build();
         Component sa = aspect(m, ServiceInterface.class).rank(20).impl(ServiceAspect.class).build();
 
@@ -196,8 +196,8 @@ public class AspectBaseTest extends Test
         
         // create service providers and consumers
         ServiceConsumer c = new ServiceConsumer(e);
-        Component sp = component(m).impl(new ServiceProvider("a")).provides(ServiceInterface.class).properties(name -> "a").build();
-        Component sp2 = component(m).impl(new ServiceProvider("b")).provides(ServiceInterface.class).properties(name -> "b").build();
+        Component sp = component(m).impl(new ServiceProvider("a")).provides(ServiceInterface.class).properties("name", "a").build();
+        Component sp2 = component(m).impl(new ServiceProvider("b")).provides(ServiceInterface.class).properties("name", "b").build();
         Component sc = component(m).impl(c).withSvc(ServiceInterface.class, srv -> srv.add("add").remove("remove")).build();
 
         Component sa = aspect(m, ServiceInterface.class).rank(20).impl(ServiceAspect.class).build();
@@ -238,8 +238,8 @@ public class AspectBaseTest extends Test
         
         // create service providers and consumers
         ServiceConsumer c = new ServiceConsumer(e);
-        Component sp = component(m).impl(new ServiceProvider("a")).provides(ServiceInterface.class).properties(name -> "a").build();
-        Component sp2 = component(m).impl(new ServiceProvider("b")).provides(ServiceInterface.class).properties(name -> "b").build();
+        Component sp = component(m).impl(new ServiceProvider("a")).provides(ServiceInterface.class).properties("name", "a").build();
+        Component sp2 = component(m).impl(new ServiceProvider("b")).provides(ServiceInterface.class).properties("name", "b").build();
         Component sc = component(m).impl(c).withSvc(ServiceInterface.class, srv -> srv.add(c::addRef).remove(c::removeRef)).build();
 
         Component sa = aspect(m, ServiceInterface.class).rank(20).impl(ServiceAspect.class).build();

Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectWithPropagationTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectWithPropagationTest.java?rev=1844108&r1=1844107&r2=1844108&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectWithPropagationTest.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectWithPropagationTest.java Wed Oct 17 14:04:40 2018
@@ -69,7 +69,7 @@ public class AspectWithPropagationTest e
 			public void invoke() {
 			}
         };
-		Component sComp = component(m).impl(s).provides(S.class, p -> "s").build();
+		Component sComp = component(m).impl(s).provides(S.class, "p", "s").build();
 
         // Create SA (aspect of S)
         S sa = new S() {
@@ -77,7 +77,7 @@ public class AspectWithPropagationTest e
 			public void invoke() {
 			}
         };
-        Component saComp = aspect(m, S.class).rank(1).impl(sa).properties(p -> "aspect").build();
+        Component saComp = aspect(m, S.class).rank(1).impl(sa).properties("p", "aspect").build();
                 
         // Create client depending on S
         Object client = new Object() {

Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/DynamicScopedServiceTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/DynamicScopedServiceTest.java?rev=1844108&view=auto
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/DynamicScopedServiceTest.java (added)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/DynamicScopedServiceTest.java Wed Oct 17 14:04:40 2018
@@ -0,0 +1,227 @@
+/*
+ * 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.lambda.itest;
+
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.Component.ServiceScope;
+import org.apache.felix.dm.DependencyManager;
+import org.junit.Assert;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceRegistration;
+import static org.apache.felix.dm.lambda.DependencyManagerActivator.component;
+
+/**
+ * Validates a simple scoped service, which adds a dynamic dependency from init method.
+ * Notice the the prototype will add a dynamic dependency from its init method, and the dependency service
+ * properties will be propagated.
+ */
+public class DynamicScopedServiceTest extends TestBase {
+	static Ensure m_e;
+	static Ensure.Steps m_serviceImplInitSteps;
+	static Ensure.Steps m_serviceImplStartSteps;
+	static Ensure.Steps m_serviceImplStopSteps;
+	static Ensure.Steps m_serviceConsumerBindSteps;
+	static Ensure.Steps m_serviceConsumerUnbindSteps;
+    		
+    public void setUp() throws Exception {
+    	super.setUp();
+    	m_e = new Ensure();
+    	m_serviceImplInitSteps = new Ensure.Steps(1, 2, 5, 12, 13);
+    	m_serviceImplStartSteps = new Ensure.Steps(3, 6, 14);
+    	m_serviceImplStopSteps = new Ensure.Steps(9, 11, 17);
+    	m_serviceConsumerBindSteps = new Ensure.Steps(4, 7, 15);
+    	m_serviceConsumerUnbindSteps = new Ensure.Steps(8, 10, 16);
+    }
+    
+    public void testPrototypeComponentWithFactory() {
+    	testPrototypeComponent(true);
+    }
+    
+    public void testPrototypeComponentWithoutFactory() {
+    	testPrototypeComponent(false);
+    }
+    
+    private void testPrototypeComponent(boolean useFactory) {
+        DependencyManager m = getDM();     
+        
+        Component provider = null;
+        
+        if (useFactory) {
+        	provider = component(m)
+        			.factory(this, "createServiceImpl")
+        			.scope(ServiceScope.PROTOTYPE)
+        			.provides(Service.class)
+        			.withSvc(Service3.class, svc -> svc.optional().autoConfig("m_service3"))
+        			.build();
+
+        } else {
+        	provider = component(m)
+        			.impl(ServiceImplWithConstructor.class)
+        			.scope(ServiceScope.PROTOTYPE)
+        			.provides(Service.class)
+        			.withSvc(Service3.class, svc -> svc.optional().autoConfig("m_service3"))
+        			.build();
+        }
+                
+        Properties props = new Properties();
+        props.put("foo", "bar");
+        Component service2 = component(m)
+        	.provides(Service2.class.getName(), props)
+        	.impl(new Service2() {})
+        	.build();
+        
+        Component service3 = component(m)
+            	.provides(Service3.class.getName())
+            	.impl(new Service3() {})
+            	.build();
+        
+        Component consumer1 = component(m)
+            .impl(new ServiceConsumer())
+            .withSvc(Service.class, svc -> svc.required().add("bind").remove("unbind"))
+            .build();
+        
+        Component<?> consumer2 = component(m)
+            .impl(new ServiceConsumer())
+            .withSvc(Service.class, svc -> svc.required().add("bind").remove("unbind"))
+            .build();
+                
+        m.add(service3); // add service3 (the provider has an optional callback on it)
+        m.add(provider); // add provider
+        m.add(service2); // add service2 (the prototype depends on it)
+        m.add(consumer1); // add first consumer
+        m_e.waitForStep(1, 5000); // Service prototype instance called in init
+        m_e.waitForStep(2, 5000); // first clone called in init
+        m_e.waitForStep(3, 5000); // first clone called in init
+        m_e.waitForStep(4, 5000); // first consumer bound to first clone
+
+        m.add(consumer2); // add second consumer
+        m_e.waitForStep(5, 5000); // second clone called in init
+        m_e.waitForStep(6, 5000); // second clone called in start
+        m_e.waitForStep(7, 5000); // second consumer bound to second clone
+
+        // make sure both consumers have a different provider instances.
+        ServiceConsumer consumer1Impl = consumer1.getInstance();
+        Assert.assertNotNull(consumer1Impl.getService());
+        ServiceConsumer consumer2Impl = consumer2.getInstance();
+        Assert.assertNotNull(consumer2Impl.getService());
+        Assert.assertNotEquals(consumer1Impl.getService(), consumer2Impl.getService());
+        
+        m.remove(consumer1); // remove consumer1
+        m_e.waitForStep(8, 5000); // consumer1 unbound from first clone
+        m_e.waitForStep(9, 5000); // first clone stopped
+        
+        m.remove(provider); // unregister the provider
+        m_e.waitForStep(10, 5000); // consumer2 unbound from second clone
+        m_e.waitForStep(11, 5000); // second clone stopped
+        
+        m.add(provider); // re-register the provider
+        m_e.waitForStep(12, 5000); // prototype init called
+        m_e.waitForStep(13, 5000); // third clone init method called (because consumer2 is active)  
+        m_e.waitForStep(14, 5000); // third clone start method called
+        m_e.waitForStep(15, 5000); // consumer2 bound to third clone
+        
+        m.remove(service2); // remove the service2 (it will destroy the clone)
+        m_e.waitForStep(16, 5000); // consumer2 unbound
+        m_e.waitForStep(17, 5000); // third clone stopped
+        
+        m.remove(provider);    
+        m.remove(service3);
+        m.clear();
+    }
+    
+    @SuppressWarnings("unused")
+    private ServiceImpl createServiceImpl() { 
+    	return new ServiceImpl();
+    }
+
+    public interface Service { 
+    }
+    
+    public interface Service2 { 
+    }
+    
+    public interface Service3 { 
+    }
+        
+    public static class ServiceImpl implements Service {
+        volatile Bundle m_bundle; // bundle requesting the service, injected by reflection or from constructor
+        volatile ServiceRegistration m_registration; // registration of the requested service, injected by reflection or from constructor
+		volatile Service2 m_service2;
+		private Service3 m_service3;
+        		
+		void init(Component c) { // only called on prototype instance, not on clones
+			component(c, comp ->
+			 	comp.withSvc(Service2.class, svc -> svc.required().add("bind").propagate()));
+			m_e.steps(m_serviceImplInitSteps); // 1, 2, 5, 12, 13
+		}
+		
+        void bind(Service2 service2, Map<String, Object> properties) {
+        	// check if prototype service properties has propagated the Service2 dependency service properties
+        	Assert.assertEquals("bar", properties.get("foo"));
+        	m_service2 = service2;
+        }
+
+        void start() {
+        	Assert.assertNotNull(m_bundle);
+        	Assert.assertNotNull(m_registration);
+        	Assert.assertNotNull(m_service2);
+        	Assert.assertNotNull(m_service3);
+        	m_e.steps(m_serviceImplStartSteps); // 3, 6, 14
+        }
+        
+        Service3 getService3() {
+        	return m_service3;
+        }
+        
+        void stop() {
+        	m_e.steps(m_serviceImplStopSteps); // 9, 11, 17
+        }
+    }
+    
+    public static class ServiceImplWithConstructor extends ServiceImpl {        
+		/**
+		 * Inject requesting bundle and service registration using class constructor, NOT using field reflection
+		 */
+		public ServiceImplWithConstructor(Bundle b, ServiceRegistration reg) {
+			m_bundle = b;
+			m_registration = reg;
+		}
+    }
+    
+    public class ServiceConsumer {
+        volatile Service m_myService;
+
+        public void bind(Service service) {
+            m_myService = service;
+        	m_e.steps(m_serviceConsumerBindSteps); // 4, 7, 15
+        }
+        
+        public void unbind(Service service) {
+        	Assert.assertEquals(m_myService, service);
+        	m_e.steps(m_serviceConsumerUnbindSteps); // 8, 10, 16
+        }
+        
+        public Service getService() {
+            return m_myService;
+        }
+    }
+}

Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FELIX5406_FluentPropertyWithDotTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FELIX5406_FluentPropertyWithDotTest.java?rev=1844108&r1=1844107&r2=1844108&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FELIX5406_FluentPropertyWithDotTest.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FELIX5406_FluentPropertyWithDotTest.java Wed Oct 17 14:04:40 2018
@@ -32,6 +32,7 @@ public class FELIX5406_FluentPropertyWit
     private final Ensure m_ensure = new Ensure();
 
 	public void testFluentServiceProperty() {
+		if (! isJava8()) return;
         final DependencyManager dm = getDM();
         
         component(dm, comp -> comp.factory(ProviderImpl::new).provides(Provider.class, foo -> "bar"));
@@ -42,6 +43,7 @@ public class FELIX5406_FluentPropertyWit
 	}
 	
 	public void testFluentServicePropertyWithDot() {
+		if (! isJava8()) return;
         final DependencyManager dm = getDM();
         
         component(dm, comp -> comp.factory(ProviderImpl::new).provides(Provider.class, foo_bar -> "zoo"));
@@ -52,6 +54,7 @@ public class FELIX5406_FluentPropertyWit
 	}
 	
 	public void testFluentServicePropertyWithUnderscore() {
+		if (! isJava8()) return;
         final DependencyManager dm = getDM();
         
         component(dm, comp -> comp.factory(ProviderImpl::new).provides(Provider.class, foo__bar -> "zoo"));

Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependenciesTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependenciesTest.java?rev=1844108&r1=1844107&r2=1844108&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependenciesTest.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependenciesTest.java Wed Oct 17 14:04:40 2018
@@ -40,8 +40,8 @@ public class MultipleExtraDependenciesTe
          Component c1 = component(m).provides(Service1.class).impl(new MyComponent1(e)).withSvc(Service2.class, srv->srv.autoConfig("m_service2")).build();
          Component c2 = component(m).impl(new MyComponent2(e)).withSvc(Service1.class, srv->srv.required(false).autoConfig(false).add("added")).build();
          Component c3 = component(m).provides(Service2.class).impl(Service2Impl.class).build();
-         Component c4 = component(m).impl(Service3Impl1.class).provides(Service3.class, type -> "xx").build();
-         Component c5 = component(m).impl(Service3Impl2.class).provides(Service3.class, type -> "yy").build();
+         Component c4 = component(m).impl(Service3Impl1.class).provides(Service3.class, "type", "xx").build();
+         Component c5 = component(m).impl(Service3Impl2.class).provides(Service3.class, "type", "yy").build();
 
          System.out.println("\n+++ Adding c2 / MyComponent2");
          m.add(c2);
@@ -74,8 +74,8 @@ public class MultipleExtraDependenciesTe
         Component c1 = component(m).provides(Service1.class).impl(new MyComponent1(e)).withSvc(Service2.class, srv->srv.autoConfig("m_service2")).build();
         Component c2 = component(m).impl(new MyComponent2(e)).withSvc(Service1.class, srv->srv.required(false).autoConfig(false).add("added")).build();
         Component c3 = component(m).provides(Service2.class).impl(Service2Impl.class).build();
-        Component c4 = component(m).impl(Service3Impl1.class).provides(Service3.class, type -> "xx").build();
-        Component c5 = component(m).impl(Service3Impl2.class).provides(Service3.class, type -> "yy").build();
+        Component c4 = component(m).impl(Service3Impl1.class).provides(Service3.class, "type", "xx").build();
+        Component c5 = component(m).impl(Service3Impl2.class).provides(Service3.class, "type", "yy").build();
 
         System.out.println("\n+++ Adding c2 / MyComponent2");
         m.add(c2);

Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependencyTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependencyTest.java?rev=1844108&r1=1844107&r2=1844108&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependencyTest.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependencyTest.java Wed Oct 17 14:04:40 2018
@@ -43,7 +43,7 @@ public class MultipleExtraDependencyTest
 
         Component sp = component(m)
               .impl(ServiceProvider.class)
-              .provides(ServiceInterface.class, foo -> "bar")
+              .provides(ServiceInterface.class, "foo", "bar")
               .start("start").stop("stop")
               .withSvc(Sequencer.class, srv->srv.autoConfig("m_sequencer"))
               .withSvc(ServiceProvider2.class, srv->srv.add("bind").remove("unbind"))

Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/TestBase.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/TestBase.java?rev=1844108&r1=1844107&r2=1844108&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/TestBase.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/TestBase.java Wed Oct 17 14:04:40 2018
@@ -117,6 +117,10 @@ public abstract class TestBase extends T
     	}
         Assert.assertFalse(errorsLogged());
     }
+    
+    protected boolean isJava8() {
+    	return System.getProperty("java.version", "1.8").startsWith("1.8");
+    }
         
     protected DependencyManager getDM() {
         return m_dm;

Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ComponentBuilder.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ComponentBuilder.java?rev=1844108&r1=1844107&r2=1844108&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ComponentBuilder.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ComponentBuilder.java Wed Oct 17 14:04:40 2018
@@ -183,6 +183,7 @@ public interface ComponentBuilder<B exte
 	 * @param properties a list of fluent service properties for the provided service. You can specify a list of lambda expression, each one implementing the
 	 * {@link FluentProperty} interface that allows to define a property name using a lambda parameter.
      * @return this builder.
+     * @deprecated Fluent properties are only supported using java8 and this method will be removed in next DM release
 	 */
 	B provides(Class<?>  iface, FluentProperty ... properties);
 	
@@ -226,6 +227,7 @@ public interface ComponentBuilder<B exte
      * @param properties a list of fluent service properties for the provided service. You can specify a list of lambda expression, each one implementing the
      * {@link FluentProperty} interface that allows to define a property name using a lambda parameter.
      * @return this builder.
+     * @deprecated Fluent properties are only supported using java8 and this method will be removed in next DM release
      */
     B provides(Class<?>[] ifaces, FluentProperty ... properties);
     
@@ -270,6 +272,7 @@ public interface ComponentBuilder<B exte
      * @param properties a list of fluent service properties for the provided service. You can specify a list of lambda expression, each one implementing the
      * {@link FluentProperty} interface that allows to define a property name using a lambda parameter.
      * @return this builder.
+     * @deprecated Fluent properties are only supported using java8 and this method will be removed in next DM release
      */
     B provides(String iface, FluentProperty ... properties);
     
@@ -313,6 +316,7 @@ public interface ComponentBuilder<B exte
      * @param properties a list of fluent service properties for the provided service. You can specify a list of lambda expression, each one implementing the
      * {@link FluentProperty} interface that allows to define a property name using a lambda parameter.
      * @return this builder.
+     * @deprecated Fluent properties are only supported using java8 and this method will be removed in next DM release
      */
     B provides(String[] ifaces, FluentProperty ... properties);
     
@@ -360,6 +364,7 @@ public interface ComponentBuilder<B exte
      * 
      * @param properties the fluent properties
      * @return this builder
+     * @deprecated Fluent properties are only supported using java8 and this method will be removed in next DM release
      */
     B properties(FluentProperty ... properties);  
 

Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/FluentProperty.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/FluentProperty.java?rev=1844108&r1=1844107&r2=1844108&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/FluentProperty.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/FluentProperty.java Wed Oct 17 14:04:40 2018
@@ -55,6 +55,9 @@ import org.apache.felix.dm.lambda.callba
  * <pre>{@code
  * Windows -> Preference -> Compiler -> Classfile Generation -> Store information about method parameters.
  * }</pre>
+ * 
+ * <br>WARNING: this is interface is deprecated, it is only supported when using java8, not on java9+, and we will remove it in next DM release
+ * @deprecated this interface is only supported with java8 and will be removed in next dm release
  */
 @FunctionalInterface
 public interface FluentProperty extends SerializableLambda {

Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/Configurable.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/Configurable.java?rev=1844108&r1=1844107&r2=1844108&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/Configurable.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/Configurable.java Wed Oct 17 14:04:40 2018
@@ -20,6 +20,7 @@ package org.apache.felix.dm.impl;
 
 import java.lang.annotation.Annotation;
 import java.lang.invoke.MethodHandles;
+import java.lang.invoke.MethodType;
 import java.lang.reflect.Array;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
@@ -361,16 +362,27 @@ public final class Configurable {
         		// the config type is an annotation: simply invoke the default value
         		def = method.getDefaultValue();
         	} else if (method.isDefault()) {
-        		// The config type is a java8 interface with a default method, invoke it.
-        		// But it's challenging to invoke a default method from a dynamic proxy ... we have to use the MethodHandles.
-        		// see https://zeroturnaround.com/rebellabs/recognize-and-conquer-java-proxies-default-methods-and-method-handles
+        		if (System.getProperty("java.version", "1.8").startsWith("1.8")) {
+        			// The config type is a java8 interface with a default method, invoke it.
+        			// But it's challenging to invoke a default method from a dynamic proxy ... we have to use the MethodHandles.
+        			// see https://zeroturnaround.com/rebellabs/recognize-and-conquer-java-proxies-default-methods-and-method-handles
         		
-                Constructor<MethodHandles.Lookup> constructor = MethodHandles.Lookup.class.getDeclaredConstructor(Class.class, int.class);
-                constructor.setAccessible(true);
-                def = constructor.newInstance(methodClass, MethodHandles.Lookup.PRIVATE)
-                		.unreflectSpecial(method, methodClass)
-                		.bindTo(proxy)
-                		.invokeWithArguments(args);
+        			Constructor<MethodHandles.Lookup> constructor = MethodHandles.Lookup.class.getDeclaredConstructor(Class.class, int.class);
+        			constructor.setAccessible(true);
+        			def = constructor.newInstance(methodClass, MethodHandles.Lookup.PRIVATE)
+        					.unreflectSpecial(method, methodClass)
+        					.bindTo(proxy)
+        					.invokeWithArguments(args);
+        		} else {
+        			// see https://dzone.com/articles/correct-reflective-access-to-interface-default-methods
+        			def = MethodHandles.lookup()
+        					.findSpecial(methodClass,         							
+        								 method.getName(),  
+        								 MethodType.methodType(method.getReturnType(), method.getParameterTypes()),  
+        								 methodClass)
+        					.bindTo(proxy)
+        					.invokeWithArguments();
+        		}
         	}
             return convert(method.getGenericReturnType(), key, def, true /* useImplicitDefault */);
         }

Modified: felix/trunk/dependencymanager/release/README.release
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/release/README.release?rev=1844108&r1=1844107&r2=1844108&view=diff
==============================================================================
--- felix/trunk/dependencymanager/release/README.release (original)
+++ felix/trunk/dependencymanager/release/README.release Wed Oct 17 14:04:40 2018
@@ -70,7 +70,7 @@ $ ./gradlew signStaging --no-daemon
 You can upload the archives and the signatures to our development area, which we use to stage this release candidate. This development area can be found at 
 https://dist.apache.org/repos/dist/dev/felix and adding files to it can be done using "svnpubsub" which is taken care of by the following target:
 
-$ ./gradlew commitToStaging
+$ ./gradlew commitToStaging --no-daemon
 
 Voting on the release
 =====================
@@ -116,12 +116,12 @@ Promoting the release:
 Move the artifacts from the development area to the final release location at 
 https://dist.apache.org/repos/dist/release/felix by invoking the following target:
 
-$ ./gradlew promoteToRelease
+$ ./gradlew promoteToRelease --no-daemon
 
 Cancelling the release
 ======================
 
-$ ./gradlew deleteFromStaging
+$ ./gradlew deleteFromStaging --no-daemon
 
 
 [1] http://www.apache.org/dev/release.html

Modified: felix/trunk/dependencymanager/release/build.gradle
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/release/build.gradle?rev=1844108&r1=1844107&r2=1844108&view=diff
==============================================================================
--- felix/trunk/dependencymanager/release/build.gradle (original)
+++ felix/trunk/dependencymanager/release/build.gradle Wed Oct 17 14:04:40 2018
@@ -33,7 +33,7 @@ buildscript {
 }
 
 // Our release number, which has to be monotonically incremented each time we make a new release.
-ext.dmRelease = "r12"
+ext.dmRelease = "r13"
 
 // Our Apache svn Staging repo
 ext.svnStagingPath = "https://dist.apache.org/repos/dist/dev/felix"

Modified: felix/trunk/dependencymanager/release/resources/src/README.src
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/release/resources/src/README.src?rev=1844108&r1=1844107&r2=1844108&view=diff
==============================================================================
--- felix/trunk/dependencymanager/release/resources/src/README.src (original)
+++ felix/trunk/dependencymanager/release/resources/src/README.src Wed Oct 17 14:04:40 2018
@@ -39,19 +39,19 @@ Building and testing Apache Felix Depend
 
 - Compile Dependendency Manager annotations bndtools plugin:
   
-$ ./gradlew org.apache.felix.dependencymanager.annotation:jar
+$ ./gradlew --no-daemon org.apache.felix.dependencymanager.annotation:jar
 
 - Compile all other bundles:
  
-$ ./gradlew jar
+$ ./gradlew --no-daemon jar
 
 - run junit tests:
 
-$ ./gradlew test
+$ ./gradlew --no-daemon test
 
 - run integration tests:
 
-$ ./gradlew check
+$ ./gradlew --no-daemon check
 
 ** Compilation Using Eclipse:
 
@@ -60,7 +60,7 @@ $ ./gradlew check
 * go to Windows -> Preferences -> Java -> Installed JREs
 * Then add a java8 JRE of your choice.
 
-- Install BndTools 3.4.0
+- Install BndTools 3.5.0 (or latest)
 
 - Open BndTools perspective