Author: pderop
Date: Thu Jan 14 23:51:12 2016
New Revision: 1724712
URL: http://svn.apache.org/viewvc?rev=1724712&view=rev
Log:
reworked callbacks in FactoryPidAdapterBuilder, ConfigurationDependencyBuilder.
Added support for composition in ComponentBuilder.
Added more tests.
Added:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AutoConfigTest.java
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/CompositionTest.java
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/DynamicProxyAspectTest.java
Modified:
felix/sandbox/pderop/dependencymanager-lambda/TODO
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AdapterNoAutoConfigIfInstanceCallbackIsUsed.java
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AdapterWithCallbackInstanceTest.java
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/compositefactory/Activator.java
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/dictionary/Activator.java
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/rx/completable/SiteInfoImpl.java
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleDependencyBuilder.java
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ComponentBuilderBase.java
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ConfigurationDependencyBuilder.java
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/FactoryPidAdapterBuilder.java
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/FutureDependencyBuilder.java
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceCallbacksBuilder.java
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceDependencyBuilder.java
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/AdapterBase.java
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleDependencyBuilderImpl.java
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/CompletableFutureDependencyImpl.java
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ComponentBuilderImpl.java
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ConfigurationDependencyBuilderImpl.java
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/FactoryPidAdapterBuilderImpl.java
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceDependencyBuilderImpl.java
Modified: felix/sandbox/pderop/dependencymanager-lambda/TODO
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/TODO?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-lambda/TODO (original)
+++ felix/sandbox/pderop/dependencymanager-lambda/TODO Thu Jan 14 23:51:12 2016
@@ -1,7 +1,10 @@
-- in ServiceDependencyBuilder:
+- add factories methods in ComponentImpl that take object/string params (like
in original DM API)
+ and update DynamicProxyAspectTest.java
- * add support for method references in the "propagateTo" method
- * add a withService method that takes a string (class name)
+- when a component instance method ref is not found, log an error.
+
+- ConfigurationDependency:
+ * allow to set "needsInstance" flag
- Finish to adapt all DependencyManager integration tests
@@ -9,7 +12,7 @@
- Javadocs
-- rework callbacks for ComponentBuilder, ConfigurationDependencyBuilder,
BundleDepnendencyBuilder
+- rework callbacks for ComponentBuilder
Modified:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AdapterNoAutoConfigIfInstanceCallbackIsUsed.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AdapterNoAutoConfigIfInstanceCallbackIsUsed.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
---
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AdapterNoAutoConfigIfInstanceCallbackIsUsed.java
(original)
+++
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AdapterNoAutoConfigIfInstanceCallbackIsUsed.java
Thu Jan 14 23:51:12 2016
@@ -41,7 +41,7 @@ public class AdapterNoAutoConfigIfInstan
// Declare S1 adapter
S1AdapterCallback s1AdapterCB = new S1AdapterCallback();
- adapter(m, S1.class, a ->
a.impl(S1Adapter.class).cb("set").cbInst(s1AdapterCB));
+ adapter(m, S1.class, a -> a.impl(S1Adapter.class).cb(s1AdapterCB,
"set"));
// At this point, the s1AdapterCB.set(S1 s1) method should be called,
and s1Adapter.start() method should then be called.
// but s1 should not be injected on s1Adapter class fields.
Modified:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AdapterWithCallbackInstanceTest.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AdapterWithCallbackInstanceTest.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
---
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AdapterWithCallbackInstanceTest.java
(original)
+++
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AdapterWithCallbackInstanceTest.java
Thu Jan 14 23:51:12 2016
@@ -48,7 +48,7 @@ public class AdapterWithCallbackInstance
ServiceAdapterCallbackInstance callbackInstance = new
ServiceAdapterCallbackInstance(e);
Component adapter = adapter(m, OriginalService.class)
- .provides(AdaptedService.class).impl(new
ServiceAdapter(e)).autoConfig("m_originalService").propagate(true).cb("set",
"changed", "unset").cbInst(callbackInstance)
+ .provides(AdaptedService.class).impl(new
ServiceAdapter(e)).autoConfig("m_originalService").propagate(true).cb(callbackInstance,
"set", "changed", "unset")
.build();
// add the provider and the adapter
Added:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AutoConfigTest.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AutoConfigTest.java?rev=1724712&view=auto
==============================================================================
---
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AutoConfigTest.java
(added)
+++
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/AutoConfigTest.java
Thu Jan 14 23:51:12 2016
@@ -0,0 +1,251 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.dm.builder.lambda.itest;
+
+import static
org.apache.felix.dm.builder.lambda.DependencyActivatorBase.component;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.DependencyManager;
+import org.junit.Assert;
+import org.osgi.framework.Constants;
+
+/**
+ * @author <a href="mailto:[email protected]">Felix Project Team</a>
+ */
+@SuppressWarnings({"unchecked", "rawtypes"})
+public class AutoConfigTest extends TestBase {
+ private final Ensure m_ensure = new Ensure();
+
+ public void testField() throws Exception {
+ final DependencyManager dm = getDM();
+ // Create a consumer, depending on some providers (autoconfig field).
+ ConsumeWithProviderField consumer = new ConsumeWithProviderField();
+ Component c = createConsumer(dm, consumer);
+ // Create two providers
+ Component p1 = createProvider(dm, 10, new Provider() {
+ public String toString() { return "provider1"; }
+ public void run() { m_ensure.step(); }
+ });
+ Component p2 = createProvider(dm, 20, new Provider() {
+ public String toString() { return "provider2"; }
+ public void run() { m_ensure.step(); }
+ });
+
+ // add the two providers
+ dm.add(p2);
+ dm.add(p1);
+ // add the consumer, which should have been injected with provider2
(highest rank)
+ dm.add(c);
+ m_ensure.waitForStep(1, 5000);
+ // remove the provider2, the consumer should now be injected with
provider1
+ dm.remove(p2);
+ Assert.assertNotNull(consumer.getProvider());
+ Assert.assertEquals("provider1", consumer.getProvider().toString());
+ // remove the provider1, the consumer should have been stopped
+ dm.remove(p1);
+ m_ensure.waitForStep(2, 5000);
+ dm.clear();
+ }
+
+ public void testIterableField() throws Exception {
+ final DependencyManager dm = getDM();
+ ConsumerWithIterableField consumer = new ConsumerWithIterableField();
+ Component c = createConsumer(dm, consumer);
+ Component p1 = createProvider(dm, 10, new Provider() {
+ public void run() { m_ensure.step(); }
+ public String toString() { return "provider1"; }
+ });
+ Component p2 = createProvider(dm, 20, new Provider() {
+ public void run() { m_ensure.step();}
+ public String toString() { return "provider2"; }
+ });
+
+ dm.add(p2);
+ dm.add(p1);
+ dm.add(c);
+ // the consumer should have been injected with all providers.
+ m_ensure.waitForStep(3, 5000);
+
+ // check if all providers are there
+ Assert.assertNotNull(consumer.getProvider("provider1"));
+ Assert.assertNotNull(consumer.getProvider("provider2"));
+
+ // remove provider1
+ dm.remove(p1);
+
+ // check if provider1 has been removed and if provider2 is still there
+ Assert.assertNull(consumer.getProvider("provider1"));
+ Assert.assertNotNull(consumer.getProvider("provider2"));
+
+ // remove provider2, the consumer should be stopped
+ dm.remove(p2);
+ m_ensure.waitForStep(4, 5000);
+ dm.clear();
+ }
+
+ public void testMapField() throws Exception {
+ final DependencyManager dm = getDM();
+ ConsumerWithMapField consumer = new ConsumerWithMapField();
+ Component c = createConsumer(dm, consumer);
+ Component p1 = createProvider(dm, 10, new Provider() {
+ public void run() { m_ensure.step(); }
+ public String toString() { return "provider1"; }
+ });
+ Component p2 = createProvider(dm, 20, new Provider() {
+ public void run() { m_ensure.step();}
+ public String toString() { return "provider2"; }
+ });
+
+ dm.add(p2);
+ dm.add(p1);
+ dm.add(c);
+ // the consumer should have been injected with all providers.
+ m_ensure.waitForStep(3, 5000);
+
+ // check if all providers are there
+ Assert.assertNotNull(consumer.getProvider("provider1"));
+ Assert.assertNotNull(consumer.getProvider("provider2"));
+
+ // remove provider1
+ dm.remove(p1);
+
+ // check if provider1 has been removed and if provider2 is still there
+ Assert.assertNull(consumer.getProvider("provider1"));
+ Assert.assertNotNull(consumer.getProvider("provider2"));
+
+ // remove provider2, the consumer should be stopped
+ dm.remove(p2);
+ m_ensure.waitForStep(4, 5000);
+ dm.clear();
+ }
+
+ private Component createProvider(DependencyManager dm, int rank, Provider
provider) {
+ return component(dm).impl(provider).provides(Provider.class,
Constants.SERVICE_RANKING, new Integer(rank)).build();
+ }
+
+ private Component createConsumer(DependencyManager dm, Object consumer) {
+ return
component(dm).impl(consumer).withService(Provider.class).build();
+ }
+
+ public static interface Provider extends Runnable {
+ }
+
+ public class ConsumeWithProviderField {
+ volatile Provider m_provider;
+
+ void start() {
+ Assert.assertNotNull(m_provider);
+ Assert.assertEquals("provider2", m_provider.toString());
+ m_ensure.step(1);
+ }
+
+ public Provider getProvider() {
+ return m_provider;
+ }
+
+ void stop() {
+ m_ensure.step(2);
+ }
+ }
+
+ public class ConsumerWithIterableField {
+ final Iterable<Provider> m_providers = new ConcurrentLinkedQueue<>();
+ final List m_notInjectMe = new ArrayList();
+
+ void start() {
+ Assert.assertNotNull(m_providers);
+ int found = 0;
+ for (Provider provider : m_providers) {
+ provider.run();
+ found ++;
+ }
+ Assert.assertTrue(found == 2);
+ // The "m_notInjectMe" should not be injected with anything
+ Assert.assertEquals(m_notInjectMe.size(), 0);
+ m_ensure.step(3);
+ }
+
+ public Provider getProvider(String name) {
+ System.out.println("getProvider(" + name + ") : proviers=" +
m_providers);
+ for (Provider provider : m_providers) {
+ if (provider.toString().equals(name)) {
+ return provider;
+ }
+ }
+ return null;
+ }
+
+ void stop() {
+ m_ensure.step(4);
+ }
+ }
+
+ public class ConsumerWithMapField {
+ final Map<Provider, Dictionary> m_providers = new
ConcurrentHashMap<>();
+ final Map m_notInjectMe = new HashMap<>();
+
+ void start() {
+ Assert.assertNotNull(m_providers);
+ System.out.println("ConsumerMap.start: injected providers=" +
m_providers);
+ Assert.assertTrue(m_providers.size() == 2);
+ Assert.assertEquals(0, m_notInjectMe.size());
+ for (Map.Entry<Provider, Dictionary> e : m_providers.entrySet()) {
+ Provider provider = e.getKey();
+ Dictionary props = e.getValue();
+
+ provider.run();
+ if (provider.toString().equals("provider1")) {
+ Assert.assertEquals(props.get(Constants.SERVICE_RANKING),
10);
+ } else if (provider.toString().equals("provider2")) {
+ Assert.assertEquals(props.get(Constants.SERVICE_RANKING),
20);
+ } else {
+ Assert.fail("Did not find any properties for provider " +
provider);
+ }
+ }
+
+ m_ensure.step(3);
+ }
+
+ public Provider getProvider(String name) {
+ System.out.println("getProvider(" + name + ") : providers=" +
m_providers);
+ for (Provider provider : m_providers.keySet()) {
+ if (provider.toString().equals(name)) {
+ return provider;
+ }
+ }
+ return null;
+ }
+
+ Map<Provider, Dictionary> getProviders() {
+ return m_providers;
+ }
+
+ void stop() {
+ m_ensure.step(4);
+ }
+ }
+}
Added:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/CompositionTest.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/CompositionTest.java?rev=1724712&view=auto
==============================================================================
---
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/CompositionTest.java
(added)
+++
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/CompositionTest.java
Thu Jan 14 23:51:12 2016
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.dm.builder.lambda.itest;
+
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.DependencyManager;
+import static org.apache.felix.dm.builder.lambda.DependencyActivatorBase.*;
+
+
+/**
+ * @author <a href="mailto:[email protected]">Felix Project Team</a>
+ */
+public class CompositionTest extends TestBase {
+ public void testComposition() {
+ DependencyManager m = getDM();
+ // helper class that ensures certain steps get executed in sequence
+ Ensure e = new Ensure();
+ // create a service provider and consumer
+ Component sp = component(m).impl(new
ServiceProvider(e)).provides(ServiceInterface.class).build();
+ Component sc = component(m).impl(new
ServiceConsumer(e)).composition("getComposition")
+ .withService(ServiceInterface.class, sb->sb.cb("add")).build();
+ m.add(sp);
+ m.add(sc);
+ // ensure we executed all steps inside the component instance
+ e.step(6);
+ m.clear();
+ }
+
+ public void testCompositionRef() {
+ DependencyManager m = getDM();
+ // helper class that ensures certain steps get executed in sequence
+ Ensure e = new Ensure();
+ // create a service provider and consumer
+ Component sp = component(m).impl(new
ServiceProvider(e)).provides(ServiceInterface.class).build();
+ ServiceConsumer scimpl = new ServiceConsumer(e);
+ Component sc =
component(m).impl(scimpl).composition(scimpl::getComposition)
+ .withService(ServiceInterface.class, sb->sb.cb("add")).build();
+ m.add(sp);
+ m.add(sc);
+ // ensure we executed all steps inside the component instance
+ e.step(6);
+ m.clear();
+ }
+
+ static interface ServiceInterface {
+ public void invoke();
+ }
+
+ static class ServiceProvider implements ServiceInterface {
+ private final Ensure m_ensure;
+ public ServiceProvider(Ensure e) {
+ m_ensure = e;
+ }
+ public void invoke() {
+ m_ensure.step(4);
+ }
+ }
+
+ static class ServiceConsumer {
+ private final Ensure m_ensure;
+ private ServiceConsumerComposite m_composite;
+ @SuppressWarnings("unused")
+ private ServiceInterface m_service;
+
+ public ServiceConsumer(Ensure e) {
+ m_ensure = e;
+ m_composite = new ServiceConsumerComposite(m_ensure);
+ }
+
+ public Object[] getComposition() {
+ return new Object[] { this, m_composite };
+ }
+
+ void add(ServiceInterface service) {
+ m_ensure.step(1);
+ m_service = service; // This method seems to not being called
anymore
+ }
+
+ void start() {
+ m_composite.invoke();
+ m_ensure.step(5);
+ }
+ }
+
+ static class ServiceConsumerComposite {
+ ServiceInterface m_service;
+ private Ensure m_ensure;
+
+ ServiceConsumerComposite(Ensure ensure)
+ {
+ m_ensure = ensure;
+ }
+
+ void add(ServiceInterface service) {
+
+ m_ensure.step(2);
+ m_service = service;
+ }
+
+ void invoke()
+ {
+ m_ensure.step(3);
+ m_service.invoke();
+ }
+ }
+}
Added:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/DynamicProxyAspectTest.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/DynamicProxyAspectTest.java?rev=1724712&view=auto
==============================================================================
---
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/DynamicProxyAspectTest.java
(added)
+++
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/builder/lambda/itest/DynamicProxyAspectTest.java
Thu Jan 14 23:51:12 2016
@@ -0,0 +1,197 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.dm.builder.lambda.itest;
+
+import static
org.apache.felix.dm.builder.lambda.DependencyActivatorBase.aspect;
+import static
org.apache.felix.dm.builder.lambda.DependencyActivatorBase.component;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.DependencyManager;
+import org.junit.Assert;
+
+/**
+ * @author <a href="mailto:[email protected]">Felix Project Team</a>
+ */
+@SuppressWarnings({"rawtypes"})
+public class DynamicProxyAspectTest extends TestBase {
+ public void testImplementGenericAspectWithDynamicProxyAndFactoryRef() {
+ DependencyManager m = getDM();
+ // helper class that ensures certain steps get executed in sequence
+ Ensure e = new Ensure();
+
+ // create two service providers, each providing a different service
interface
+ Component sp1 = component(m).impl(new
ServiceProvider(e)).provides(ServiceInterface.class).build();
+ Component sp2 = component(m).impl(new
ServiceProvider2(e)).provides(ServiceInterface2.class).build();
+
+ // create a dynamic proxy based aspect and hook it up to both services
+ Component a1 = aspect(m,
ServiceInterface.class).rank(10).autoConfig("m_service")
+ .factory(() -> new Factory(e, ServiceInterface.class,
"ServiceInterfaceProxy"), Factory::create).build();
+ Component a2 = aspect(m,
ServiceInterface2.class).rank(10).autoConfig("m_service")
+ .factory(() -> new Factory(e, ServiceInterface2.class,
"ServiceInterfaceProxy2"), Factory::create).build();
+
+ // create a client that invokes a method on boths services, validate
that it goes
+ // through the proxy twice
+ Component sc = component(m)
+ .impl(new ServiceConsumer(e))
+ .withService(ServiceInterface.class,
ServiceInterface2.class).build();
+
+ // register both producers, validate that both services are started
+ m.add(sp1);
+ e.waitForStep(1, 2000);
+ m.add(sp2);
+ e.waitForStep(2, 2000);
+
+ // add both aspects, and validate that both instances have been created
+ m.add(a1);
+ m.add(a2);
+ e.waitForStep(4, 4000);
+
+ // add the client, which will automatically invoke both services
+ m.add(sc);
+
+ // wait until both services have been invoked
+ e.waitForStep(6, 4000);
+
+ // make sure the proxy has been called twice
+ Assert.assertEquals("Proxy should have been invoked this many times.",
2, DynamicProxyHandler.getCounter());
+
+ m.remove(sc);
+ m.remove(a2);
+ m.remove(a1);
+ m.remove(sp2);
+ m.remove(sp1);
+ m.remove(a2);
+ m.remove(a1);
+
+ try {
+ Thread.sleep(2000);
+ }
+ catch (InterruptedException e1) {
+ // TODO Auto-generated catch block
+ e1.printStackTrace();
+ }
+ }
+
+ static interface ServiceInterface {
+ public void invoke(Runnable run);
+ }
+
+ static interface ServiceInterface2 {
+ public void invoke(Runnable run);
+ }
+
+ static class ServiceProvider implements ServiceInterface {
+ private final Ensure m_ensure;
+ public ServiceProvider(Ensure e) {
+ m_ensure = e;
+ }
+ public void start() {
+ m_ensure.step(1);
+ }
+ public void invoke(Runnable run) {
+ run.run();
+ }
+ }
+
+ static class ServiceProvider2 implements ServiceInterface2 {
+ private final Ensure m_ensure;
+ public ServiceProvider2(Ensure ensure) {
+ m_ensure = ensure;
+ }
+ public void start() {
+ m_ensure.step(2);
+ }
+ public void invoke(Runnable run) {
+ run.run();
+ }
+ }
+
+ static class ServiceConsumer implements Runnable {
+ private volatile ServiceInterface m_service;
+ private volatile ServiceInterface2 m_service2;
+ private final Ensure m_ensure;
+
+ public ServiceConsumer(Ensure e) {
+ m_ensure = e;
+ }
+
+ public void init() {
+ Thread t = new Thread(this);
+ t.start();
+ }
+
+ public void run() {
+ m_service.invoke(Ensure.createRunnableStep(m_ensure, 5));
+ m_service2.invoke(Ensure.createRunnableStep(m_ensure, 6));
+ }
+ }
+
+ static class DynamicProxyHandler implements InvocationHandler {
+ public volatile Object m_service; // ISSUE, we cannot inject into
"Object" at the moment
+ private final String m_label;
+ private static volatile int m_counter = 0;
+
+ public DynamicProxyHandler(String label) {
+ m_label = label;
+ }
+
+ public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
+ System.out.println("IIIIIIINVOKE--------------------------" +
method.getName());
+ if (m_service == null) {
+ Assert.fail("No service was injected into dynamic proxy
handler " + m_label);
+ }
+ Method m = m_service.getClass().getMethod(method.getName(),
method.getParameterTypes());
+ if (m == null) {
+ Assert.fail("No method " + method.getName() + " was found in
instance " + m_service + " in dynamic proxy handler " + m_label);
+ }
+ if (method.getName().equals("invoke")) {
+ // only count methods called 'invoke' because those are
actually the ones
+ // both interfaces implement (and the dynamic proxy might be
invoked for
+ // other methods, such as toString() as well)
+ m_counter++;
+ }
+ return m.invoke(m_service, args);
+ }
+
+ public static int getCounter() {
+ return m_counter;
+ }
+ }
+
+ static class Factory {
+ private final String m_label;
+ private Class m_class;
+ private final Ensure m_ensure;
+
+ public Factory(Ensure ensure, Class clazz, String label) {
+ m_ensure = ensure;
+ m_class = clazz;
+ m_label = label;
+ }
+
+ public Object create() {
+ m_ensure.step();
+ return Proxy.newProxyInstance(m_class.getClassLoader(), new
Class[] { m_class }, new DynamicProxyHandler(m_label));
+ }
+ }
+}
Modified:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/compositefactory/Activator.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/compositefactory/Activator.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
---
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/compositefactory/Activator.java
(original)
+++
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/compositefactory/Activator.java
Thu Jan 14 23:51:12 2016
@@ -53,7 +53,7 @@ public class Activator extends Dependenc
component(comp -> comp
.factory(factory::create, factory::getComposition)
.withService(LogService.class, srv -> srv.cb(ADD,
ProviderImpl::bind).cb(ADD, ProviderComposite1::bind))
- .withConfiguration(conf ->
conf.pid(ProviderFactory.class).cb(factory::updated)));
+ .withConfiguration(conf ->
conf.pid(ProviderFactory.class).cbi(factory::updated)));
// Creates a configuration with pid name =
"org.apache.felix.dependencymanager.lambda.samples.compositefactory.ProviderFactory"
component(comp -> comp
Modified:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/dictionary/Activator.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/dictionary/Activator.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
---
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/dictionary/Activator.java
(original)
+++
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/dictionary/Activator.java
Thu Jan 14 23:51:12 2016
@@ -36,10 +36,10 @@ public class Activator extends Dependenc
// Create the factory configuration for our DictionaryImpl service.
factoryPidAdapter(adapter -> adapter
.impl(DictionaryImpl.class)
+ .provides(DictionaryService.class)
.factoryPid(DictionaryConfiguration.class)
- .cb(DictionaryImpl::updated)
.propagate()
- .provides(DictionaryService.class)
+ .cb(DictionaryImpl::updated)
.withService(LogService.class, dep -> dep.required(false)));
// Create the Dictionary Aspect
@@ -52,8 +52,7 @@ public class Activator extends Dependenc
// Create the SpellChecker component
component(comp -> comp
.impl(SpellChecker.class)
- .provides(SpellChecker.class)
- .properties(COMMAND_SCOPE, "dictionary", COMMAND_FUNCTION, new
String[] {"spellcheck"})
+ .provides(SpellChecker.class, COMMAND_SCOPE, "dictionary",
COMMAND_FUNCTION, new String[] {"spellcheck"})
.withService(DictionaryService.class, srv -> srv.required())
.withService(LogService.class, srv -> srv.required(false)));
}
Modified:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/rx/completable/SiteInfoImpl.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/rx/completable/SiteInfoImpl.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
---
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/rx/completable/SiteInfoImpl.java
(original)
+++
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/rx/completable/SiteInfoImpl.java
Thu Jan 14 23:51:12 2016
@@ -45,7 +45,7 @@ public class SiteInfoImpl implements Sit
// our component until the page has been downloaded and parsed.
Observable<List<String>> links =
downloadSite(m_url).map(this::getSiteLinks);
- component(c, comp -> comp.withFuture(toFuture(links), futuredep ->
futuredep.cb(this::setLinks)));
+ component(c, comp -> comp.withFuture(toFuture(links), futuredep ->
futuredep.cbi(this::setLinks)));
}
// Called when our future has completed.
Modified:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleDependencyBuilder.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleDependencyBuilder.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
---
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleDependencyBuilder.java
(original)
+++
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleDependencyBuilder.java
Thu Jan 14 23:51:12 2016
@@ -17,13 +17,14 @@ import org.osgi.framework.Bundle;
* @author <a href="mailto:[email protected]">Felix Project Team</a>
*/
public interface BundleDependencyBuilder extends
DependencyBuilder<BundleDependency> {
-
- BundleDependencyBuilder cbInst(Object callbackInstance);
BundleDependencyBuilder cb(String add);
+ BundleDependencyBuilder cb(Object callbackInstance, String add);
BundleDependencyBuilder cb(String add, String remove);
+ BundleDependencyBuilder cb(Object callbackInstance, String add, String
remove);
BundleDependencyBuilder cb(String add, String change, String remove);
-
+ BundleDependencyBuilder cb(Object callbackInstance, String add, String
change, String remove);
+
<T> BundleDependencyBuilder cb(Cb callbackType, CbTypeBundle<T> callback);
<T> BundleDependencyBuilder cb(Cb callbackType, CbTypeComponentBundle<T>
callback);
Modified:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ComponentBuilderBase.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ComponentBuilderBase.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
---
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ComponentBuilderBase.java
(original)
+++
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ComponentBuilderBase.java
Thu Jan 14 23:51:12 2016
@@ -3,7 +3,10 @@ package org.apache.felix.dm.builder.lamb
import java.util.Dictionary;
import java.util.concurrent.CompletableFuture;
import java.util.function.BiConsumer;
+import java.util.function.BiFunction;
import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Supplier;
import org.apache.felix.dm.Component;
import org.apache.felix.dm.builder.lambda.Functions.CbComponent;
@@ -82,7 +85,7 @@ public interface ComponentBuilderBase<T,
* @param consumer the lambda used to build the configuration dependency.
* @return this builder.
*/
- B withConfiguration(Consumer<ConfigurationDependencyBuilder<T>> consumer);
+ B withConfiguration(Consumer<ConfigurationDependencyBuilder> consumer);
/**
* Adds a bundle dependency.
@@ -96,7 +99,7 @@ public interface ComponentBuilderBase<T,
* @param future
* @return
*/
- <V> B withFuture(CompletableFuture<V> future,
Consumer<FutureDependencyBuilder<T, V>> consumer);
+ <V> B withFuture(CompletableFuture<V> future,
Consumer<FutureDependencyBuilder<V>> consumer);
B init(Consumer<T> callback);
B init(BiConsumer<T, Component> callback);
@@ -163,7 +166,24 @@ public interface ComponentBuilderBase<T,
B autoAdd();
/**
- * Builds the real DependencyManager Component from this Component.
+ * TODO
+ * @param method
+ * @return
+ */
+ B composition(String getCompositionMethod);
+
+ /**
+ * TODO
+ * @param instance
+ * @param method
+ * @return
+ */
+ B composition(Object instance, String getCompositionMethod);
+
+ B composition(Supplier<Object[]> getCompositionMethod);
+
+ /**
+ * Builds the real DependencyManager Component.
* @return the real DependencyManager Component.
*/
Component build();
Modified:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ConfigurationDependencyBuilder.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ConfigurationDependencyBuilder.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
---
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ConfigurationDependencyBuilder.java
(original)
+++
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ConfigurationDependencyBuilder.java
Thu Jan 14 23:51:12 2016
@@ -22,20 +22,17 @@ import org.apache.felix.dm.builder.lambd
*
* TODO: javadoc
*/
-public interface ConfigurationDependencyBuilder<T> extends
DependencyBuilder<ConfigurationDependency> {
+public interface ConfigurationDependencyBuilder extends
DependencyBuilder<ConfigurationDependency> {
+ ConfigurationDependencyBuilder pid(String pid);
+ ConfigurationDependencyBuilder pid(Class<?> pidClass);
+ ConfigurationDependencyBuilder propagate();
+ ConfigurationDependencyBuilder propagate(boolean propagate);
- ConfigurationDependencyBuilder<T> pid(String pid);
- ConfigurationDependencyBuilder<T> pid(Class<?> pidClass);
- ConfigurationDependencyBuilder<T> propagate();
- ConfigurationDependencyBuilder<T> propagate(boolean propagate);
-
- ConfigurationDependencyBuilder<T> cb(String updateMethod);
- ConfigurationDependencyBuilder<T> cb(Object callbackInstance, String
updateMethod);
+ ConfigurationDependencyBuilder cb(String updateMethod);
+ ConfigurationDependencyBuilder cb(Object callbackInstance, String
updateMethod);
- ConfigurationDependencyBuilder<T> cb(CbTypeDictionary<T> callback);
- ConfigurationDependencyBuilder<T> cb(CbDictionary updated);
- ConfigurationDependencyBuilder<T> cb(CbComponentDictionary updated);
-
- <U> ConfigurationDependencyBuilder<T> compositeCb(CbTypeDictionary<U>
callback);
- <U> ConfigurationDependencyBuilder<T>
compositeCb(CbTypeComponentDictionary<U> callback);
+ <T> ConfigurationDependencyBuilder cb(CbTypeDictionary<T> callback);
+ <T> ConfigurationDependencyBuilder cb(CbTypeComponentDictionary<T>
callback);
+ ConfigurationDependencyBuilder cbi(CbDictionary updated);
+ ConfigurationDependencyBuilder cbi(CbComponentDictionary updated);
}
Modified:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/FactoryPidAdapterBuilder.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/FactoryPidAdapterBuilder.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
---
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/FactoryPidAdapterBuilder.java
(original)
+++
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/FactoryPidAdapterBuilder.java
Thu Jan 14 23:51:12 2016
@@ -100,11 +100,8 @@ public interface FactoryPidAdapterBuilde
FactoryPidAdapterBuilder<T> cb(String updateMethod);
FactoryPidAdapterBuilder<T> cb(Object callbackInstance, String
updateMethod);
- FactoryPidAdapterBuilder<T> cb(CbTypeDictionary<T> callback);
- FactoryPidAdapterBuilder<T> cb(CbTypeComponentDictionary<T> callback);
- FactoryPidAdapterBuilder<T> cb(CbDictionary callback);
- FactoryPidAdapterBuilder<T> cb(CbComponentDictionary callback);
-
- <U> FactoryPidAdapterBuilder<T> compositeCb(CbTypeDictionary<U> callback);
- <U> FactoryPidAdapterBuilder<T> compositeCb(CbTypeComponentDictionary<U>
callback);
+ <U> FactoryPidAdapterBuilder<T> cb(CbTypeDictionary<U> callback);
+ <U> FactoryPidAdapterBuilder<T> cb(CbTypeComponentDictionary<U> callback);
+ FactoryPidAdapterBuilder<T> cbi(CbDictionary callback);
+ FactoryPidAdapterBuilder<T> cbi(CbComponentDictionary callback);
}
Modified:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/FutureDependencyBuilder.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/FutureDependencyBuilder.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
---
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/FutureDependencyBuilder.java
(original)
+++
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/FutureDependencyBuilder.java
Thu Jan 14 23:51:12 2016
@@ -29,7 +29,7 @@ import org.apache.felix.dm.builder.lambd
* component(comp -> comp
* .impl(MyComponent.class)
* .withService(LogService.class, srv ->
srv.onAdd(SiteInfoImpl::bindLog))
- * .withFuture(felixFuture, future ->
future.thenAccept(SiteInfoImpl::bindFelixPage)));
+ * .withFuture(felixFuture, future ->
future.cb(SiteInfoImpl::bindFelixPage)));
*
* }
*
@@ -39,7 +39,30 @@ import org.apache.felix.dm.builder.lambd
*
* @param <F> the type of the CompletableFuture result.
*/
-public interface FutureDependencyBuilder<T, F> extends
DependencyBuilder<Dependency> {
+public interface FutureDependencyBuilder<F> extends
DependencyBuilder<Dependency> {
+ /**
+ * Sets the action to perform when the future task has completed. The
action is one of the Component instance method that accepts the
+ * result of the completed future.
+ * @param action the action to perform when the future task as completed.
+ * @return this dependency
+ */
+ <T> FutureDependencyBuilder<F> cb(CbTypeFuture<T, ? super F> action);
+
+ /**
+ * TODO
+ * @param action
+ * @param async
+ * @return
+ */
+ <T> FutureDependencyBuilder<F> cb(CbTypeFuture<T, ? super F> action,
boolean async);
+
+ /**
+ * TODO
+ * @param action
+ * @param executor
+ * @return
+ */
+ <T> FutureDependencyBuilder<F> cb(CbTypeFuture<T, ? super F> action,
Executor executor);
/**
* Sets the action to perform when the future task has completed. The
action is a Consumer instance which accepts the
@@ -47,7 +70,7 @@ public interface FutureDependencyBuilder
* @param action the action to perform when the future task as completed.
* @return this dependency
*/
- FutureDependencyBuilder<T, F> cb(CbFuture<? super F> action);
+ FutureDependencyBuilder<F> cbi(CbFuture<? super F> action);
/**
* Sets the action to perform asynchronously when the future task has
completed. The action is a Consumer instance which accepts the
@@ -55,7 +78,7 @@ public interface FutureDependencyBuilder
* @param action the action to perform when the future task as completed.
* @return this dependency
*/
- FutureDependencyBuilder<T, F> cb(CbFuture<? super F> action, boolean
async);
+ FutureDependencyBuilder<F> cbi(CbFuture<? super F> action, boolean async);
/**
* Sets the action to perform asynchronously when the future task has
completed. The action is a Consumer instance which accepts the
@@ -64,28 +87,5 @@ public interface FutureDependencyBuilder
* @param executor the executor to use for asynchronous execution of the
action.
* @return this dependency
*/
- FutureDependencyBuilder<T, F> cb(CbFuture<? super F> action, Executor
executor);
-
- /**
- * Sets the action to perform when the future task has completed. The
action is one of the Component instance method that accepts the
- * result of the completed future.
- * @param action the action to perform when the future task as
completed.
- * @return this dependency
- */
- FutureDependencyBuilder<T, F> cb(CbTypeFuture<T, ? super F> action);
-
- FutureDependencyBuilder<T, F> cb(CbTypeFuture<T, ? super F> action,
boolean async);
-
- FutureDependencyBuilder<T, F> cb(CbTypeFuture<T, ? super F> action,
Executor executor);
-
- /**
- * Sets the action to perform asynchronously when the future task has
completed. The action is one of the Component instance method that accepts the
- * result of the completed future.
- * @param action the action to perform when the future task as
completed.
- * @param executor the executor to use for asynchronous execution of
the action.
- * @return this dependency
- */
- <C> FutureDependencyBuilder<T, F> compositeCb(CbTypeFuture<C, ? super F>
action);
- <C> FutureDependencyBuilder<T, F> compositeCb(CbTypeFuture<C, ? super F>
action, boolean async);
- <C> FutureDependencyBuilder<T, F> compositeCb(CbTypeFuture<C, ? super F>
action, Executor executor);
+ FutureDependencyBuilder<F> cbi(CbFuture<? super F> action, Executor
executor);
}
Modified:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceCallbacksBuilder.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceCallbacksBuilder.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
---
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceCallbacksBuilder.java
(original)
+++
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceCallbacksBuilder.java
Thu Jan 14 23:51:12 2016
@@ -60,13 +60,15 @@ public interface ServiceCallbacksBuilder
* @return this builder
*/
B autoConfig(String field);
-
- B cbInst(Object callbackInstance);
-
+
B cb(String add);
+ B cb(Object callbackInstance, String add);
B cb(String add, String remove);
+ B cb(Object callbackInstance, String add, String remove);
B cb(String add, String change, String remove);
+ B cb(Object callbackInstance, String add, String change, String remove);
B cb(String add, String change, String remove, String swap);
+ B cb(Object callbackInstance, String add, String change, String remove,
String swap);
<T> B cb(Cb callbackType, CbTypeService<T, S> callback);
<T> B cb(Cb callbackType, CbTypeServiceMap<T, S> callback);
Modified:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceDependencyBuilder.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceDependencyBuilder.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
---
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceDependencyBuilder.java
(original)
+++
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceDependencyBuilder.java
Thu Jan 14 23:51:12 2016
@@ -1,5 +1,9 @@
package org.apache.felix.dm.builder.lambda;
+import java.util.Dictionary;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+
import org.apache.felix.dm.ServiceDependency;
import org.osgi.framework.ServiceReference;
@@ -65,6 +69,21 @@ public interface ServiceDependencyBuilde
ServiceDependencyBuilder<S> propagate(Object instance, String method);
/**
+ * TODO
+ * @param propagate
+ * @return
+ */
+ ServiceDependencyBuilder<S> propagate(Function<ServiceReference<S>,
Dictionary<String, Object>> propagate);
+
+ /**
+ * TODO
+ * @param propagate
+ * @return
+ */
+ ServiceDependencyBuilder<S> propagate(BiFunction<ServiceReference<S>, S,
Dictionary<String, Object>> propagate);
+
+
+ /**
* Sets the default implementation if the service is not available.
* @param defaultImpl the implementation used by default when the service
is not available.
* @return this builder
Modified:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/AdapterBase.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/AdapterBase.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
---
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/AdapterBase.java
(original)
+++
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/AdapterBase.java
Thu Jan 14 23:51:12 2016
@@ -4,6 +4,8 @@ import java.util.Dictionary;
import java.util.concurrent.CompletableFuture;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Supplier;
import org.apache.felix.dm.Component;
import org.apache.felix.dm.builder.lambda.BundleDependencyBuilder;
@@ -64,8 +66,6 @@ public interface AdapterBase<T, B extend
andThenBuild(compBuilder -> compBuilder.provides(ifaces, properties));
return (B) this;
}
-
-
default B provides(String iface) {
andThenBuild(compBuilder -> compBuilder.provides(iface));
@@ -132,7 +132,7 @@ public interface AdapterBase<T, B extend
return (B) this;
}
- default B withConfiguration(Consumer<ConfigurationDependencyBuilder<T>>
consumer) {
+ default B withConfiguration(Consumer<ConfigurationDependencyBuilder>
consumer) {
andThenBuild(compBuilder -> compBuilder.withConfiguration(consumer));
return (B) this;
}
@@ -142,7 +142,7 @@ public interface AdapterBase<T, B extend
return (B) this;
}
- default <U> B withFuture(CompletableFuture<U> future,
Consumer<FutureDependencyBuilder<T, U>> consumer) {
+ default <U> B withFuture(CompletableFuture<U> future,
Consumer<FutureDependencyBuilder<U>> consumer) {
andThenBuild(compBuilder -> compBuilder.withFuture(future, consumer));
return (B) this;
}
@@ -282,4 +282,18 @@ public interface AdapterBase<T, B extend
return (B) this;
}
+ default B composition(String getCompositionMethod) {
+ andThenBuild(compBuilder ->
compBuilder.composition(getCompositionMethod));
+ return (B) this;
+ }
+
+ default B composition(Object instance, String getCompositionMethod) {
+ andThenBuild(compBuilder -> compBuilder.composition(instance,
getCompositionMethod));
+ return (B) this;
+ }
+
+ default B composition(Supplier<Object[]> getCompositionMethod) {
+ andThenBuild(compBuilder ->
compBuilder.composition(getCompositionMethod));
+ return (B) this;
+ }
}
Modified:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleDependencyBuilderImpl.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleDependencyBuilderImpl.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
---
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleDependencyBuilderImpl.java
(original)
+++
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleDependencyBuilderImpl.java
Thu Jan 14 23:51:12 2016
@@ -38,19 +38,8 @@ public class BundleDependencyBuilderImpl
private Supplier<Dictionary<?, ?>> m_propagateSupplier;
private final Component m_component;
- /**
- * List of service (add/change/remove) callbacks (method references).
- */
private final Map<String, List<MethodRef<Object>>> m_refs = new
HashMap<>();
- /**
- * This interface (lambda) is called when we want to invoke a method
reference. the lambda is called with all necessary dependency
- * informations.
- *
- * When the lambda is called, it will invoke the proper callback on the
given component instance.
- *
- * @param <I> type of a component instance
- */
@FunctionalInterface
interface MethodRef<I> {
public void accept(I instance, Component c, Bundle bundle);
@@ -149,13 +138,30 @@ public class BundleDependencyBuilderImpl
}
@Override
+ public BundleDependencyBuilder cb(Object callbackInstance, String add) {
+ cb(callbackInstance, add, null, null);
+ return this;
+ }
+
+ @Override
public BundleDependencyBuilder cb(String add, String remove) {
cb(add, null, remove);
return this;
}
-
+
+ @Override
+ public BundleDependencyBuilder cb(Object callbackInstance, String add,
String remove) {
+ cb(callbackInstance, add, null, remove);
+ return this;
+ }
+
public BundleDependencyBuilder cb(String added, String changed, String
removed) {
+ return cb(null, added, changed, removed);
+ }
+
+ public BundleDependencyBuilder cb(Object callbackInstance, String added,
String changed, String removed) {
requiresNoMethodRefs();
+ m_instance = callbackInstance;
m_added = added != null ? added : m_added;
m_changed = changed != null ? changed : m_changed;
m_removed = removed != null ? removed : m_removed;
@@ -164,12 +170,6 @@ public class BundleDependencyBuilderImpl
}
@Override
- public BundleDependencyBuilder cbInst(Object instance) {
- m_instance = instance;
- return this;
- }
-
- @Override
public <T> BundleDependencyBuilder cb(Cb callbackType, CbTypeBundle<T>
callback) {
return setComponentCallbackRef(callbackType.getCallback(),
Helpers.getLambdaGenericType(callback, 0),
(inst, component, bundle) -> callback.accept ((T) inst, bundle));
Modified:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/CompletableFutureDependencyImpl.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/CompletableFutureDependencyImpl.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
---
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/CompletableFutureDependencyImpl.java
(original)
+++
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/CompletableFutureDependencyImpl.java
Thu Jan 14 23:51:12 2016
@@ -15,7 +15,7 @@ import org.apache.felix.dm.context.Event
import org.apache.felix.dm.context.EventType;
import org.osgi.service.log.LogService;
-public class CompletableFutureDependencyImpl<T, F> extends
AbstractDependency<CompletableFutureDependencyImpl<T, F>> implements
FutureDependencyBuilder<T, F> {
+public class CompletableFutureDependencyImpl<F> extends
AbstractDependency<CompletableFutureDependencyImpl<F>> implements
FutureDependencyBuilder<F> {
private final CompletableFuture<F> m_future;
private Component m_comp;
@@ -37,7 +37,7 @@ public class CompletableFutureDependency
* @param prototype
* the existing PathDependency.
*/
- public CompletableFutureDependencyImpl(Component component,
CompletableFutureDependencyImpl<T, F> prototype) {
+ public CompletableFutureDependencyImpl(Component component,
CompletableFutureDependencyImpl<F> prototype) {
super(prototype);
m_future = prototype.m_future;
m_comp = component;
@@ -49,68 +49,45 @@ public class CompletableFutureDependency
}
@Override
- public FutureDependencyBuilder<T, F> cb(CbFuture<? super F> consumer) {
- cb(consumer, false);
- return this;
+ public <T> FutureDependencyBuilder<F> cb(CbTypeFuture<T, ? super F>
consumer) {
+ return cb(consumer, false);
}
-
+
+ @SuppressWarnings("unchecked")
@Override
- public FutureDependencyBuilder<T, F> cb(CbFuture<? super F> consumer,
boolean async) {
- m_accept = m_accept.andThen(future -> consumer.accept(future));
+ public <T> FutureDependencyBuilder<F> cb(CbTypeFuture<T, ? super F>
consumer, boolean async) {
+ m_accept2Type = Helpers.getLambdaGenericType(consumer, 0);;
+ m_accept2 = (instance, result) -> consumer.accept((T) instance,
result);
m_async = async;
return this;
}
- @Override
- public FutureDependencyBuilder<T, F> cb(CbFuture<? super F> consumer,
Executor executor) {
- cb(consumer, true /* async */);
- m_exec = executor;
- return this;
- }
-
-
@Override
- public FutureDependencyBuilder<T, F> cb(CbTypeFuture<T, ? super F>
consumer) {
- cb(consumer, false);
- return this;
+ public <T> FutureDependencyBuilder<F> cb(CbTypeFuture<T, ? super F>
consumer, Executor executor) {
+ cb(consumer, true /* async */);
+ m_exec = executor;
+ return this;
}
- @SuppressWarnings("unchecked")
- @Override
- public FutureDependencyBuilder<T, F> cb(CbTypeFuture<T, ? super F>
consumer, boolean async) {
- m_accept2 = (instance, result) -> consumer.accept((T) instance,
result);
- m_async = async;
- return this;
- }
-
-
@Override
- public FutureDependencyBuilder<T, F> cb(CbTypeFuture<T, ? super F>
consumer, Executor executor) {
- cb(consumer, true /* async */);
- m_exec = executor;
+ public FutureDependencyBuilder<F> cbi(CbFuture<? super F> consumer) {
+ cbi(consumer, false);
return this;
}
-
- public <C> FutureDependencyBuilder<T, F> compositeCb(CbTypeFuture<C, ?
super F> consumer) {
- compositeCb(consumer, false);
- return this;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public <C> FutureDependencyBuilder<T, F> compositeCb(CbTypeFuture<C, ?
super F> consumer, boolean async) {
+
+ @Override
+ public FutureDependencyBuilder<F> cbi(CbFuture<? super F> consumer,
boolean async) {
+ m_accept = m_accept.andThen(future -> consumer.accept(future));
m_async = async;
- m_accept2Type = Helpers.getLambdaGenericType(consumer, 0);;
- m_accept2 = (instance, result) -> consumer.accept((C) instance,
result);
return this;
}
@Override
- public <C> FutureDependencyBuilder<T, F> compositeCb(CbTypeFuture<C, ?
super F> consumer, Executor executor) {
- compositeCb(consumer, true /* async */);
- m_exec = executor;
- return this;
- }
+ public FutureDependencyBuilder<F> cbi(CbFuture<? super F> consumer,
Executor executor) {
+ cbi(consumer, true /* async */);
+ m_exec = executor;
+ return this;
+ }
// ---------- DependencyContext interface ----------
@@ -134,7 +111,7 @@ public class CompletableFutureDependency
@Override
public DependencyContext createCopy() {
- return new CompletableFutureDependencyImpl<T, F>(m_comp, this);
+ return new CompletableFutureDependencyImpl<F>(m_comp, this);
}
@Override
Modified:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ComponentBuilderImpl.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ComponentBuilderImpl.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
---
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ComponentBuilderImpl.java
(original)
+++
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ComponentBuilderImpl.java
Thu Jan 14 23:51:12 2016
@@ -37,7 +37,9 @@ public class ComponentBuilderImpl<T> imp
private Object m_factory;
private boolean m_factoryHasComposite;
private boolean m_autoAdd = true;
- private final Map<String, Consumer<Component>> m_lfclCallbacks = new
HashMap<>();
+ private final Map<String, Consumer<Component>> m_lfclCallbacks = new
HashMap<>();
+ private Object m_compositionInstance;
+ private String m_compositionMethod;
public ComponentBuilderImpl(DependencyManager dm) {
m_component = dm.createComponent();
@@ -318,6 +320,26 @@ public class ComponentBuilderImpl<T> imp
return (ComponentBuilder<V>) this;
}
+ public ComponentBuilderImpl<T> composition(String getCompositionMethod) {
+ return composition(null, getCompositionMethod);
+ }
+
+ public ComponentBuilderImpl<T> composition(Object instance, String
getCompositionMethod) {
+ m_compositionInstance = instance;
+ m_compositionMethod = getCompositionMethod;
+ return this;
+ }
+
+ public ComponentBuilderImpl<T> composition(Supplier<Object[]>
getCompositionMethod) {
+ m_compositionInstance = new Object() {
+ public Object[] getComposition() {
+ return getCompositionMethod.get();
+ }
+ };
+ m_compositionMethod = "getComposition";
+ return this;
+ }
+
@Override
public ComponentBuilderImpl<T> withService(Class<?> service, Class<?> ...
services) {
doWithService(service);
@@ -341,8 +363,8 @@ public class ComponentBuilderImpl<T> imp
}
@Override
- public ComponentBuilderImpl<T>
withConfiguration(Consumer<ConfigurationDependencyBuilder<T>> consumer) {
- ConfigurationDependencyBuilder<T> dep = new
ConfigurationDependencyBuilderImpl<>(m_component);
+ public ComponentBuilderImpl<T>
withConfiguration(Consumer<ConfigurationDependencyBuilder> consumer) {
+ ConfigurationDependencyBuilder dep = new
ConfigurationDependencyBuilderImpl(m_component);
consumer.accept(dep);
m_dependencyBuilders.add(dep);
return this;
@@ -357,8 +379,8 @@ public class ComponentBuilderImpl<T> imp
}
@Override
- public <V> ComponentBuilder<T> withFuture(CompletableFuture<V> future,
Consumer<FutureDependencyBuilder<T, V>> consumer) {
- FutureDependencyBuilder<T, V> dep = new
CompletableFutureDependencyImpl<>(m_component, future);
+ public <V> ComponentBuilder<T> withFuture(CompletableFuture<V> future,
Consumer<FutureDependencyBuilder<V>> consumer) {
+ FutureDependencyBuilder<V> dep = new
CompletableFutureDependencyImpl<>(m_component, future);
consumer.accept(dep);
m_dependencyBuilders.add(dep);
return this;
@@ -499,6 +521,7 @@ public class ComponentBuilderImpl<T> imp
if (! m_componentUpdated) { // Don't override impl or set callbacks if
component is being updated
if (m_impl != null) {
m_component.setImplementation(m_impl);
+ m_component.setComposition(m_compositionInstance,
m_compositionMethod);
} else {
Objects.nonNull(m_factory);
m_component.setFactory(m_factory, "create");
Modified:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ConfigurationDependencyBuilderImpl.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ConfigurationDependencyBuilderImpl.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
---
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ConfigurationDependencyBuilderImpl.java
(original)
+++
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ConfigurationDependencyBuilderImpl.java
Thu Jan 14 23:51:12 2016
@@ -1,8 +1,10 @@
package org.apache.felix.dm.builder.lambda.impl;
+import java.util.ArrayList;
import java.util.Dictionary;
+import java.util.List;
import java.util.Objects;
-import java.util.function.BiConsumer;
+import java.util.stream.Stream;
import org.apache.felix.dm.Component;
import org.apache.felix.dm.ConfigurationDependency;
@@ -12,7 +14,7 @@ import org.apache.felix.dm.builder.lambd
import org.apache.felix.dm.builder.lambda.Functions.CbTypeComponentDictionary;
import org.apache.felix.dm.builder.lambda.Functions.CbTypeDictionary;
-public class ConfigurationDependencyBuilderImpl<T> implements
ConfigurationDependencyBuilder<T> {
+public class ConfigurationDependencyBuilderImpl implements
ConfigurationDependencyBuilder {
private String m_pid;
private boolean m_propagate;
private final Component m_component;
@@ -20,81 +22,74 @@ public class ConfigurationDependencyBuil
private Object m_updateCallbackInstance;
private boolean m_hasMethodRefs;
private boolean m_hasReflectionCallback;
-
- private BiConsumer<Component, Dictionary<String, Object>> m_callbacks =
(component, props) -> {};
+ private final List<MethodRef<Object>> m_refs = new ArrayList<>();
+
+ @FunctionalInterface
+ interface MethodRef<I> {
+ public void accept(I instance, Component c, Dictionary<String, Object>
props);
+ }
public ConfigurationDependencyBuilderImpl(Component component) {
m_component = component;
}
@Override
- public ConfigurationDependencyBuilder<T> pid(String pid) {
+ public ConfigurationDependencyBuilder pid(String pid) {
m_pid = pid;
return this;
}
@Override
- public ConfigurationDependencyBuilder<T> pid(Class<?> pidClass) {
+ public ConfigurationDependencyBuilder pid(Class<?> pidClass) {
m_pid = pidClass.getName();
return this;
}
@Override
- public ConfigurationDependencyBuilder<T> propagate() {
+ public ConfigurationDependencyBuilder propagate() {
m_propagate = true;
return this;
}
@Override
- public ConfigurationDependencyBuilder<T> propagate(boolean propagate) {
+ public ConfigurationDependencyBuilder propagate(boolean propagate) {
m_propagate = propagate;
return this;
}
- public ConfigurationDependencyBuilder<T> cb(String update) {
+ public ConfigurationDependencyBuilder cb(String update) {
checkHasNoMethodRefs();
m_hasReflectionCallback = true;
m_updateMethodName = update;
return this;
}
- public ConfigurationDependencyBuilder<T> cb(Object callbackInstance,
String update) {
- cb(update);
+ public ConfigurationDependencyBuilder cb(Object callbackInstance, String
update) {
m_updateCallbackInstance = callbackInstance;
+ cb(update);
return this;
}
@Override
- public ConfigurationDependencyBuilder<T> cb(CbTypeDictionary<T> callback)
{
- return addMethodRef((component, props) -> {
callback.accept(component.getInstance(), props); });
+ public <T> ConfigurationDependencyBuilder cb(CbTypeDictionary<T>
callback) {
+ Class<T> type = Helpers.getLambdaGenericType(callback, 0);
+ return setComponentCallbackRef(type, (instance, component, props) -> {
callback.accept((T) instance, props); });
}
@Override
- public <U> ConfigurationDependencyBuilder<T>
compositeCb(CbTypeDictionary<U> callback) {
- Class<U> type = Helpers.getLambdaGenericType(callback, 0);
- return addMethodRef((component, props) -> {
- U instance = Helpers.findCompositeInstance(component, type);
- callback.accept(instance, props);
- });
+ public <T> ConfigurationDependencyBuilder cb(CbTypeComponentDictionary<T>
callback) {
+ Class<T> type = Helpers.getLambdaGenericType(callback, 0);
+ return setComponentCallbackRef(type, (instance, component, props) -> {
callback.accept((T) instance, component, props); });
}
@Override
- public <U> ConfigurationDependencyBuilder<T>
compositeCb(CbTypeComponentDictionary<U> callback) {
- Class<U> type = Helpers.getLambdaGenericType(callback, 0);
- return addMethodRef((component, props) -> {
- U instance = Helpers.findCompositeInstance(component, type);
- callback.accept(instance, component, props);
- });
+ public ConfigurationDependencyBuilder cbi(CbDictionary callback) {
+ return setInstanceCallbackRef((instance, component, props) -> {
callback.accept(props); });
}
@Override
- public ConfigurationDependencyBuilder<T> cb(CbDictionary callback) {
- return addMethodRef((component, props) -> { callback.accept(props); });
- }
-
- @Override
- public ConfigurationDependencyBuilder<T> cb(CbComponentDictionary
callback) {
- return addMethodRef((component, props) -> { callback.accept(component,
props); });
+ public ConfigurationDependencyBuilder cbi(CbComponentDictionary callback) {
+ return setInstanceCallbackRef((instance, component, props) -> {
callback.accept(component, props); });
}
@Override
@@ -109,17 +104,31 @@ public class ConfigurationDependencyBuil
dep.setCallback(new Object() {
@SuppressWarnings("unused")
void updated(Component comp, Dictionary<String, Object> props)
{
- m_callbacks.accept(comp, props);
+ m_refs.forEach(mref -> mref.accept(null, comp, props));
}
}, "updated", true /* we need component instances before updated
is called */);
}
return dep;
}
- private ConfigurationDependencyBuilder<T>
addMethodRef(BiConsumer<Component, Dictionary<String, Object>> callback) {
+ private <T> ConfigurationDependencyBuilder
setInstanceCallbackRef(MethodRef<T> ref) {
+ checkHasNoReflectionCallbacks();
+ m_hasMethodRefs = true;
+ m_refs.add((instance, component, props) -> ref.accept(null, component,
props));
+ return this;
+ }
+
+ @SuppressWarnings("unchecked")
+ private <T> ConfigurationDependencyBuilder
setComponentCallbackRef(Class<T> type, MethodRef<T> ref) {
checkHasNoReflectionCallbacks();
m_hasMethodRefs = true;
- m_callbacks = m_callbacks.andThen(callback);
+ m_refs.add((instance, component, props) -> {
+ Stream.of(component.getInstances()).forEach(inst -> {
+ if (Helpers.getClass(inst).equals(type)) {
+ ref.accept((T) inst, component, props);
+ }
+ });
+ });
return this;
}
Modified:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/FactoryPidAdapterBuilderImpl.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/FactoryPidAdapterBuilderImpl.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
---
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/FactoryPidAdapterBuilderImpl.java
(original)
+++
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/FactoryPidAdapterBuilderImpl.java
Thu Jan 14 23:51:12 2016
@@ -1,11 +1,13 @@
package org.apache.felix.dm.builder.lambda.impl;
+import java.util.ArrayList;
import java.util.Dictionary;
+import java.util.List;
import java.util.Objects;
-import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
+import java.util.stream.Stream;
import org.apache.felix.dm.Component;
import org.apache.felix.dm.DependencyManager;
@@ -24,12 +26,17 @@ public class FactoryPidAdapterBuilderImp
private boolean m_propagate;
private final DependencyManager m_dm;
private boolean m_autoAdd = true;
- private BiConsumer<Component, Dictionary<String, Object>> m_callbacks =
(component, props) -> {};
private String m_updateMethodName;
private Object m_updateCallbackInstance;
private boolean m_hasMethodRefs;
private boolean m_hasReflectionCallback;
private Consumer<ComponentBuilder<T>> m_compBuilder = (componentBuilder ->
{});
+ private final List<MethodRef<Object>> m_refs = new ArrayList<>();
+
+ @FunctionalInterface
+ interface MethodRef<I> {
+ public void accept(I instance, Component c, Dictionary<String, Object>
props);
+ }
public FactoryPidAdapterBuilderImpl(DependencyManager dm) {
m_dm = dm;
@@ -129,52 +136,28 @@ public class FactoryPidAdapterBuilderImp
}
@Override
- public FactoryPidAdapterBuilder<T> cb(CbTypeDictionary<T> callback) {
- return addMethodRef((component, props) -> {
- callback.accept(component.getInstance(), props);
- });
+ public <U> FactoryPidAdapterBuilder<T> cb(CbTypeDictionary<U> callback) {
+ Class<U> type = Helpers.getLambdaGenericType(callback, 0);
+ return setComponentCallbackRef(type, (instance, component, props) -> {
callback.accept((U) instance, props); });
}
@Override
- public FactoryPidAdapterBuilder<T> cb(CbDictionary callback) {
- return addMethodRef((component, props) -> {
- callback.accept(props);
- });
+ public <U> FactoryPidAdapterBuilder<T> cb(CbTypeComponentDictionary<U>
callback) {
+ Class<U> type = Helpers.getLambdaGenericType(callback, 0);
+ return setComponentCallbackRef(type, (instance, component, props) -> {
callback.accept((U) instance, component, props); });
}
@Override
- public FactoryPidAdapterBuilder<T> cb(CbComponentDictionary callback) {
- return addMethodRef((component, props) -> {
- callback.accept(component, props);
- });
+ public FactoryPidAdapterBuilder<T> cbi(CbDictionary callback) {
+ return setInstanceCallbackRef((instance, component, props) -> {
callback.accept(props); });
}
@Override
- public FactoryPidAdapterBuilder<T> cb(CbTypeComponentDictionary<T>
callback) {
- return addMethodRef((component, props) -> {
- callback.accept(component.getInstance(), component, props);
- });
+ public FactoryPidAdapterBuilder<T> cbi(CbComponentDictionary callback) {
+ return setInstanceCallbackRef((instance, component, props) -> {
callback.accept(component, props); });
}
@Override
- public <U> FactoryPidAdapterBuilder<T> compositeCb(CbTypeDictionary<U>
callback) {
- Class<U> type = Helpers.getLambdaGenericType(callback, 0);
- return addMethodRef((component, props) -> {
- U instance = Helpers.findCompositeInstance(component, type);
- callback.accept(instance, props);
- });
- }
-
- @Override
- public <U> FactoryPidAdapterBuilder<T>
compositeCb(CbTypeComponentDictionary<U> callback) {
- Class<U> type = Helpers.getLambdaGenericType(callback, 0);
- return addMethodRef((component, props) -> {
- U instance = Helpers.findCompositeInstance(component, type);
- callback.accept(instance, component, props);
- });
- }
-
- @Override
public Component build() {
Objects.nonNull(m_factoryPid);
Component c = null;
@@ -183,7 +166,7 @@ public class FactoryPidAdapterBuilderImp
Object wrapCallback = new Object() {
@SuppressWarnings("unused")
public void updated(Component comp, Dictionary<String, Object>
conf) {
- m_callbacks.accept(comp, conf);
+ m_refs.forEach(mref -> mref.accept(null, comp, conf));
}
};
c = m_dm.createFactoryConfigurationAdapterService(m_factoryPid,
"updated", m_propagate, wrapCallback);
@@ -195,13 +178,27 @@ public class FactoryPidAdapterBuilderImp
return cb.build();
}
- private FactoryPidAdapterBuilder<T> addMethodRef(BiConsumer<Component,
Dictionary<String, Object>> callback) {
+ private <U> FactoryPidAdapterBuilder<T>
setInstanceCallbackRef(MethodRef<U> ref) {
checkHasNoReflectionCallbacks();
m_hasMethodRefs = true;
- m_callbacks = m_callbacks.andThen(callback);
+ m_refs.add((instance, component, props) -> ref.accept(null, component,
props));
return this;
}
+ @SuppressWarnings("unchecked")
+ private <U> FactoryPidAdapterBuilder<T> setComponentCallbackRef(Class<U>
type, MethodRef<U> ref) {
+ checkHasNoReflectionCallbacks();
+ m_hasMethodRefs = true;
+ m_refs.add((instance, component, props) -> {
+ Stream.of(component.getInstances()).forEach(inst -> {
+ if (Helpers.getClass(inst).equals(type)) {
+ ref.accept((U) inst, component, props);
+ }
+ });
+ });
+ return this;
+ }
+
private void checkHasNoMethodRefs() {
if (m_hasMethodRefs) {
throw new IllegalStateException("Can't mix method references with
reflection based callbacks");
Modified:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
---
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java
(original)
+++
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java
Thu Jan 14 23:51:12 2016
@@ -117,25 +117,37 @@ public abstract class ServiceCallbacksBu
return (B) this;
}
- public B cbInst(Object callbackInstance) {
- m_callbackInstance = callbackInstance;
- return (B) this;
- }
-
public B cb(String add) {
return cb(add, null, null, null);
}
+
+ public B cb(Object callbackInstance, String add) {
+ return cb(callbackInstance, add, null, null, null);
+ }
public B cb(String add, String remove) {
return cb(add, null, remove, null);
}
+ public B cb(Object callbackInstance, String add, String remove) {
+ return cb(callbackInstance, add, null, remove, null);
+ }
+
public B cb(String add, String change, String remove) {
return cb(add, change, remove, null);
}
+ public B cb(Object callbackInstance, String add, String change, String
remove) {
+ return cb(callbackInstance, add, change, remove, null);
+ }
+
public B cb(String added, String changed, String removed, String swapped) {
+ return cb(null, added, changed, removed, swapped);
+ }
+
+ public B cb(Object callbackInstance, String added, String changed, String
removed, String swapped) {
requiresNoMethodRefs();
+ m_callbackInstance = callbackInstance;
m_added = added != null ? added : m_added;
m_changed = changed != null ? changed : m_changed;
m_removed = removed != null ? removed : m_removed;
Modified:
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceDependencyBuilderImpl.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceDependencyBuilderImpl.java?rev=1724712&r1=1724711&r2=1724712&view=diff
==============================================================================
---
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceDependencyBuilderImpl.java
(original)
+++
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceDependencyBuilderImpl.java
Thu Jan 14 23:51:12 2016
@@ -1,5 +1,9 @@
package org.apache.felix.dm.builder.lambda.impl;
+import java.util.Dictionary;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+
import org.apache.felix.dm.Component;
import org.apache.felix.dm.DependencyManager;
import org.apache.felix.dm.ServiceDependency;
@@ -62,6 +66,28 @@ public class ServiceDependencyBuilderImp
m_propagateMethod = method;
return this;
}
+
+ public ServiceDependencyBuilder<S> propagate(Function<ServiceReference<S>,
Dictionary<String, Object>> propagate) {
+ Object wrappedCallback = new Object() {
+ @SuppressWarnings("unused")
+ Dictionary<String, Object> propagate(ServiceReference<S> ref) {
+ return propagate.apply(ref);
+ }
+ };
+ propagate(wrappedCallback, "propagate");
+ return this;
+ }
+
+ public ServiceDependencyBuilder<S>
propagate(BiFunction<ServiceReference<S>, S, Dictionary<String, Object>>
propagate) {
+ Object wrappedCallback = new Object() {
+ @SuppressWarnings("unused")
+ Dictionary<String, Object> propagate(ServiceReference<S> ref, S
service) {
+ return propagate.apply(ref, service);
+ }
+ };
+ propagate(wrappedCallback, "propagate");
+ return this;
+ }
public ServiceDependencyBuilder<S> defImpl(Object defaultImpl) {
m_defaultImpl = defaultImpl;