Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/ResourceComponent.java URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/ResourceComponent.java?rev=1849304&r1=1849303&r2=1849304&view=diff ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/ResourceComponent.java (original) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/ResourceComponent.java Wed Dec 19 14:40:48 2018 @@ -18,6 +18,10 @@ */ package org.apache.felix.dm; +import java.util.Dictionary; + +import org.apache.felix.dm.Component.ServiceScope; + /** * Interface used to configure the various parameters needed when defining * a Dependency Manager resource adapter component. @@ -40,7 +44,7 @@ package org.apache.felix.dm; * public class Activator extends DependencyActivatorBase { * &Override * public void init(BundleContext context, DependencyManager dm) throws Exception { - * Component resourceComponent = dm.createResourceComponent() + * ResourceComponent resourceComponent = dm.createResourceComponent() * .setResourceFilter("(path=/videos/*.mkv)") * .setInterface(VideoPlayer.class, null) * .setImplementation(VideoPlayerImpl.class); @@ -76,9 +80,248 @@ package org.apache.felix.dm; * * @see DependencyManager#createBundleComponent() */ -public interface ResourceComponent extends Component<ResourceComponent> { +public interface ResourceComponent extends Component { + + /** + * Sets the component scope. + * @param scope the component scope (default=SINGLETON) + * + * @return this component + */ + ResourceComponent setScope(ServiceScope scope); + /** + * Sets the implementation for this component. You can actually specify + * an instance you have instantiated manually, or a <code>Class</code> + * that will be instantiated using its default constructor when the + * required dependencies are resolved, effectively giving you a lazy + * instantiation mechanism. + * + * There are four special methods that are called when found through + * reflection to give you life cycle management options: + * <ol> + * <li><code>init()</code> is invoked after the instance has been + * created and dependencies have been resolved, and can be used to + * initialize the internal state of the instance or even to add more + * dependencies based on runtime state</li> + * <li><code>start()</code> is invoked right before the service is + * registered</li> + * <li><code>stop()</code> is invoked right after the service is + * unregistered</li> + * <li><code>destroy()</code> is invoked after all dependencies are + * removed</li> + * </ol> + * In short, this allows you to initialize your instance before it is + * registered, perform some post-initialization and pre-destruction code + * as well as final cleanup. If a method is not defined, it simply is not + * called, so you can decide which one(s) you need. If you need even more + * fine-grained control, you can register as a service state listener too. + * + * @param implementation the implementation + * @return this component + * @see ComponentStateListener + */ + ResourceComponent setImplementation(Object implementation); + + /** + * Adds dependency(ies) to this component, atomically. If the component is already active or if you add + * dependencies from the init method, then you should add all the dependencies in one single add method call + * (using the varargs argument), because this method may trigger component activation (like + * the ServiceTracker.open() method does). + * + * @param dependencies the dependencies to add. + * @return this component + */ + ResourceComponent add(Dependency ... dependencies); + + /** + * Removes a dependency from the component. + * @param d the dependency to remove + * @return this component + */ + ResourceComponent remove(Dependency d); + + /** + * Adds a component state listener to this component. + * + * @param listener the state listener + */ + ResourceComponent add(ComponentStateListener listener); + + /** + * Removes a component state listener from this component. + * + * @param listener the state listener + */ + ResourceComponent remove(ComponentStateListener listener); + + /** + * Sets the public interface under which this component should be registered + * in the OSGi service registry. + * + * @param serviceName the name of the service interface + * @param properties the properties for this service + * @return this component + */ + ResourceComponent setInterface(String serviceName, Dictionary<?,?> properties); + + /** + * Sets the public interfaces under which this component should be registered + * in the OSGi service registry. + * + * @param serviceNames the names of the service interface + * @param properties the properties for these services + * @return this component + */ + ResourceComponent setInterface(String[] serviceNames, Dictionary<?, ?> properties); + + /** + * Sets the public interface under which this component should be registered + * in the OSGi service registry. + * + * @param serviceName the name of the service interface + * @param properties the properties for this service + * @return this component + */ + ResourceComponent setInterface(Class<?> serviceName, Dictionary<?,?> properties); + + /** + * Sets the public interfaces under which this component should be registered + * in the OSGi service registry. + * + * @param serviceNames the names of the service interface + * @param properties the properties for these services + * @return this component + */ + ResourceComponent setInterface(Class<?>[] serviceNames, Dictionary<?, ?> properties); + + /** + * Configures auto configuration of injected classes in the component instance. + * The following injections are currently performed, unless you explicitly + * turn them off: + * <dl> + * <dt>BundleContext</dt><dd>the bundle context of the bundle</dd> + * <dt>ServiceRegistration</dt><dd>the service registration used to register your service</dd> + * <dt>DependencyManager</dt><dd>the dependency manager instance</dd> + * <dt>Component</dt><dd>the component instance of the dependency manager</dd> + * </dl> + * + * @param clazz the class (from the list above) + * @param autoConfig <code>false</code> to turn off auto configuration + */ + ResourceComponent setAutoConfig(Class<?> clazz, boolean autoConfig); + + /** + * Configures auto configuration of injected classes in the component instance. + * + * @param clazz the class (from the list above) + * @param instanceName the name of the instance to inject the class into + * @see #setAutoConfig(Class, boolean) + */ + ResourceComponent setAutoConfig(Class<?> clazz, String instanceName); + + /** + * Sets the service properties associated with the component. If the service + * was already registered, it will be updated. + * + * @param serviceProperties the properties + */ + ResourceComponent setServiceProperties(Dictionary<?, ?> serviceProperties); + + /** + * Sets the names of the methods used as callbacks. These methods, when found, are + * invoked as part of the life cycle management of the component implementation. The + * dependency manager will look for a method of this name with the following signatures, + * in this order: + * <ol> + * <li>method(Component component)</li> + * <li>method()</li> + * </ol> + * + * @param init the name of the init method + * @param start the name of the start method + * @param stop the name of the stop method + * @param destroy the name of the destroy method + * @return the component + */ + ResourceComponent setCallbacks(String init, String start, String stop, String destroy); + + /** + * Sets the names of the methods used as callbacks. These methods, when found, are + * invoked on the specified instance as part of the life cycle management of the component + * implementation. + * <p> + * See setCallbacks(String init, String start, String stop, String destroy) for more + * information on the signatures. Specifying an instance means you can create a manager + * that will be invoked whenever the life cycle of a component changes and this manager + * can then decide how to expose this life cycle to the actual component, offering an + * important indirection when developing your own component models. + * + * @return this component + */ + ResourceComponent setCallbacks(Object instance, String init, String start, String stop, String destroy); + /** + * Sets the factory to use to create the implementation. You can specify + * both the factory class and method to invoke. The method should return + * the implementation, and can use any method to create it. Actually, this + * can be used together with <code>setComposition</code> to create a + * composition of instances that work together to implement a component. The + * factory itself can also be instantiated lazily by not specifying an + * instance, but a <code>Class</code>. + * + * @param factory the factory instance or class + * @param createMethod the name of the create method + * @return this component + */ + ResourceComponent setFactory(Object factory, String createMethod); + + /** + * Sets the factory to use to create the implementation. You specify the + * method to invoke. The method should return the implementation, and can + * use any method to create it. Actually, this can be used together with + * <code>setComposition</code> to create a composition of instances that + * work together to implement a component. + * <p> + * Note that currently, there is no default for the factory, so please use + * <code>setFactory(factory, createMethod)</code> instead. + * + * @param createMethod the name of the create method + * @return this component + */ + ResourceComponent setFactory(String createMethod); + + /** + * Sets the instance and method to invoke to get back all instances that + * are part of a composition and need dependencies injected. All of them + * will be searched for any of the dependencies. The method that is + * invoked must return an <code>Object[]</code>. + * + * @param instance the instance that has the method + * @param getMethod the method to invoke + * @return this component + */ + ResourceComponent setComposition(Object instance, String getMethod); + + /** + * Sets the method to invoke on the service implementation to get back all + * instances that are part of a composition and need dependencies injected. + * All of them will be searched for any of the dependencies. The method that + * is invoked must return an <code>Object[]</code>. + * + * @param getMethod the method to invoke + * @return this component + */ + ResourceComponent setComposition(String getMethod); + + /** + * Activate debug for this component. Informations related to dependency processing will be displayed + * using osgi log service, our to standard output if no log service is currently available. + * @param label + */ + ResourceComponent setDebug(String label); + + /** * Sets the resource filter used to match a given resource URL. * * @param filter the filter condition to use with the resource
Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/ComponentContext.java URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/ComponentContext.java?rev=1849304&r1=1849303&r2=1849304&view=diff ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/ComponentContext.java (original) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/ComponentContext.java Wed Dec 19 14:40:48 2018 @@ -38,7 +38,7 @@ import org.osgi.framework.BundleContext; * @author <a href="mailto:[email protected]">Felix Project Team</a> */ @ProviderType -public interface ComponentContext<T extends Component<T>> extends Component<T> { +public interface ComponentContext extends Component { /** * Returns the Component Executor gate that can be used to ensure proper component event serialization. * When you schedule a task in the component executor, your task is executed safely and you do not need Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/packageinfo URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/packageinfo?rev=1849304&r1=1849303&r2=1849304&view=diff ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/packageinfo (original) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/packageinfo Wed Dec 19 14:40:48 2018 @@ -1 +1 @@ -version 4.4.0 +version 4.4.1 Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/BundleAdapterImpl.java URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/BundleAdapterImpl.java?rev=1849304&r1=1849303&r2=1849304&view=diff ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/BundleAdapterImpl.java (original) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/BundleAdapterImpl.java Wed Dec 19 14:40:48 2018 @@ -91,7 +91,7 @@ public class BundleAdapterImpl extends F public class BundleAdapterDecorator extends AbstractDecorator { @SuppressWarnings("unchecked") - public Component<?> createService(Object[] properties) { + public Component createService(Object[] properties) { Bundle bundle = (Bundle) properties[0]; Hashtable<String, Object> props = new Hashtable<>(); if (m_serviceProperties != null) { @@ -105,7 +105,7 @@ public class BundleAdapterImpl extends F // the first dependency is always the dependency on the bundle, which // will be replaced with a more specific dependency below dependencies.remove(0); - Component<?> service = m_manager.createComponent() + Component service = m_manager.createComponent() .setInterface(m_serviceInterfaces, props) .setImplementation(m_serviceImpl) .setFactory(m_factory, m_factoryCreateMethod) // if not set, no effect Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentImpl.java URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentImpl.java?rev=1849304&r1=1849303&r2=1849304&view=diff ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentImpl.java (original) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentImpl.java Wed Dec 19 14:40:48 2018 @@ -75,7 +75,7 @@ import org.osgi.service.log.LogService; * * @author <a href="mailto:[email protected]">Felix Project Team</a> */ -public class ComponentImpl implements Component<ComponentImpl>, ComponentContext<ComponentImpl>, ComponentDeclaration { +public class ComponentImpl implements Component, ComponentContext, ComponentDeclaration { /** * NullObject ServiceRegistration that is injected in components that don't provide any services. */ Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/FilterComponent.java URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/FilterComponent.java?rev=1849304&r1=1849303&r2=1849304&view=diff ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/FilterComponent.java (original) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/FilterComponent.java Wed Dec 19 14:40:48 2018 @@ -49,7 +49,7 @@ import org.osgi.framework.ServiceRegistr * * @author <a href="mailto:[email protected]">Felix Project Team</a> */ -public abstract class FilterComponent<T extends Component<T>> implements Component<T>, ComponentContext<T>, ComponentDeclaration { +public abstract class FilterComponent<T extends Component> implements Component, ComponentContext, ComponentDeclaration { protected volatile ComponentImpl m_component; protected volatile List<ComponentStateListener> m_stateListeners = new CopyOnWriteArrayList<>(); protected volatile String m_init = "init"; @@ -396,7 +396,7 @@ public abstract class FilterComponent<T } @Override - public ComponentContext<T> instantiateComponent() { + public ComponentContext instantiateComponent() { return m_component.instantiateComponent(); } } \ No newline at end of file Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ResourceAdapterImpl.java URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ResourceAdapterImpl.java?rev=1849304&r1=1849303&r2=1849304&view=diff ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ResourceAdapterImpl.java (original) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ResourceAdapterImpl.java Wed Dec 19 14:40:48 2018 @@ -118,7 +118,7 @@ public class ResourceAdapterImpl extends } else { resourceDependency.setPropagate(m_propagate); } - Component<?> service = m_manager.createComponent() + Component service = m_manager.createComponent() .setInterface(m_serviceInterfaces, props) .setImplementation(m_serviceImpl) .setFactory(m_factory, m_factoryCreateMethod) // if not set, no effect Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/packageinfo URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/packageinfo?rev=1849304&r1=1849303&r2=1849304&view=diff ============================================================================== --- felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/packageinfo (original) +++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/packageinfo Wed Dec 19 14:40:48 2018 @@ -1 +1 @@ -version 4.5.0 \ No newline at end of file +version 4.6.0 Modified: felix/trunk/dependencymanager/release/build.gradle URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/release/build.gradle?rev=1849304&r1=1849303&r2=1849304&view=diff ============================================================================== --- felix/trunk/dependencymanager/release/build.gradle (original) +++ felix/trunk/dependencymanager/release/build.gradle Wed Dec 19 14:40:48 2018 @@ -33,7 +33,7 @@ buildscript { } // Our release number, which has to be monotonically incremented each time we make a new release. -ext.dmRelease = "r14" +ext.dmRelease = "r15" // Our Apache svn Staging repo ext.svnStagingPath = "https://dist.apache.org/repos/dist/dev/felix"
