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