Added: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ComponentTest.java URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ComponentTest.java?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ComponentTest.java (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ComponentTest.java Thu Nov 12 22:26:29 2015 @@ -0,0 +1,94 @@ +/* + * 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.java.itest; + +import static org.apache.felix.dm.builder.java.DependencyActivatorBase.component; + +import java.util.Map; + +import org.apache.felix.dm.DependencyManager; +import org.junit.Assert; + +/** + * @author <a href="mailto:[email protected]">Felix Project Team</a> + */ +public class ComponentTest extends TestBase { + private final Ensure m_ensure = new Ensure(); + + public void testSimple() throws Exception { + final DependencyManager dm = getDM(); + + java.util.function.Consumer<Provider> cons = (p) -> System.out.println("Injected provider: " + p); + + // Create consumer (dependency is required by default using builder api). + + component(dm, comp -> comp + .factory(Consumer::new) + .withService(Provider.class, srv -> srv.filter("(name=provider2)").onAdd(cons::accept).onAdd(Consumer::add).onRemove(Consumer::remove)) + .withService(Provider.class, srv -> srv.filter("(name=provider1)").autoConfig("m_autoConfiguredProvider"))); + + // Create providers (auto added to dependency manager) + component(dm, comp -> comp + .impl(new Provider() { public String toString() { return "provider1";}}) + .provides(Provider.class).properties("name", "provider1")); + + component(dm, comp -> comp + .impl(new Provider() { public String toString() { return "provider2";}}) + .provides(Provider.class).properties("name", "provider2")); + + m_ensure.waitForStep(2, 5000); + dm.clear(); + m_ensure.waitForStep(5, 5000); + } + + public static interface Provider { + } + + public class Consumer { + Provider m_provider; + Provider m_autoConfiguredProvider; + + @SuppressWarnings("rawtypes") + void add(Provider provider, Map props) { + Assert.assertNotNull(provider); + Assert.assertEquals("provider2", props.get("name")); + m_provider = provider; + m_ensure.step(1); + } + + void start() { + Assert.assertNotNull(m_autoConfiguredProvider); + Assert.assertEquals("provider1", m_autoConfiguredProvider.toString()); + m_ensure.step(2); + } + + void stop() { + m_ensure.step(3); + } + + void destroy() { + m_ensure.step(4); + } + + void remove(Provider provider) { + Assert.assertEquals(m_provider, provider); + m_ensure.step(5); + } + } +}
Added: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/Ensure.java URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/Ensure.java?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/Ensure.java (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/Ensure.java Thu Nov 12 22:26:29 2015 @@ -0,0 +1,174 @@ +/* + * 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.java.itest; + +import java.io.PrintStream; + +import org.junit.Assert; + +/** + * Helper class to make sure that steps in a test happen in the correct order. Instantiate + * this class and subsequently invoke <code>step(nr)</code> with steps starting at 1. You + * can also have threads wait until you arrive at a certain step. + * + * @author <a href="mailto:[email protected]">Felix Project Team</a> + */ +public class Ensure { + private final boolean DEBUG; + private static long INSTANCE = 0; + private static final int RESOLUTION = 100; + private static PrintStream STREAM = System.out; + int step = 0; + private Throwable m_throwable; + + public Ensure() { + this(true); + } + + public Ensure(boolean debug) { + DEBUG = debug; + if (DEBUG) { + INSTANCE++; + } + } + + public void setStream(PrintStream output) { + STREAM = output; + } + + /** + * Mark this point as step <code>nr</code>. + * + * @param nr the step we are in + */ + public synchronized void step(int nr) { + step++; + Assert.assertEquals(nr, step); + if (DEBUG) { + String info = getLineInfo(3); + STREAM.println("[Ensure " + INSTANCE + "] step " + step + " [" + currentThread() + "] " + info); + } + notifyAll(); + } + + private String getLineInfo(int depth) { + StackTraceElement[] trace = Thread.currentThread().getStackTrace(); + String info = trace[depth].getClassName() + "." + trace[depth].getMethodName() + ":" + trace[depth].getLineNumber(); + return info; + } + + /** + * Mark this point as the next step. + */ + public synchronized void step() { + step++; + if (DEBUG) { + String info = getLineInfo(3); + STREAM.println("[Ensure " + INSTANCE + "] next step " + step + " [" + currentThread() + "] " + info); + } + notifyAll(); + } + + /** + * Wait until we arrive at least at step <code>nr</code> in the process, or fail if that + * takes more than <code>timeout</code> milliseconds. If you invoke wait on a thread, + * you are effectively assuming some other thread will invoke the <code>step(nr)</code> + * method. + * + * @param nr the step to wait for + * @param timeout the number of milliseconds to wait + */ + public synchronized void waitForStep(int nr, int timeout) { + final int initialTimeout = timeout; + if (DEBUG) { + String info = getLineInfo(3); + STREAM.println("[Ensure " + INSTANCE + "] waiting for step " + nr + " [" + currentThread() + "] " + info); + } + while (step < nr && timeout > 0) { + try { + wait(RESOLUTION); + timeout -= RESOLUTION; + } + catch (InterruptedException e) {} + } + if (step < nr) { + throw new IllegalStateException("Timed out waiting for " + initialTimeout + " ms for step " + nr + ", we are still at step " + step); + } + if (DEBUG) { + String info = getLineInfo(3); + STREAM.println("[Ensure " + INSTANCE + "] arrived at step " + nr + " [" + currentThread() + "] " + info); + } + } + + private String currentThread() { + Thread thread = Thread.currentThread(); + return thread.getId() + " " + thread.getName(); + } + + public static Runnable createRunnableStep(final Ensure ensure, final int nr) { + return new Runnable() { public void run() { ensure.step(nr); }}; + } + + public synchronized void steps(Steps steps) { + steps.next(this); + } + + /** + * Helper class for naming a list of step numbers. If used with the steps(Steps) method + * you can define at which steps in time this point should be passed. That means you can + * check methods that will get invoked multiple times during a test. + */ + public static class Steps { + private final int[] m_steps; + private int m_stepIndex; + + /** + * Create a list of steps and initialize the step counter to zero. + */ + public Steps(int... steps) { + m_steps = steps; + m_stepIndex = 0; + } + + /** + * Ensure we're at the right step. Will throw an index out of bounds exception if we enter this step more often than defined. + */ + public void next(Ensure ensure) { + ensure.step(m_steps[m_stepIndex++]); + } + } + + /** + * Saves a thrown exception that occurred in a different thread. You can only save one exception + * at a time this way. + */ + public synchronized void throwable(Throwable throwable) { + m_throwable = throwable; + } + + /** + * Throws a <code>Throwable</code> if one occurred in a different thread and that thread saved it + * using the <code>throwable()</code> method. + */ + public synchronized void ensure() throws Throwable { + if (m_throwable != null) { + throw m_throwable; + } + } +} Added: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ResourceProvider.java URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ResourceProvider.java?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ResourceProvider.java (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ResourceProvider.java Thu Nov 12 22:26:29 2015 @@ -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.java.itest; + +import java.net.URL; +import java.util.Dictionary; +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.apache.felix.dm.ResourceHandler; +import org.apache.felix.dm.ResourceUtil; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Filter; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; + +/** + * @author <a href="mailto:[email protected]">Felix Project Team</a> + */ +class ResourceProvider { + final URL[] m_resources; + final BundleContext m_context; + final Map<ResourceHandler, Filter> m_handlers = new HashMap<>(); + + ResourceProvider(BundleContext ctx, URL ... resources) { + m_context = ctx; + m_resources = resources; + } + + public void change() { + for (int i = 0; i < m_resources.length; i++) { + change(i); + } + } + + @SuppressWarnings({ "deprecation", "unchecked" }) + public void change(int resourceIndex) { + Map<ResourceHandler, Filter> handlers = new HashMap<>(); + synchronized (m_handlers) { + handlers.putAll(m_handlers); + } + for (Map.Entry<ResourceHandler, Filter> e : handlers.entrySet()) { + ResourceHandler handler = e.getKey(); + Filter filter = e.getValue(); + if (filter == null || filter.match((Dictionary<String, ? >)ResourceUtil.createProperties(m_resources[resourceIndex]))) { + handler.changed(m_resources[resourceIndex]); + } + } + } + + @SuppressWarnings({ "deprecation", "unchecked" }) + public void add(ResourceHandler handler, ServiceReference<ResourceHandler> ref) { + String filterString = (String) ref.getProperty("filter"); + Filter filter = null; + if (filterString != null) { + try { + filter = m_context.createFilter(filterString); + } + catch (InvalidSyntaxException e) { + Assert.fail("Could not create filter for resource handler: " + e); + return; + } + } + for (int i = 0; i < m_resources.length; i++) { + if (filter == null || filter.match((Dictionary<String, ? >) ResourceUtil.createProperties(m_resources[i]))) { + synchronized (m_handlers) { + m_handlers.put(handler, filter); + } + handler.added(m_resources[i]); + } + } + } + + public void remove(ResourceHandler handler, ServiceReference<ResourceHandler> ref) { + Filter filter; + synchronized (m_handlers) { + filter = (Filter) m_handlers.remove(handler); + } + if (filter != null) { + removeResources(handler, filter); + } + } + + @SuppressWarnings({ "deprecation", "unchecked" }) + private void removeResources(ResourceHandler handler, Filter filter) { + for (int i = 0; i < m_resources.length; i++) { + if (filter == null || filter.match((Dictionary<String, ? >)ResourceUtil.createProperties(m_resources[i]))) { + handler.removed(m_resources[i]); + } + } + } + + public void destroy() { + Map<ResourceHandler, Filter> handlers = new HashMap<>(); + synchronized (m_handlers) { + handlers.putAll(m_handlers); + } + + for (Map.Entry<ResourceHandler, Filter> e : handlers.entrySet()) { + ResourceHandler handler = e.getKey(); + Filter filter = e.getValue(); + removeResources(handler, filter); + } + } +} Added: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ServiceDependencyTest.java URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ServiceDependencyTest.java?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ServiceDependencyTest.java (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ServiceDependencyTest.java Thu Nov 12 22:26:29 2015 @@ -0,0 +1,97 @@ +/* + * 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.java.itest; + +import static org.apache.felix.dm.builder.java.DependencyActivatorBase.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, comp -> comp.autoAdd(false).impl(new ServiceProvider(e)).provides(ServiceInterface.class)); + Component sc = component(m, comp -> comp.autoAdd(false).impl(new ServiceConsumer(e)).withService(ServiceInterface.class)); + + Component sc2 = component(m, comp -> comp.autoAdd(false).impl(new ServiceConsumerCallbacks(e)) + .withService(ServiceInterface.class, srv -> srv.required(false).onAdd(ServiceConsumerCallbacks::add).onRemove(ServiceConsumerCallbacks::remove))); + + 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/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ServiceDependencyThroughCallbackInstanceTest.java URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ServiceDependencyThroughCallbackInstanceTest.java?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ServiceDependencyThroughCallbackInstanceTest.java (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ServiceDependencyThroughCallbackInstanceTest.java Thu Nov 12 22:26:29 2015 @@ -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.builder.java.itest; + +import org.junit.Assert; + +import org.apache.felix.dm.DependencyManager; +import org.osgi.framework.BundleContext; +import static org.apache.felix.dm.builder.java.DependencyActivatorBase.component; + +/** + * @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() {}) + .withService(Service.class, srv -> srv.onAdd(instance::added).onRemove(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/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ServiceUpdateTest.java URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ServiceUpdateTest.java?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ServiceUpdateTest.java (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ServiceUpdateTest.java Thu Nov 12 22:26:29 2015 @@ -0,0 +1,146 @@ +/* + * 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.java.itest; + +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; +import static org.apache.felix.dm.builder.java.DependencyActivatorBase.component; + +/** + * @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)) + .withService(ServiceInterface.class, srv -> srv + .onAdd(ServiceProvider::add).onChange(ServiceProvider::change).onRemove(ServiceProvider::remove))); + component(m, comp -> comp + .impl(provider) + .withService(ResourceHandler.class, srv -> srv.onAdd(ResourceProvider::add).onRemove(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"); + } + 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/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ServiceUtil.java URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ServiceUtil.java?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ServiceUtil.java (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/ServiceUtil.java Thu Nov 12 22:26:29 2015 @@ -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.builder.java.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/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/TestBase.java URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/TestBase.java?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/TestBase.java (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.itest/src/org/apache/felix/dm/builder/java/itest/TestBase.java Thu Nov 12 22:26:29 2015 @@ -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.builder.java.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.junit.Assert; +import junit.framework.TestCase; + +import org.apache.felix.dm.Component; +import org.apache.felix.dm.ComponentExecutorFactory; +import org.apache.felix.dm.DependencyManager; +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; + +/** + * 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/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/.classpath URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/.classpath?rev=1714132&view=auto ============================================================================== Binary file - no diff available. Propchange: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/.classpath ------------------------------------------------------------------------------ svn:mime-type = application/xml Added: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/.gitignore URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/.gitignore?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/.gitignore (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/.gitignore Thu Nov 12 22:26:29 2015 @@ -0,0 +1,3 @@ +/bin/ +/bin_test/ +/generated/ Added: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/.project URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/.project?rev=1714132&view=auto ============================================================================== Binary file - no diff available. Propchange: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/.project ------------------------------------------------------------------------------ svn:mime-type = application/xml Added: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/bnd.bnd URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/bnd.bnd?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/bnd.bnd (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/bnd.bnd Thu Nov 12 22:26:29 2015 @@ -0,0 +1,60 @@ +# +# 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. +# +javac.source: 1.8 +javac.target: 1.8 +Bundle-Version: 1.0.0 +-runsystempackages: sun.reflect +-buildpath: \ + org.apache.felix.dependencymanager;version=latest,\ + org.apache.felix.gogo.runtime;version=latest,\ + biz.aQute.bnd.annotation,\ + org.apache.felix.dependencymanager.builder.java;version=latest,\ + osgi.core;version=6.0,\ + osgi.cmpn;version=6.0 +-runfw: org.apache.felix.framework;version='[5.2.0,5.2.0]' +-runee: JavaSE-1.8 +-runproperties: \ + org.apache.felix.dependencymanager.runtime.log=warn,\ + org.apache.felix.dependencymanager.loglevel=2,\ + org.apache.felix.log.maxSize=100000,\ + org.apache.felix.log.storeDebug=true + +-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 + +-runbundles: \ + org.apache.felix.dependencymanager;version=latest,\ + org.apache.felix.metatype;version=1.0.4,\ + org.apache.felix.log;version=1.0.1,\ + org.apache.felix.gogo.command;version=0.14.0,\ + org.apache.felix.gogo.runtime;version=0.12.0,\ + org.apache.felix.gogo.shell;version=0.10.0,\ + org.apache.felix.dependencymanager.shell;version=latest,\ + org.apache.felix.configadmin;version=1.8.0,\ + 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]",\ + org.apache.felix.dependencymanager.builder.java;version=latest,\ + net.jodah.typetools;version=0.4.5 + Added: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/compositefactory.bnd URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/compositefactory.bnd?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/compositefactory.bnd (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/compositefactory.bnd Thu Nov 12 22:26:29 2015 @@ -0,0 +1,3 @@ +Private-Package: \ + org.apache.felix.dependencymanager.samples.compositefactory +Bundle-Activator: org.apache.felix.dependencymanager.samples.compositefactory.Activator Added: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/device.bnd URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/device.bnd?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/device.bnd (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/device.bnd Thu Nov 12 22:26:29 2015 @@ -0,0 +1,3 @@ +Private-Package: \ + org.apache.felix.dependencymanager.samples.device +Bundle-Activator: org.apache.felix.dependencymanager.samples.device.Activator Added: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/dictionary.bnd URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/dictionary.bnd?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/dictionary.bnd (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/dictionary.bnd Thu Nov 12 22:26:29 2015 @@ -0,0 +1,3 @@ +Private-Package: \ + org.apache.felix.dependencymanager.samples.dictionary +Bundle-Activator: org.apache.felix.dependencymanager.samples.dictionary.Activator Added: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/factory.bnd URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/factory.bnd?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/factory.bnd (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/factory.bnd Thu Nov 12 22:26:29 2015 @@ -0,0 +1,3 @@ +Private-Package: \ + org.apache.felix.dependencymanager.samples.factory +Bundle-Activator: org.apache.felix.dependencymanager.samples.factory.Activator \ No newline at end of file Added: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/hello.bnd URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/hello.bnd?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/hello.bnd (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/hello.bnd Thu Nov 12 22:26:29 2015 @@ -0,0 +1,20 @@ +# +# 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. +# +Private-Package: \ + org.apache.felix.dependencymanager.samples.hello +Bundle-Activator: org.apache.felix.dependencymanager.samples.hello.Activator + Added: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/.gitignore URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/.gitignore?rev=1714132&view=auto ============================================================================== (empty) Added: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/Activator.java URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/Activator.java?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/Activator.java (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/Activator.java Thu Nov 12 22:26:29 2015 @@ -0,0 +1,44 @@ +/* + * 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.dependencymanager.samples.compositefactory; + +import org.apache.felix.dm.builder.java.DependencyActivatorBase; +import org.osgi.service.cm.ConfigurationAdmin; +import org.osgi.service.log.LogService; + +/** + * Defines a factory that also returns a composition. + * The LogService in only injected to the ProviderImpl and the ProviderParticipant1. + * + * @author <a href="mailto:[email protected]">Felix Project Team</a> + */ +public class Activator extends DependencyActivatorBase { + @Override + public void init() throws Exception { + CompositionManager compositionMngr = new CompositionManager(); + + component(comp -> comp + .factory(compositionMngr::create, compositionMngr::getComposition) + .withService(LogService.class, srv -> srv.onAdd(ProviderImpl::bind).onAdd(ProviderParticipant1::bind)) + .withConfiguration(conf -> conf.pid(CompositionManager.class).onUpdate(compositionMngr::updated))); + + component(comp -> comp + .impl(Configurator.class).withService(ConfigurationAdmin.class)); + } +} Added: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/CompositionManager.java URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/CompositionManager.java?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/CompositionManager.java (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/CompositionManager.java Thu Nov 12 22:26:29 2015 @@ -0,0 +1,58 @@ +/* + * 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.dependencymanager.samples.compositefactory; + +import java.util.Dictionary; + +/** + * Pojo used to create all the objects composition used to implements the "Provider" Service. + * The manager is using a Configuration injected by Config Admin, in order to configure the + * various objects being part of the "Provider" service implementation. + * + * @author <a href="mailto:[email protected]">Felix Project Team</a> + */ +public class CompositionManager { + private ProviderParticipant1 m_participant1; + private ProviderParticipant2 m_participant2; + private ProviderImpl m_providerImpl; + @SuppressWarnings("unused") + private Dictionary<String, Object> m_conf; + + public void updated(Dictionary<String, Object> conf) { + // validate configuration and throw an exception if the properties are invalid + m_conf = conf; + } + + /** + * Builds the composition of objects used to implement the "Provider" service. + * The Configuration injected by Config Admin will be used to configure the components + * @return The "main" object providing the "Provider" service. + */ + Object create() { + // Here, we can instantiate our object composition and configure them using the injected Configuration ... + m_participant1 = new ProviderParticipant1(); // possibly configure this object using our configuration + m_participant2 = new ProviderParticipant2(); // possibly configure this object using our configuration + m_providerImpl = new ProviderImpl(m_participant1, m_participant2); + return m_providerImpl; // Main object implementing the Provider service + } + + Object[] getComposition() { + return new Object[] { m_providerImpl, m_participant1, m_participant2 }; + } +} Added: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/Configurator.java URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/Configurator.java?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/Configurator.java (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/Configurator.java Thu Nov 12 22:26:29 2015 @@ -0,0 +1,20 @@ +package org.apache.felix.dependencymanager.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(CompositionManager.class.getName(), null); + Dictionary<String, Object> props = new Hashtable<>(); + props.put("foo", "bar"); + c.update(props); + } +} Added: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/Provider.java URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/Provider.java?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/Provider.java (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/Provider.java Thu Nov 12 22:26:29 2015 @@ -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.dependencymanager.samples.compositefactory; + +/** + * @author <a href="mailto:[email protected]">Felix Project Team</a> + */ +public interface Provider { + +} Added: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/ProviderImpl.java URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/ProviderImpl.java?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/ProviderImpl.java (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/ProviderImpl.java Thu Nov 12 22:26:29 2015 @@ -0,0 +1,49 @@ +/* + * 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.dependencymanager.samples.compositefactory; + +import org.osgi.service.log.LogService; + +/** + * This is the main implementation for our "Provider" service. + * This service is using a composition of two participants, which are used to provide the service + * (ProviderParticipant1, and ProviderParticipant2). + * + * This class is instantiated by the CompositionManager class. + * + * @author <a href="mailto:[email protected]">Felix Project Team</a> + */ +public class ProviderImpl implements Provider { + private final ProviderParticipant1 m_participant1; + private final ProviderParticipant2 m_participant2; + private volatile LogService m_log; + + public void bind(LogService log) { + m_log = log; + } + + ProviderImpl(ProviderParticipant1 participant1, ProviderParticipant2 participant2) { + m_participant1 = participant1; + m_participant2 = participant2; + } + + void start() { + m_log.log(LogService.LOG_INFO, "ProviderImpl.start(): participants=" + m_participant1 + "," + m_participant2); + } +} Added: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/ProviderParticipant1.java URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/ProviderParticipant1.java?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/ProviderParticipant1.java (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/ProviderParticipant1.java Thu Nov 12 22:26:29 2015 @@ -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.dependencymanager.samples.compositefactory; + +import org.osgi.service.log.LogService; + +/** + * @author <a href="mailto:[email protected]">Felix Project Team</a> + */ +public class ProviderParticipant1 { + 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/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/ProviderParticipant2.java URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/ProviderParticipant2.java?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/ProviderParticipant2.java (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/ProviderParticipant2.java Thu Nov 12 22:26:29 2015 @@ -0,0 +1,40 @@ +/* + * 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.dependencymanager.samples.compositefactory; + +import org.osgi.service.log.LogService; + +/** + * @author <a href="mailto:[email protected]">Felix Project Team</a> + */ +public class ProviderParticipant2 { + private volatile LogService m_log; + + public void bind(LogService log) { + m_log = log; + } + + void start() { + if (m_log != null) { + m_log.log(LogService.LOG_INFO, "ProviderParticipant1.start()"); + } else { + System.out.println("ProviderParticipant2::start"); + } + } +} Added: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/README URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/README?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/README (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/compositefactory/README Thu Nov 12 22:26:29 2015 @@ -0,0 +1,32 @@ +/* + * 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. + */ + +This Activator is an example usage of DM composite components. A composite component is implemented +using a composition of multiple object instances, which are used to implement a given service. + +The sample also uses a Factory approach in order to instantiate the composition of objects: A +"CompositionManager" is first injected with a Configuration that can be possibly be used to create +and configure all the composites. + +Dependencies are injected in all objects in the composition. + +To see logs, type this command under the gogo shell: + +g! log info|grep compositefactory + + + Added: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/device/Activator.java URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/device/Activator.java?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/device/Activator.java (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/device/Activator.java Thu Nov 12 22:26:29 2015 @@ -0,0 +1,50 @@ +/* + * 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.dependencymanager.samples.device; + +import org.apache.felix.dm.builder.java.DependencyActivatorBase; +import org.osgi.service.log.LogService; + +/** + * @author <a href="mailto:[email protected]">Felix Project Team</a> + */ +public class Activator extends DependencyActivatorBase { + @Override + public void init() throws Exception { + createDeviceAndParameter(1); + createDeviceAndParameter(2); + + adapter(Device.class, comp -> comp.provides(DeviceAccess.class).impl(DeviceAccessImpl.class)); + + component(comp -> comp + .impl(DeviceAccessConsumer.class) + .withService(LogService.class) + .withService(DeviceAccess.class, srv -> srv.onAdd(DeviceAccessConsumer::add))); + } + + private void createDeviceAndParameter(int id) { + component(buicomplder -> buicomplder + .provides(Device.class).properties("device.id", id) + .factory(() -> new DeviceImpl(id))); + + component(comp -> comp + .provides(DeviceParameter.class).properties("device.id", id) + .factory(() -> new DeviceParameterImpl(id))); + } +} Added: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/device/Device.java URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/device/Device.java?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/device/Device.java (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/device/Device.java Thu Nov 12 22:26:29 2015 @@ -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.dependencymanager.samples.device; + +/** + * @author <a href="mailto:[email protected]">Felix Project Team</a> + */ +public interface Device { + int getDeviceId(); +} Added: felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/device/DeviceAccess.java URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/device/DeviceAccess.java?rev=1714132&view=auto ============================================================================== --- felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/device/DeviceAccess.java (added) +++ felix/sandbox/pderop/dependencymanager.builder.java/org.apache.felix.dependencymanager.builder.java.samples/src/org/apache/felix/dependencymanager/samples/device/DeviceAccess.java Thu Nov 12 22:26:29 2015 @@ -0,0 +1,30 @@ +/* + * 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.dependencymanager.samples.device; + +/** + * Provides unified access to a pair of Device/DeviceParameter services having the same device ID. + + * @author <a href="mailto:[email protected]">Felix Project Team</a> + */ +public interface DeviceAccess { + Device getDevice(); + + DeviceParameter getDeviceParameter(); +}
