Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyInjectionTest.java URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyInjectionTest.java?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyInjectionTest.java (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyInjectionTest.java Sun Jan 31 23:27:05 2016 @@ -0,0 +1,157 @@ +/* + * 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 static org.apache.felix.dm.lambda.DependencyManagerActivator.component; + +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> + */ +public class ServiceDependencyInjectionTest extends TestBase { + public void testServiceInjection() { + DependencyManager m = getDM(); + Ensure e = new Ensure(); + // create a service provider and consumer + ServiceProvider provider = new ServiceProvider(e); + Component sp = component(m).impl(provider).provides(ServiceInterface2.class.getName()).build(); + Component sc = component(m).impl(new ServiceConsumer()).withSrv(ServiceInterface2.class).build(); + + Component sc2 = component(m) // all dependencies are optional + .impl(new ServiceConsumerNamedInjection(false, false)) + .withSrv(ServiceInterface2.class, s->s.optional().autoConfig("m_service")) + .withSrv(ServiceInterface2.class, s->s.optional().autoConfig("m_service2")) + .withSrv(ServiceInterface2.class, s->s.optional().autoConfig("m_service3")) + .build(); + + Component sc3 = component(m) // second dependency is required, first and third are optional + .impl(new ServiceConsumerNamedInjection(false, false)) + .withSrv(ServiceInterface2.class, s->s.optional().autoConfig("m_service")) + .withSrv(ServiceInterface2.class, s->s.required().autoConfig("m_service2")) + .withSrv(ServiceInterface2.class, s->s.optional().autoConfig("m_service3")) + .build(); + + Component sc4 = component(m) + .impl(new ServiceConsumerNamedInjection(true, false)).build(); + Component sc5 = component(m) + .impl(new ServiceConsumerNamedInjection(true, true)).build(); + m.add(sp); + m.add(sc); + m.remove(sc); + m.add(sc2); + m.remove(sc2); + m.add(sc3); + m.remove(sc4); + m.add(sc4); + m.remove(sc4); + m.add(sc5); + m.remove(sc5); + m.remove(sp); + e.waitForStep(11, 5000); + m.clear(); + } + + static interface ServiceInterface { + public void invoke(); + } + + static interface ServiceInterface2 extends ServiceInterface { + public void invoke2(); + } + + static class ServiceProvider implements ServiceInterface2 { + private final Ensure m_ensure; + private Ensure.Steps m_invokeSteps = new Ensure.Steps(4, 5, 7, 8, 10, 11, 13, 14); + private Ensure.Steps m_invoke2Steps = new Ensure.Steps(1, 2, 3, 6, 9, 12); + + public ServiceProvider(Ensure e) { + m_ensure = e; + } + + public void invoke() { + System.out.println("invoke"); + m_ensure.steps(m_invokeSteps); + } + + public void invoke2() { + System.out.println("invoke2"); + m_ensure.steps(m_invoke2Steps); + } + } + + static class ServiceConsumer { + private volatile ServiceInterface2 m_service; + private volatile ServiceInterface2 m_service2; + + public void init() { + // invoke the second method of the interface via both injected members, to ensure + // neither of them is a null object (or null) + m_service.invoke2(); + m_service2.invoke2(); + Assert.assertEquals("Both members should have been injected with the same service.", m_service, m_service2); + } + } + + class ServiceConsumerNamedInjection { + private volatile ServiceInterface2 m_service; + private volatile ServiceInterface m_service2; + private volatile Object m_service3; + private final boolean m_secondDependencyRequired; + private final boolean m_instanceBound; + + ServiceConsumerNamedInjection(boolean instanceBound, boolean withSecondRequired) { + m_secondDependencyRequired = withSecondRequired; + m_instanceBound = instanceBound; + } + + public void init(Component c) { + if (m_instanceBound) { + DependencyManager m = c.getDependencyManager(); + c.add(m.createServiceDependency().setService(ServiceInterface2.class).setRequired(false).setAutoConfig("m_service"), + m.createServiceDependency().setService(ServiceInterface2.class).setRequired(m_secondDependencyRequired).setAutoConfig("m_service2"), + m.createServiceDependency().setService(ServiceInterface2.class).setRequired(false).setAutoConfig("m_service3")); + } else { + check(); + } + } + + public void start() { + if (m_instanceBound) { + check(); + } + } + + public void check() { + warn("ServiceConsumerNamedInjectionInstanceBound: m_service=%s, m_service2=%s, m_service3=%s", m_service, m_service2, m_service3); + // invoke the second method + m_service.invoke2(); + // invoke the first method (twice) + m_service2.invoke(); + ((ServiceInterface) m_service3).invoke(); + Assert.assertNotNull("Should have been injected", m_service); + Assert.assertNotNull("Should have been injected", m_service2); + Assert.assertNotNull("Should have been injected", m_service3); + Assert.assertEquals("Members should have been injected with the same service.", m_service, m_service2); + Assert.assertEquals("Members should have been injected with the same service.", m_service, m_service3); + } + } +}
Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyPropagateTest.java URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyPropagateTest.java?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyPropagateTest.java (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyPropagateTest.java Sun Jan 31 23:27:05 2016 @@ -0,0 +1,160 @@ +/* + * 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 static org.apache.felix.dm.lambda.DependencyManagerActivator.component; + +import java.util.Dictionary; +import java.util.Hashtable; +import java.util.Map; + +import org.apache.felix.dm.Component; +import org.apache.felix.dm.DependencyManager; +import org.osgi.framework.ServiceReference; + +/** + * Validates ServiceDependency service properties propagation. + * + * @author <a href="mailto:[email protected]">Felix Project Team</a> + */ +@SuppressWarnings({"unchecked", "rawtypes", "serial"}) +public class ServiceDependencyPropagateTest extends TestBase { + /** + * Checks that a ServiceDependency propagates the dependency service properties to the provided service properties. + */ + public void testServiceDependencyPropagate() { + DependencyManager m = getDM(); + // helper class that ensures certain steps get executed in sequence + Ensure e = new Ensure(); + + Component c1 = component(m) + .impl(new C1(e)) + .withSrv(C2.class, s->s.cb("bind")).build(); + + Component c2 = component(m) + .provides(C2.class.getName(), new Hashtable() {{ put("foo", "bar"); }}) + .impl(new C2()) + .withSrv(C3.class, s->s.propagate()).build(); + + Component c3 = component(m) + .provides(C3.class.getName(), new Hashtable() {{ put("foo2", "bar2"); put("foo", "overriden");}}) + .impl(new C3()).build(); + + m.add(c1); + m.add(c2); + m.add(c3); + + e.waitForStep(3, 10000); + + m.remove(c3); + m.remove(c2); + m.remove(c1); + m.clear(); + } + + /** + * Checks that a ServiceDependency propagates the dependency service properties to the provided service properties, + * using a callback method. + */ + public void testServiceDependencyPropagateCallback() { + DependencyManager m = getDM(); + // helper class that ensures certain steps get executed in sequence + Ensure e = new Ensure(); + Component c1 = component(m) + .impl(new C1(e)) + .withSrv(C2.class, s->s.cb("bind")).build(); + + C2 c2Impl = new C2(); + Component c2 = component(m) + .provides(C2.class.getName(), new Hashtable() {{ put("foo", "bar"); }}) + .impl(c2Impl) + .withSrv(C3.class, s->s.propagate(c2Impl, "getServiceProperties")).build(); + + Component c3 = component(m) + .provides(C3.class.getName()) + .impl(new C3()).build(); + + m.add(c1); + m.add(c2); + m.add(c3); + + e.waitForStep(3, 10000); + m.clear(); + } + + public void testServiceDependencyPropagateCallbackRef() { + DependencyManager m = getDM(); + // helper class that ensures certain steps get executed in sequence + Ensure e = new Ensure(); + Component c1 = component(m) + .impl(new C1(e)) + .withSrv(C2.class, s->s.cb(C1::bind)).build(); + + C2 c2Impl = new C2(); + Component c2 = component(m) + .provides(C2.class.getName(), new Hashtable() {{ put("foo", "bar"); }}) + .impl(c2Impl) + .withSrv(C3.class, s->s.propagate(c2Impl::getServiceProperties)).build(); + + Component c3 = component(m) + .provides(C3.class.getName()) + .impl(new C3()).build(); + + m.add(c1); + m.add(c2); + m.add(c3); + + e.waitForStep(3, 10000); + m.clear(); + } + + public static class C1 { + private Map m_props; + private Ensure m_ensure; + + C1(Ensure ensure) { + m_ensure = ensure; + } + + void bind(C2 c2, Map props) { + m_props = props; + } + + void start() { + m_ensure.step(1); + if ("bar".equals(m_props.get("foo"))) { // "foo=overriden" from C2 should not override our own "foo" property + m_ensure.step(2); + } + if ("bar2".equals(m_props.get("foo2"))) { + m_ensure.step(3); + } + } + } + + public static class C2 { + C3 m_c3; + + public Dictionary getServiceProperties(ServiceReference ref) { + return new Hashtable() {{ put("foo2", "bar2"); put("foo", "overriden"); }}; + } + } + + public static class C3 { + } +} Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyTest.java URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyTest.java?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyTest.java (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyTest.java Sun Jan 31 23:27:05 2016 @@ -0,0 +1,98 @@ +/* + * 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 static org.apache.felix.dm.lambda.DependencyManagerActivator.component; + +import org.apache.felix.dm.Component; +import org.apache.felix.dm.DependencyManager; + +/** + * @author <a href="mailto:[email protected]">Felix Project Team</a> + */ +public class ServiceDependencyTest extends TestBase { + public void testServiceRegistrationAndConsumption() { + 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)).withSrv(ServiceInterface.class).build(); + + Component sc2 = component(m).impl(new ServiceConsumerCallbacks(e)) + .withSrv(ServiceInterface.class, srv -> srv.required(false).cb(ServiceConsumerCallbacks::add, ServiceConsumerCallbacks::remove)) + .build(); + + m.add(sp); + m.add(sc); + m.remove(sc); + m.add(sc2); + m.remove(sp); + m.remove(sc2); + // ensure we executed all steps inside the component instance + e.step(6); + } + + 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(2); + } + } + + static class ServiceConsumer { + private volatile ServiceInterface m_service; + private final Ensure m_ensure; + + public ServiceConsumer(Ensure e) { + m_ensure = e; + } + + public void init() { + m_ensure.step(1); + m_service.invoke(); + } + + public void destroy() { + m_ensure.step(3); + } + } + + static class ServiceConsumerCallbacks { + private final Ensure m_ensure; + + public ServiceConsumerCallbacks(Ensure e) { + m_ensure = e; + } + + public void add(ServiceInterface service) { + m_ensure.step(4); + } + public void remove(ServiceInterface service) { + m_ensure.step(5); + } + } +} Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyThroughCallbackInstanceTest.java URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyThroughCallbackInstanceTest.java?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyThroughCallbackInstanceTest.java (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyThroughCallbackInstanceTest.java Sun Jan 31 23:27:05 2016 @@ -0,0 +1,82 @@ +/* + * 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 static org.apache.felix.dm.lambda.DependencyManagerActivator.component; + +import org.apache.felix.dm.DependencyManager; +import org.junit.Assert; +import org.osgi.framework.BundleContext; + +/** + * @author <a href="mailto:[email protected]">Felix Project Team</a> + */ +public class ServiceDependencyThroughCallbackInstanceTest extends TestBase { + public void testServiceWithCallbacksAndOneDependency() { + invokeTest(context, 1); + } + + public void testServiceWithCallbacksAndThreeDependencies() { + invokeTest(context, 3); + } + + private void invokeTest(BundleContext context, int numberOfServices) { + DependencyManager m = getDM(); + // create a number of services + for (int i = 0; i < numberOfServices; i++) { + final int num = i; + component(m, comp -> comp + .provides(Service.class).impl(new Service() { + public String toString() { + return "A" + num; + }})); + } + + // create a service with dependency which will be invoked on a callback instance + CallbackInstance instance = new CallbackInstance(); + component(m, comp -> comp + .impl(new SimpleService() {}) + .withSrv(Service.class, srv -> srv.cbi(instance::added, instance::removed))); + + Assert.assertEquals(numberOfServices, instance.getCount()); + m.clear(); + } + + public static interface Service { + } + + public static interface SimpleService { + } + + public static class CallbackInstance { + int m_count = 0; + + void added(Service service) { + System.out.println("added " + service); + m_count++; + } + + void removed(Service service) { + } + + int getCount() { + return m_count; + } + } +} Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceUpdateTest.java URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceUpdateTest.java?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceUpdateTest.java (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceUpdateTest.java Sun Jan 31 23:27:05 2016 @@ -0,0 +1,148 @@ +/* + * 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 static org.apache.felix.dm.lambda.DependencyManagerActivator.component; + +import java.net.URL; +import java.util.Dictionary; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.Properties; + +import org.apache.felix.dm.Component; +import org.apache.felix.dm.DependencyManager; +import org.apache.felix.dm.ResourceHandler; + +/** + * @author <a href="mailto:[email protected]">Felix Project Team</a> + */ +public class ServiceUpdateTest extends TestBase { + public void testServiceUpdate() throws Exception { + final DependencyManager m = getDM(); + // helper class that ensures certain steps get executed in sequence + Ensure e = new Ensure(); + // create a resource provider + ResourceProvider provider = new ResourceProvider(context, new URL("file://localhost/path/to/file1.txt")); + // activate it + component(m, comp -> comp + .impl(new ServiceProvider(e)) + .withSrv(ServiceInterface.class, srv -> srv + .cb(ServiceProvider::add, ServiceProvider::change, ServiceProvider::remove))); + component(m, comp -> comp + .impl(provider) + .withSrv(ResourceHandler.class, srv -> srv.cb(ResourceProvider::add, ResourceProvider::remove))); + + // TODO implement resource adapters in new builder API and use it for the following resource adapter. + + // create a resource adapter for our single resource + // note that we can provide an actual implementation instance here because there will be only one + // adapter, normally you'd want to specify a Class here + CallbackInstance callbackInstance = new CallbackInstance(e); + Hashtable<String, String> serviceProps = new Hashtable<String, String>(); + serviceProps.put("number", "1"); + Component component = m.createResourceAdapterService("(&(path=/path/to/*.txt)(host=localhost))", false, callbackInstance, "changed") + .setImplementation(new ResourceAdapter(e)) + .setInterface(ServiceInterface.class.getName(), serviceProps) + .setCallbacks(callbackInstance, "init", "start", "stop", "destroy"); + m.add(component); + // wait until the single resource is available + e.waitForStep(1, 5000); + // wait until the component gets the dependency injected + e.waitForStep(2, 5000); + // trigger a 'change' in our resource + provider.change(); + // wait until the changed callback is invoked + e.waitForStep(3, 5000); + // wait until the changed event arrived at the component + e.waitForStep(4, 5000); + System.out.println("Done!"); + } + + static class ResourceAdapter implements ServiceInterface { + protected URL m_resource; // injected by reflection. + + ResourceAdapter(Ensure e) { + } + + public void invoke() { + // TODO Auto-generated method stub + + } + } + + static interface ServiceInterface { + public void invoke(); + } + + static class ServiceProvider { + private final Ensure m_ensure; + public ServiceProvider(Ensure e) { + m_ensure = e; + } + void add(ServiceInterface i) { + m_ensure.step(2); + } + void change(ServiceInterface i) { + System.out.println("Change..."); + m_ensure.step(4); + } + void remove(ServiceInterface i) { + System.out.println("Remove..."); + } + } + + static class CallbackInstance { + private final Ensure m_ensure; + public CallbackInstance(Ensure e) { + m_ensure = e; + } + + void init() { + System.out.println("init"); + } + void start() { + System.out.println("start"); + m_ensure.step(1); + } + void stop() { + System.out.println("stop"); + } + void destroy() { + System.out.println("destroy"); + } + @SuppressWarnings("unchecked") + void changed(Component component) { + System.out.println("resource changed"); + m_ensure.step(3); + + Properties newProps = new Properties(); + // update the component's service properties + Dictionary<String, String> dict = component.getServiceProperties(); + Enumeration<String> e = dict.keys(); + while (e.hasMoreElements()) { + String key = e.nextElement(); + String value = dict.get(key); + newProps.setProperty(key, value); + } + newProps.setProperty("new-property", "2"); + component.getServiceRegistration().setProperties(newProps); + } + } +} Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceUtil.java URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceUtil.java?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceUtil.java (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceUtil.java Sun Jan 31 23:27:05 2016 @@ -0,0 +1,176 @@ +/* + * 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.List; + +import org.apache.felix.dm.DependencyManager; +import org.osgi.framework.Bundle; +import org.osgi.framework.Constants; +import org.osgi.framework.ServiceReference; + +/** + * OSGi service utilities (copied from dependency manager implementation). + * + * @author <a href="mailto:[email protected]">Felix Project Team</a> + */ +public class ServiceUtil { + /** + * Returns the service ranking of a service, based on its service reference. If + * the service has a property specifying its ranking, that will be returned. If + * not, the default ranking of zero will be returned. + * + * @param ref the service reference to determine the ranking for + * @return the ranking + */ + public static int getRanking(ServiceReference<?> ref) { + return getRankingAsInteger(ref).intValue(); + } + + /** + * Returns the service ranking of a service, based on its service reference. If + * the service has a property specifying its ranking, that will be returned. If + * not, the default ranking of zero will be returned. + * + * @param ref the service reference to determine the ranking for + * @return the ranking + */ + public static Integer getRankingAsInteger(ServiceReference<?> ref) { + Integer rank = (Integer) ref.getProperty(Constants.SERVICE_RANKING); + if (rank != null) { + return rank; + } + return new Integer(0); + } + + /** + * Returns the service ID of a service, based on its service reference. This + * method is aware of service aspects as defined by the dependency manager and + * will return the ID of the orginal service if you give it an aspect. + * + * @param ref the service reference to determine the service ID of + * @return the service ID + */ + public static long getServiceId(ServiceReference<?> ref) { + return getServiceIdAsLong(ref).longValue(); + } + + /** + * Returns the service ID of a service, based on its service reference. This + * method is aware of service aspects as defined by the dependency manager and + * will return the ID of the orginal service if you give it an aspect. + * + * @param ref the service reference to determine the service ID of + * @return the service ID + */ + public static Long getServiceIdAsLong(ServiceReference<?> ref) { + return getServiceIdObject(ref); + } + + public static Long getServiceIdObject(ServiceReference<?> ref) { + Long aid = (Long) ref.getProperty(DependencyManager.ASPECT); + if (aid != null) { + return aid; + } + Long sid = (Long) ref.getProperty(Constants.SERVICE_ID); + if (sid != null) { + return sid; + } + throw new IllegalArgumentException("Invalid service reference, no service ID found"); + } + + /** + * Determines if the service is an aspect as defined by the dependency manager. + * Aspects are defined by a property and this method will check for its presence. + * + * @param ref the service reference + * @return <code>true</code> if it's an aspect, <code>false</code> otherwise + */ + public static boolean isAspect(ServiceReference<?> ref) { + Long aid = (Long) ref.getProperty(DependencyManager.ASPECT); + return (aid != null); + } + + /** + * Converts a service reference to a string, listing both the bundle it was + * registered from and all properties. + * + * @param ref the service reference + * @return a string representation of the service + */ + public static String toString(ServiceReference<?> ref) { + if (ref == null) { + return "ServiceReference[null]"; + } + else { + StringBuffer buf = new StringBuffer(); + Bundle bundle = ref.getBundle(); + if (bundle != null) { + buf.append("ServiceReference["); + buf.append(bundle.getBundleId()); + buf.append("]{"); + } + else { + buf.append("ServiceReference[unregistered]{"); + } + buf.append(propertiesToString(ref, null)); + buf.append("}"); + return buf.toString(); + } + } + + /** + * Converts the properties of a service reference to a string. + * + * @param ref the service reference + * @param exclude a list of properties to exclude, or <code>null</code> to show everything + * @return a string representation of the service properties + */ + public static String propertiesToString(ServiceReference<?> ref, List<String> exclude) { + StringBuffer buf = new StringBuffer(); + String[] keys = ref.getPropertyKeys(); + for (int i = 0; i < keys.length; i++) { + if (i > 0) { + buf.append(','); + } + buf.append(keys[i]); + buf.append('='); + Object val = ref.getProperty(keys[i]); + if (exclude == null || !exclude.contains(val)) { + if (val instanceof String[]) { + String[] valArray = (String[]) val; + StringBuffer valBuf = new StringBuffer(); + valBuf.append('{'); + for (int j = 0; j < valArray.length; j++) { + if (valBuf.length() > 1) { + valBuf.append(','); + } + valBuf.append(valArray[j].toString()); + } + valBuf.append('}'); + buf.append(valBuf); + } + else { + buf.append(val.toString()); + } + } + } + return buf.toString(); + } +} Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/TemporalServiceDependencyTest.java URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/TemporalServiceDependencyTest.java?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/TemporalServiceDependencyTest.java (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/TemporalServiceDependencyTest.java Sun Jan 31 23:27:05 2016 @@ -0,0 +1,271 @@ +/* + * 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 static org.apache.felix.dm.lambda.DependencyManagerActivator.component; +import static org.apache.felix.dm.lambda.DependencyManagerActivator.serviceDependency; + +import java.util.Hashtable; + +import org.apache.felix.dm.Component; +import org.apache.felix.dm.DependencyManager; +import org.apache.felix.dm.ServiceDependency; +import org.junit.Assert; + +/** + * @author <a href="mailto:[email protected]">Felix Project Team</a> + */ +@SuppressWarnings({"unchecked", "rawtypes", "serial"}) +public class TemporalServiceDependencyTest extends TestBase { + public void testServiceConsumptionAndIntermittentAvailability() { + if (true) return; + final DependencyManager m = getDM(); + // helper class that ensures certain steps get executed in sequence + Ensure e = new Ensure(); + // create a service provider and consumer + TemporalServiceProvider provider = new TemporalServiceProvider(e); + Component sp = component(m).impl(provider).provides(TemporalServiceInterface.class.getName()).build(); + TemporalServiceProvider2 provider2 = new TemporalServiceProvider2(e); + Component sp2 = component(m).impl(provider2).provides(TemporalServiceInterface.class.getName()).build(); + TemporalServiceConsumer consumer = new TemporalServiceConsumer(e); + Component sc = component(m).impl(consumer).withSrv(TemporalServiceInterface.class, s->s.timeout(10000)).build(); + // add the service consumer + m.add(sc); + // now add the first provider + m.add(sp); + e.waitForStep(2, 5000); + // and remove it again (this should not affect the consumer yet) + m.remove(sp); + // now add the second provider + m.add(sp2); + e.step(3); + e.waitForStep(4, 5000); + // and remove it again + m.remove(sp2); + // finally remove the consumer + m.remove(sc); + // ensure we executed all steps inside the component instance + e.step(6); + m.clear(); + } + + public void testServiceConsumptionWithCallbackAndIntermittentAvailability() { + if (true) return; + final DependencyManager m = getDM(); + // helper class that ensures certain steps get executed in sequence + Ensure e = new Ensure(); + // create a service provider and consumer + TemporalServiceProvider provider = new TemporalServiceProvider(e); + Component sp = component(m).impl(provider).provides(TemporalServiceInterface.class.getName()).build(); + TemporalServiceProvider2 provider2 = new TemporalServiceProvider2(e); + Component sp2 = component(m).impl(provider2).provides(TemporalServiceInterface.class.getName()).build(); + TemporalServiceConsumerWithCallback consumer = new TemporalServiceConsumerWithCallback(e); + Component sc = component(m).impl(consumer).withSrv(TemporalServiceInterface.class, srv->srv.cb("add", "remove").timeout(10000)).build(); + + // add the service consumer + m.add(sc); + // now add the first provider + m.add(sp); + e.waitForStep(2, 5000); + // and remove it again (this should not affect the consumer yet) + m.remove(sp); + // now add the second provider + m.add(sp2); + e.step(3); + e.waitForStep(4, 5000); + // and remove it again + m.remove(sp2); + // finally remove the consumer + m.remove(sc); + // Wait for the consumer.remove callback + e.waitForStep(6, 5000); + // ensure we executed all steps inside the component instance + e.step(7); + m.clear(); + } + + // Same test as testServiceConsumptionWithCallbackAndIntermittentAvailability, but the consumer is now + // an adapter for the Adaptee interface. + public void testFELIX4858_ServiceAdapterConsumptionWithCallbackAndIntermittentAvailability() { + if (true) return; + final DependencyManager m = getDM(); + // helper class that ensures certain steps get executed in sequence + Ensure e = new Ensure(); + // create a service provider and consumer + TemporalServiceProvider provider = new TemporalServiceProvider(e); + Component sp = component(m).impl(provider).provides(TemporalServiceInterface.class.getName()).build(); + TemporalServiceProvider2 provider2 = new TemporalServiceProvider2(e); + Component sp2 = component(m).impl(provider2).provides(TemporalServiceInterface.class.getName()).build(); + TemporalServiceConsumerAdapterWithCallback consumer = new TemporalServiceConsumerAdapterWithCallback(e); + Component sc = m.createAdapterService(Adaptee.class, null).setImplementation(consumer); + ServiceDependency temporalDep = serviceDependency(sc, TemporalServiceInterface.class).timeout(10000).cb("add", "remove").build(); + sc.add(temporalDep); + Component adaptee = component(m).impl(new Adaptee()).provides(Adaptee.class.getName()).build(); + + // add the adapter service consumer + m.add(sc); + // add the adaptee (the adapter service depends on it) + m.add(adaptee); + // now add the first provider + m.add(sp); + e.waitForStep(2, 5000); + // and remove it again (this should not affect the consumer yet) + m.remove(sp); + // now add the second provider + m.add(sp2); + e.step(3); + e.waitForStep(4, 5000); + // and remove it again + m.remove(sp2); + // finally remove the consumer + m.remove(sc); + // Wait for the consumer.remove callback + e.waitForStep(6, 5000); + // ensure we executed all steps inside the component instance + e.step(7); + m.clear(); + } + + public void testFelix4602_PropagateServiceInvocationException() { + if (true) return; + final DependencyManager m = getDM(); + final Ensure ensure = new Ensure(); + Runnable provider = new Runnable() { + public void run() { + throw new UncheckedException(); + } + }; + Hashtable props = new Hashtable(); + props.put("target", getClass().getSimpleName()); + Component providerComp = component(m) + .provides(Runnable.class.getName(), props) + .impl(provider).build(); + + Object consumer = new Object() { + volatile Runnable m_provider; + @SuppressWarnings("unused") + void start() { + try { + ensure.step(1); + m_provider.run(); + } catch (UncheckedException e) { + ensure.step(2); + } + } + }; + Component consumerComp = component(m) + .impl(consumer) + .withSrv(Runnable.class, s->s.timeout(5000).filter("(target=" + getClass().getSimpleName() + ")")).build(); + m.add(consumerComp); + m.add(providerComp); + ensure.waitForStep(2, 5000); + m.clear(); + } + + static class UncheckedException extends RuntimeException { + } + + static interface TemporalServiceInterface { + public void invoke(); + } + + static class TemporalServiceProvider implements TemporalServiceInterface { + private final Ensure m_ensure; + public TemporalServiceProvider(Ensure e) { + m_ensure = e; + } + public void invoke() { + m_ensure.step(2); + } + } + + static class TemporalServiceProvider2 implements TemporalServiceInterface { + protected final Ensure m_ensure; + public TemporalServiceProvider2(Ensure e) { + m_ensure = e; + } + public void invoke() { + m_ensure.step(4); + } + } + + static class TemporalServiceConsumer implements Runnable { + protected volatile TemporalServiceInterface m_service; + protected final Ensure m_ensure; + + public TemporalServiceConsumer(Ensure e) { + m_ensure = e; + } + + public void init() { + m_ensure.step(1); + Thread t = new Thread(this); + t.start(); + } + + public void run() { + m_service.invoke(); + m_ensure.waitForStep(3, 15000); + m_service.invoke(); + } + + public void destroy() { + m_ensure.step(5); + } + } + + static class TemporalServiceConsumerWithCallback extends TemporalServiceConsumer { + public TemporalServiceConsumerWithCallback(Ensure e) { + super(e); + } + + public void add(TemporalServiceInterface service) { + m_service = service; + } + + public void remove(TemporalServiceInterface service) { + Assert.assertTrue(m_service == service); + m_ensure.step(6); + } + } + + public static class Adaptee { + } + + static class TemporalServiceConsumerAdapterWithCallback extends TemporalServiceConsumer { + volatile Adaptee m_adaptee; + + public TemporalServiceConsumerAdapterWithCallback(Ensure e) { + super(e); + } + + public void start() { + Assert.assertTrue(m_adaptee != null); + } + + public void add(TemporalServiceInterface service) { + m_service = service; + } + + public void remove(TemporalServiceInterface service) { + Assert.assertTrue(m_service == service); + m_ensure.step(6); + } + } +} Added: 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=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/TestBase.java (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/TestBase.java Sun Jan 31 23:27:05 2016 @@ -0,0 +1,354 @@ +/* + * 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.io.PrintWriter; +import java.io.StringWriter; +import java.util.Hashtable; +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +import org.apache.felix.dm.Component; +import org.apache.felix.dm.ComponentExecutorFactory; +import org.apache.felix.dm.DependencyManager; +import org.junit.Assert; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.BundleException; +import org.osgi.framework.Constants; +import org.osgi.framework.FrameworkEvent; +import org.osgi.framework.FrameworkListener; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.ServiceReference; +import org.osgi.framework.ServiceRegistration; +import org.osgi.service.log.LogService; + +import junit.framework.TestCase; + +/** + * Base class for all integration tests. + * + * @author <a href="mailto:[email protected]">Felix Project Team</a> + */ +public abstract class TestBase extends TestCase implements LogService, FrameworkListener { + // Default OSGI log service level. + protected final static int LOG_LEVEL = LogService.LOG_WARNING; + + // optional thread pool used by parallel dependency managers + private volatile ExecutorService m_threadPool; + + // flag used to check if the threadpool must be used for a given test. + protected volatile boolean m_parallel; + + // Flag used to check if some errors have been logged during the execution of a given test. + private volatile boolean m_errorsLogged; + + // We implement OSGI log service. + protected ServiceRegistration logService; + + // Our bundle context + protected BundleContext context; + + // Our dependency manager used to create test components. + protected volatile DependencyManager m_dm; + + // The Registration for the DM threadpool. + private ServiceRegistration m_componentExecutorFactoryReg; + + public TestBase() { + } + + protected void setParallel() { + m_parallel = true; + } + + public void setUp() throws Exception { + warn("Setting up test " + getClass().getName()); + context = FrameworkUtil.getBundle(this.getClass()).getBundleContext(); + Hashtable<String, Object> props = new Hashtable<>(); + props.put(Constants.SERVICE_RANKING, new Integer(Integer.MAX_VALUE)); + logService = context.registerService(LogService.class.getName(), this, props); + context.addFrameworkListener(this); + m_dm = new DependencyManager(context); + if (m_parallel) { + warn("Using threadpool ..."); + m_threadPool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); + m_componentExecutorFactoryReg = context.registerService(ComponentExecutorFactory.class.getName(), + new ComponentExecutorFactory() { + @Override + public Executor getExecutorFor(Component component) { + return m_threadPool; + } + }, + null); + } + } + + public void tearDown() throws Exception { + warn("Tearing down test " + getClass().getName()); + logService.unregister(); + context.removeFrameworkListener(this); + clearComponents(); + if (m_parallel && m_componentExecutorFactoryReg != null) { + m_componentExecutorFactoryReg.unregister(); + m_threadPool.shutdown(); + try { + m_threadPool.awaitTermination(60, TimeUnit.SECONDS); + } catch (InterruptedException e) { + } + } + Assert.assertFalse(errorsLogged()); + } + + protected DependencyManager getDM() { + return m_dm; + } + + protected void clearComponents() { + m_dm.clear(); + warn("All component cleared."); + } + + /** + * Creates and provides an Ensure object with a name service property into the OSGi service registry. + */ + protected ServiceRegistration register(Ensure e, String name) { + Hashtable<String, String> props = new Hashtable<String, String>(); + props.put("name", name); + return context.registerService(Ensure.class.getName(), e, props); + } + + /** + * Helper method used to stop a given bundle. + * + * @param symbolicName + * the symbolic name of the bundle to be stopped. + */ + protected void stopBundle(String symbolicName) { + // Stop the test.annotation bundle + boolean found = false; + for (Bundle b : context.getBundles()) { + if (b.getSymbolicName().equals(symbolicName)) { + try { + found = true; + b.stop(); + } catch (BundleException e) { + e.printStackTrace(); + } + } + } + if (!found) { + throw new IllegalStateException("bundle " + symbolicName + " not found"); + } + } + + /** + * Helper method used to start a given bundle. + * + * @param symbolicName + * the symbolic name of the bundle to be started. + */ + protected void startBundle(String symbolicName) { + // Stop the test.annotation bundle + boolean found = false; + for (Bundle b : context.getBundles()) { + if (b.getSymbolicName().equals(symbolicName)) { + try { + found = true; + b.start(); + } catch (BundleException e) { + e.printStackTrace(); + } + } + } + if (!found) { + throw new IllegalStateException("bundle " + symbolicName + " not found"); + } + } + + /** + * Helper method used to get a given bundle. + * + * @param symbolicName + * the symbolic name of the bundle to get. + */ + protected Bundle getBundle(String symbolicName) { + for (Bundle b : context.getBundles()) { + if (b.getSymbolicName().equals(symbolicName)) { + return b; + } + } + throw new IllegalStateException("bundle " + symbolicName + " not found"); + } + + /** + * Suspend the current thread for a while. + * + * @param n + * the number of milliseconds to wait for. + */ + protected void sleep(int ms) { + try { + Thread.sleep(ms); + } catch (InterruptedException e) { + } + } + + public void log(int level, String message) { + checkError(level, null); + if (LOG_LEVEL >= level) { + System.out.println(getLevel(level) + " - " + Thread.currentThread().getName() + " : " + message); + } + } + + public void log(int level, String message, Throwable exception) { + checkError(level, exception); + if (LOG_LEVEL >= level) { + StringBuilder sb = new StringBuilder(); + sb.append(getLevel(level) + " - " + Thread.currentThread().getName() + " : "); + sb.append(message); + parse(sb, exception); + System.out.println(sb.toString()); + } + } + + public void log(ServiceReference sr, int level, String message) { + checkError(level, null); + if (LOG_LEVEL >= level) { + StringBuilder sb = new StringBuilder(); + sb.append(getLevel(level) + " - " + Thread.currentThread().getName() + " : "); + sb.append(message); + System.out.println(sb.toString()); + } + } + + public void log(ServiceReference sr, int level, String message, Throwable exception) { + checkError(level, exception); + if (LOG_LEVEL >= level) { + StringBuilder sb = new StringBuilder(); + sb.append(getLevel(level) + " - " + Thread.currentThread().getName() + " : "); + sb.append(message); + parse(sb, exception); + System.out.println(sb.toString()); + } + } + + protected boolean errorsLogged() { + return m_errorsLogged; + } + + private void parse(StringBuilder sb, Throwable t) { + if (t != null) { + sb.append(" - "); + StringWriter buffer = new StringWriter(); + PrintWriter pw = new PrintWriter(buffer); + t.printStackTrace(pw); + sb.append(buffer.toString()); + m_errorsLogged = true; + } + } + + private String getLevel(int level) { + switch (level) { + case LogService.LOG_DEBUG : + return "DEBUG"; + case LogService.LOG_ERROR : + return "ERROR"; + case LogService.LOG_INFO : + return "INFO"; + case LogService.LOG_WARNING : + return "WARN"; + default : + return ""; + } + } + + private void checkError(int level, Throwable exception) { + if (level <= LOG_ERROR) { + m_errorsLogged = true; + } + if (exception != null) { + m_errorsLogged = true; + } + } + + public void frameworkEvent(FrameworkEvent event) { + int eventType = event.getType(); + String msg = getFrameworkEventMessage(eventType); + int level = (eventType == FrameworkEvent.ERROR) ? LOG_ERROR : LOG_WARNING; + if (msg != null) { + log(level, msg, event.getThrowable()); + } else { + log(level, "Unknown fwk event: " + event); + } + } + + private String getFrameworkEventMessage(int event) { + switch (event) { + case FrameworkEvent.ERROR : + return "FrameworkEvent: ERROR"; + case FrameworkEvent.INFO : + return "FrameworkEvent INFO"; + case FrameworkEvent.PACKAGES_REFRESHED : + return "FrameworkEvent: PACKAGE REFRESHED"; + case FrameworkEvent.STARTED : + return "FrameworkEvent: STARTED"; + case FrameworkEvent.STARTLEVEL_CHANGED : + return "FrameworkEvent: STARTLEVEL CHANGED"; + case FrameworkEvent.WARNING : + return "FrameworkEvent: WARNING"; + default : + return null; + } + } + + protected void warn(String msg, Object ... params) { + if (LOG_LEVEL >= LogService.LOG_WARNING) { + log(LogService.LOG_WARNING, params.length > 0 ? String.format(msg, params) : msg); + } + } + + @SuppressWarnings("unused") + protected void info(String msg, Object ... params) { + if (LOG_LEVEL >= LogService.LOG_INFO) { + log(LogService.LOG_INFO, params.length > 0 ? String.format(msg, params) : msg); + } + } + + @SuppressWarnings("unused") + protected void debug(String msg, Object ... params) { + if (LOG_LEVEL >= LogService.LOG_DEBUG) { + log(LogService.LOG_DEBUG, params.length > 0 ? String.format(msg, params) : msg); + } + } + + protected void error(String msg, Object ... params) { + log(LogService.LOG_ERROR, params.length > 0 ? String.format(msg, params) : msg); + } + + protected void error(String msg, Throwable err, Object ... params) { + log(LogService.LOG_ERROR, params.length > 0 ? String.format(msg, params) : msg, err); + } + + protected void error(Throwable err) { + log(LogService.LOG_ERROR, "error", err); + } +} Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/.classpath URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/.classpath?rev=1727869&view=auto ============================================================================== Binary file - no diff available. Propchange: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/.classpath ------------------------------------------------------------------------------ svn:mime-type = application/xml Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/.gitignore URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/.gitignore?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/.gitignore (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/.gitignore Sun Jan 31 23:27:05 2016 @@ -0,0 +1,3 @@ +/bin/ +/bin_test/ +/generated/ Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/.project URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/.project?rev=1727869&view=auto ============================================================================== Binary file - no diff available. Propchange: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/.project ------------------------------------------------------------------------------ svn:mime-type = application/xml Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/.settings/org.eclipse.jdt.core.prefs URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/.settings/org.eclipse.jdt.core.prefs?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/.settings/org.eclipse.jdt.core.prefs (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/.settings/org.eclipse.jdt.core.prefs Sun Jan 31 23:27:05 2016 @@ -0,0 +1,12 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.methodParameters=generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/bnd.bnd URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/bnd.bnd?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/bnd.bnd (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/bnd.bnd Sun Jan 31 23:27:05 2016 @@ -0,0 +1,18 @@ +-buildpath: \ + org.apache.felix.dependencymanager.lambda;version=latest,\ + org.apache.felix.dependencymanager;version=latest,\ + org.apache.felix.gogo.runtime;version=latest,\ + osgi.core;version=6.0,\ + osgi.cmpn;version=6.0,\ + biz.aQute.bnd.annotation + +Bundle-Version: 0.0.0.${tstamp} +-sub: *.bnd +-metatype: * +Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt +Bundle-DocURL: http://felix.apache.org/documentation/subprojects/apache-felix-dependency-manager.html +Bundle-Vendor: The Apache Software Foundation +-runproperties: \ + org.apache.felix.dependencymanager.loglevel=2,\ + org.apache.felix.log.maxSize=100000,\ + org.apache.felix.log.storeDebug=true \ No newline at end of file Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/build.gradle URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/build.gradle?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/build.gradle (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/build.gradle Sun Jan 31 23:27:05 2016 @@ -0,0 +1,3 @@ + tasks.withType(JavaCompile) { + options.compilerArgs << "-parameters" +} Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/compositefactory.bnd URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/compositefactory.bnd?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/compositefactory.bnd (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/compositefactory.bnd Sun Jan 31 23:27:05 2016 @@ -0,0 +1,2 @@ +Private-Package: org.apache.felix.dm.lambda.samples.compositefactory +Bundle-Activator: org.apache.felix.dm.lambda.samples.compositefactory.Activator \ No newline at end of file Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/compositefactory.bndrun URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/compositefactory.bndrun?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/compositefactory.bndrun (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/compositefactory.bndrun Sun Jan 31 23:27:05 2016 @@ -0,0 +1,19 @@ +-runfw: org.apache.felix.framework;version='[5.2.0,5.2.0]' +-runee: JavaSE-1.8 +-runsystemcapabilities: ${native_capability} + +-resolve.effective: active;skip:="osgi.service" + +-runbundles: \ + org.apache.felix.gogo.runtime,\ + org.apache.felix.gogo.shell,\ + org.apache.felix.gogo.command,\ + org.apache.felix.log;version=1.0.1,\ + org.apache.felix.configadmin;version=1.8.8,\ + org.apache.felix.metatype;version=1.1.2,\ + org.apache.felix.dependencymanager.lambda.samples.compositefactory;version=latest,\ + org.apache.felix.dependencymanager;version=4.2.0,\ + org.apache.felix.dependencymanager.shell;version=4.0.3,\ + org.apache.felix.dependencymanager.lambda;version=latest + + \ No newline at end of file Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/device.bnd URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/device.bnd?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/device.bnd (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/device.bnd Sun Jan 31 23:27:05 2016 @@ -0,0 +1,2 @@ +Private-Package: org.apache.felix.dm.lambda.samples.device +Bundle-Activator: org.apache.felix.dm.lambda.samples.device.Activator \ No newline at end of file Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/device.bndrun URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/device.bndrun?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/device.bndrun (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/device.bndrun Sun Jan 31 23:27:05 2016 @@ -0,0 +1,19 @@ +-runfw: org.apache.felix.framework;version='[5.2.0,5.2.0]' +-runee: JavaSE-1.8 +-runsystemcapabilities: ${native_capability} + +-resolve.effective: active;skip:="osgi.service" + +-runbundles: \ + org.apache.felix.gogo.runtime,\ + org.apache.felix.gogo.shell,\ + org.apache.felix.gogo.command,\ + org.apache.felix.log;version=1.0.1,\ + org.apache.felix.configadmin;version=1.8.8,\ + org.apache.felix.metatype;version=1.1.2,\ + org.apache.felix.dependencymanager.lambda.samples.device;version=latest,\ + org.apache.felix.dependencymanager;version=4.2.0,\ + org.apache.felix.dependencymanager.shell;version=4.0.3,\ + org.apache.felix.dependencymanager.lambda;version=latest + + \ No newline at end of file Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/dictionary.bnd URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/dictionary.bnd?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/dictionary.bnd (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/dictionary.bnd Sun Jan 31 23:27:05 2016 @@ -0,0 +1,2 @@ +Private-Package: org.apache.felix.dm.lambda.samples.dictionary +Bundle-Activator: org.apache.felix.dm.lambda.samples.dictionary.Activator \ No newline at end of file Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/dictionary.bndrun URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/dictionary.bndrun?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/dictionary.bndrun (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/dictionary.bndrun Sun Jan 31 23:27:05 2016 @@ -0,0 +1,26 @@ +-runfw: org.apache.felix.framework;version='[5.2.0,5.2.0]' +-runee: JavaSE-1.8 +-runsystemcapabilities: ${native_capability} + +-resolve.effective: active;skip:="osgi.service" + +-runbundles: \ + org.apache.felix.gogo.runtime,\ + org.apache.felix.gogo.shell,\ + org.apache.felix.gogo.command,\ + org.apache.felix.log;version=1.0.1,\ + org.apache.felix.configadmin;version=1.8.8,\ + org.apache.felix.metatype;version=1.1.2,\ + org.apache.felix.dependencymanager.lambda.samples.dictionary;version=latest,\ + org.apache.felix.dependencymanager;version=4.2.0,\ + org.apache.felix.dependencymanager.shell;version=4.0.3,\ + org.apache.felix.dependencymanager.lambda;version=latest,\ + org.apache.felix.eventadmin;version=1.4.3,\ + biz.aQute.bndlib;version=2.3.0,\ + org.apache.felix.webconsole;version=4.2.2,\ + org.apache.felix.http.api;version=2.3.0,\ + org.apache.felix.http.servlet-api;version=1.0.0,\ + org.apache.felix.http.jetty;version="[2.3.0,2.3.0]" + + + \ No newline at end of file Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/factory.bnd URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/factory.bnd?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/factory.bnd (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/factory.bnd Sun Jan 31 23:27:05 2016 @@ -0,0 +1,2 @@ +Private-Package: org.apache.felix.dm.lambda.samples.factory +Bundle-Activator: org.apache.felix.dm.lambda.samples.factory.Activator \ No newline at end of file Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/factory.bndrun URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/factory.bndrun?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/factory.bndrun (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/factory.bndrun Sun Jan 31 23:27:05 2016 @@ -0,0 +1,19 @@ +-runfw: org.apache.felix.framework;version='[5.2.0,5.2.0]' +-runee: JavaSE-1.8 +-runsystemcapabilities: ${native_capability} + +-resolve.effective: active;skip:="osgi.service" + +-runbundles: \ + org.apache.felix.gogo.runtime,\ + org.apache.felix.gogo.shell,\ + org.apache.felix.gogo.command,\ + org.apache.felix.log;version=1.0.1,\ + org.apache.felix.configadmin;version=1.8.8,\ + org.apache.felix.metatype;version=1.1.2,\ + org.apache.felix.dependencymanager.lambda.samples.factory;version=latest,\ + org.apache.felix.dependencymanager;version=4.2.0,\ + org.apache.felix.dependencymanager.shell;version=4.0.3,\ + org.apache.felix.dependencymanager.lambda;version=latest + + \ No newline at end of file Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/future.bnd URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/future.bnd?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/future.bnd (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/future.bnd Sun Jan 31 23:27:05 2016 @@ -0,0 +1,2 @@ +Private-Package: org.apache.felix.dm.lambda.samples.future +Bundle-Activator: org.apache.felix.dm.lambda.samples.future.Activator Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/future.bndrun URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/future.bndrun?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/future.bndrun (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/future.bndrun Sun Jan 31 23:27:05 2016 @@ -0,0 +1,17 @@ +-runfw: org.apache.felix.framework;version='[5.2.0,5.2.0]' +-runee: JavaSE-1.8 +-runsystemcapabilities: ${native_capability} + +-resolve.effective: active;skip:="osgi.service" + +-runbundles: \ + org.apache.felix.gogo.runtime,\ + org.apache.felix.gogo.shell,\ + org.apache.felix.gogo.command,\ + org.apache.felix.log;version=1.0.1,\ + org.apache.felix.configadmin;version=1.8.8,\ + org.apache.felix.metatype;version=1.1.2,\ + org.apache.felix.dependencymanager.lambda.samples.future;version=latest,\ + org.apache.felix.dependencymanager;version=4.2.0,\ + org.apache.felix.dependencymanager.shell;version=4.0.3,\ + org.apache.felix.dependencymanager.lambda;version=latest Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/hello.bnd URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/hello.bnd?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/hello.bnd (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/hello.bnd Sun Jan 31 23:27:05 2016 @@ -0,0 +1,2 @@ +Private-Package: org.apache.felix.dm.lambda.samples.hello +Bundle-Activator: org.apache.felix.dm.lambda.samples.hello.Activator \ No newline at end of file Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/hello.bndrun URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/hello.bndrun?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/hello.bndrun (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/hello.bndrun Sun Jan 31 23:27:05 2016 @@ -0,0 +1,19 @@ +-runfw: org.apache.felix.framework;version='[5.2.0,5.2.0]' +-runee: JavaSE-1.8 +-runsystemcapabilities: ${native_capability} + +-resolve.effective: active;skip:="osgi.service" + +-runbundles: \ + org.apache.felix.gogo.runtime,\ + org.apache.felix.gogo.shell,\ + org.apache.felix.gogo.command,\ + org.apache.felix.log;version=1.0.1,\ + org.apache.felix.configadmin;version=1.8.8,\ + org.apache.felix.metatype;version=1.1.2,\ + org.apache.felix.dependencymanager.lambda.samples.hello;version=latest,\ + org.apache.felix.dependencymanager;version=4.2.0,\ + org.apache.felix.dependencymanager.shell;version=4.0.3,\ + org.apache.felix.dependencymanager.lambda;version=latest + + \ No newline at end of file Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/.gitignore URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/.gitignore?rev=1727869&view=auto ============================================================================== (empty) Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Activator.java URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Activator.java?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Activator.java (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Activator.java Sun Jan 31 23:27:05 2016 @@ -0,0 +1,63 @@ +/* + * 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.samples.compositefactory; + +import static java.lang.System.out; + +import org.apache.felix.dm.lambda.DependencyManagerActivator; +import org.osgi.service.cm.ConfigurationAdmin; +import org.osgi.service.log.LogService; + +/** + * Creates a "Provider" service. The implementation for this service (ProviderImpl) is + * created using a factory class (ProviderFactory) that also creates some other helper classes + * (ProviderComposite1 and ProviderComposite2) that are internally used by ProviderImpl. + * + * The ProviderFactory is also injected with a Configuration that can be used by the Factory + * when creating the ProviderImpl, ProviderComposite1, and ProviderComposite2 classes. + * + * The LogService in only injected to the ProviderImpl and the ProviderComposite1 classes. + * Both composites are called in their "start" callbacks, when all required dependencies are available. + * + * @author <a href="mailto:[email protected]">Felix Project Team</a> + */ +public class Activator extends DependencyManagerActivator { + @Override + public void activate() throws Exception { + out.println("type \"log info\" to see the logs emitted by this test."); + + // Create the Factory used to instantiate ProvuderImpl, ProviderComposite1 and ProviderComposite2 + ProviderFactory factory = new ProviderFactory(); + + // Define the component which implementation is instantiated by the ProviderFactory. + // a LogService is injected in the ProviderImpl, as well as to the ProviderComposite1 class. + // And a configuration is injected directly to the ProviderFactory so it can use some configurations + // before creating the composition of classes. + component(comp -> comp + .factory(factory::create, factory::getComposition) + .start(ProviderImpl::start) // only call start on ProviderImpl + .withSrv(LogService.class, srv -> srv.cb(ProviderImpl::bind).cb(ProviderComposite1::bind)) + .withCnf(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 + .impl(Configurator.class) + .withSrv(ConfigurationAdmin.class)); + } +} Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Configurator.java URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Configurator.java?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Configurator.java (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Configurator.java Sun Jan 31 23:27:05 2016 @@ -0,0 +1,20 @@ +package org.apache.felix.dm.lambda.samples.compositefactory; + +import java.io.IOException; +import java.util.Dictionary; +import java.util.Hashtable; + +import org.osgi.service.cm.Configuration; +import org.osgi.service.cm.ConfigurationAdmin; + +public class Configurator { + volatile ConfigurationAdmin m_cm; // injected by reflection. + + void start() throws IOException { + // Configure the ServiceConsumer component + Configuration c = m_cm.getConfiguration(ProviderFactory.class.getName(), null); + Dictionary<String, Object> props = new Hashtable<>(); + props.put("foo", "bar"); + c.update(props); + } +} Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Provider.java URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Provider.java?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Provider.java (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Provider.java Sun Jan 31 23:27:05 2016 @@ -0,0 +1,26 @@ +/* + * 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.samples.compositefactory; + +/** + * @author <a href="mailto:[email protected]">Felix Project Team</a> + */ +public interface Provider { + +} Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderComposite1.java URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderComposite1.java?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderComposite1.java (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderComposite1.java Sun Jan 31 23:27:05 2016 @@ -0,0 +1,36 @@ +/* + * 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.samples.compositefactory; + +import org.osgi.service.log.LogService; + +/** + * @author <a href="mailto:[email protected]">Felix Project Team</a> + */ +public class ProviderComposite1 { + private volatile LogService m_log; + + public void bind(LogService log) { + m_log = log; + } + + void start() { + m_log.log(LogService.LOG_INFO, "ProviderParticipant1.start()"); + } +} Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderComposite2.java URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderComposite2.java?rev=1727869&view=auto ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderComposite2.java (added) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderComposite2.java Sun Jan 31 23:27:05 2016 @@ -0,0 +1,26 @@ +/* + * 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.samples.compositefactory; + +/** + * @author <a href="mailto:[email protected]">Felix Project Team</a> + */ +public class ProviderComposite2 { + +}
