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
 


Reply via email to