blob: 17f26b3d047e0ca51d1dfc9046a84e3d6353a5ff [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.felix.dm.lambda;
import org.apache.felix.dm.lambda.callbacks.CbBundle;
import org.apache.felix.dm.lambda.callbacks.CbBundleComponent;
import org.apache.felix.dm.lambda.callbacks.InstanceCbBundle;
import org.apache.felix.dm.lambda.callbacks.InstanceCbBundleComponent;
/**
* Builds a Dependency Manager bundle adapter. <p> The adapter created by this builder will be applied to any bundle that matches the specified
* bundle state mask and filter condition. For each matching bundle an adapter service will be created based on the adapter implementation class.
* The adapter will be registered with the specified interface and existing properties from the original bundle plus any extra properties
* you supply here. The bundle is injected by reflection in adapter class fields having a Bundle type, or using a callback method that you can
* specify.
*
* You can specify reflection based (using method names), or java8 method references for callbacks.
*
* <p> Example which creates a BundleAdapter service for each started bundle (the bundle is added by reflection on
* a class field that has a "Bundle" type):
*
* <pre> {@code
* public class Activator extends DependencyManagerActivator {
* public void init(BundleContext ctx, DependencyManager dm) throws Exception {
* bundleAdapter(adapt -> adapt
* .impl(BundleAdapterImpl.class)
* .provides(BundleAdapter.class)
* .mask(Bundle.INSTALLED | Bundle.RESOLVED | Bundle.ACTIVE));
* }
* }
* } </pre>
*
* Example that creates a BundleAdapter service for each started bundle (the bundle is added using a method reference):
*
* <pre> {@code
* public class Activator extends DependencyManagerActivator {
* public void init(BundleContext ctx, DependencyManager dm) throws Exception {
* bundleAdapter(adapt -> adapt
* .impl(BundleAdapterImpl.class)
* .provides(BundleAdapter.class)
* .mask(Bundle.INSTALLED | Bundle.RESOLVED | Bundle.ACTIVE)
* .add(BundleAdapterImpl::setBundle));
* }
* }
* }</pre>
*
* Example that creates a BundleAdapter service for each started bundle (the bundle is added using a method name):
*
* <pre> {@code
* public class Activator extends DependencyManagerActivator {
* public void init(BundleContext ctx, DependencyManager dm) throws Exception {
* bundleAdapter(adapt -> adapt
* .impl(BundleAdapterImpl.class)
* .provides(BundleAdapter.class)
* .mask(Bundle.INSTALLED | Bundle.RESOLVED | Bundle.ACTIVE)
* .add("setBundle"));
* }
* }
* }</pre>
*
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public interface BundleAdapterBuilder extends ComponentBuilder<BundleAdapterBuilder> {
/**
* Sets the bundle state mask to depend on. The OSGi BundleTracker explains this mask in more detail, but
* it is basically a mask with flags for each potential state a bundle can be in.
*
* @param mask the mask to use
* @return this builder
*/
BundleAdapterBuilder mask(int mask);
/**
* Sets the filter condition to depend on. Filters are matched against the full manifest of a bundle.
*
* @param filter the filter condition
* @return this builder
*/
BundleAdapterBuilder filter(String filter);
/**
* Sets property propagation. If set to <code>true</code> any bundle manifest properties will be added
* to the service properties of the component that has this dependency (if it registers as a service).
*
* @param propagate <code>true</code> to propagate the bundle manifest properties
* @return this builder
*/
BundleAdapterBuilder propagate(boolean propagate);
/**
* Enables property propagation. Any bundle manifest properties will be added
* to the service properties of the component that has this dependency (if it registers as a service).
*
* @return this builder
*/
BundleAdapterBuilder propagate();
/**
* Sets a "add" callback name invoked on the component implementation instance(s).
* The callback can be used as hooks whenever the dependency is added. When you specify a callback,
* the auto configuration feature is automatically turned off, because we're assuming you don't need it in this case.
*
* @param callback the method to call when a bundle was added
*
* The following method signature are supported:
* <pre>{@code
* callback(Bundle b)
* callback(Component c, Bundle b)
* }</pre>
*
* @param callback the callback name
* @return this builder.
*/
BundleAdapterBuilder add(String callback);
/**
* Sets a "change" callback name invoked on the component implementation instance(s).
* The callback can be used as hooks whenever the dependency is changed. When you specify a callback,
* the auto configuration feature is automatically turned off, because we're assuming you don't need it in this case.
*
* @param callback the method to call when a bundle was changed
*
* The following method signature are supported:
* <pre>{@code
* callback(Bundle b)
* callback(Component c, Bundle b)
* }</pre>
*
* @param callback the callback name
* @return this builder.
*/
BundleAdapterBuilder change(String callback);
/**
* Sets a "remove" callback name invoked on the component implementation instance(s).
* The callback can be used as hooks whenever the dependency is removed. When you specify a callback,
* the auto configuration feature is automatically turned off, because we're assuming you don't need it in this case.
*
* @param callback the method to call when a bundle was removed
*
* The following method signature are supported:
* <pre>{@code
* callback(Bundle b)
* callback(Component c, Bundle b)
* }</pre>
*
* @param callback the callback name
* @return this builder.
*/
BundleAdapterBuilder remove(String callback);
/**
* Sets a callback instance to use when invoking reflection based callbacks.
*
* @param callbackInstance the instance to call the reflection based callbacks on
* @return this builder.
* @see #add(String)
* @see #change(String)
* @see #remove(String)
*/
BundleAdapterBuilder callbackInstance(Object callbackInstance);
/**
* Sets a reference to a callback method invoked on one of the component implementation classes.
* The method reference must point to a Component implementation class method, it is called when the bundle is added
* and takes as argument a Bundle.
*
* @param <T> the type of the component implementation class on which the callback is invoked.
* @param add the method reference invoked when a bundle is added.
* @return this builder
*/
<T> BundleAdapterBuilder add(CbBundle<T> add);
/**
* Sets a reference to a callback method invoked on one of the component implementation classes.
* The method reference must point to a Component implementation class method, it is called when the bundle is changed
* and takes as argument a Bundle.
*
* @param <T> the type of the component implementation class on which the callback is invoked.
* @param change the method reference invoked when a bundle has changed.
* @return this builder
*/
<T> BundleAdapterBuilder change(CbBundle<T> change);
/**
* Sets a reference to a callback method invoked on one of the component implementation classes.
* The method reference must point to a Component implementation class method, it is called when the bundle is removed
* and takes as argument a Bundle.
*
* @param <T> the type of the component implementation class on which the callback is invoked.
* @param remove the method reference invoked when a bundle is removed.
* @return this builder
*/
<T> BundleAdapterBuilder remove(CbBundle<T> remove);
/**
* Sets a reference to a callback method invoked on one of the component implementation classes.
* The method reference must point to a Component implementation class method, it is called when the bundle is added
* and takes as argument a Bundle and a Component.
*
* @param <T> the type of the component implementation class on which the callback is invoked.
* @param add the method reference invoked when a bundle is added.
* @return this builder
*/
<T> BundleAdapterBuilder add(CbBundleComponent<T> add);
/**
* Sets a reference to a callback method invoked on one of the component implementation classes.
* The method reference must point to a Component implementation class method, it is called when the bundle is changed
* and takes as argument a Bundle and a Component.
*
* @param <T> the type of the component implementation class on which the callback is invoked.
* @param change the method reference invoked when a bundle has changed.
* @return this builder
*/
<T> BundleAdapterBuilder change(CbBundleComponent<T> change);
/**
* Sets a reference to a callback method invoked on one of the component implementation classes.
* The method reference must point to a Component implementation class method, it is called when the bundle is removed
* and takes as argument a Bundle and a Component.
*
* @param <T> the type of the component implementation class on which the callback is invoked.
* @param remove the method reference invoked when a bundle is removed.
* @return this builder
*/
<T> BundleAdapterBuilder remove(CbBundleComponent<T> remove);
/**
* Sets a reference to a callback method invoked on a given Object instance.
* The method reference is invoked when the bundle is added and takes as argument a Bundle.
*
* @param add the method reference invoked when a bundle is added.
* @return this builder
*/
BundleAdapterBuilder add(InstanceCbBundle add);
/**
* Sets a reference to a callback method invoked on a given Object instance.
* The method reference is invoked when the bundle has changed and takes as argument a Bundle.
*
* @param change the method reference invoked when a bundle has changed.
* @return this builder
*/
BundleAdapterBuilder change(InstanceCbBundle change);
/**
* Sets a reference to a callback method invoked on a given Object instance.
* The method reference is invoked when the bundle is removed and takes as argument a Bundle.
*
* @param remove the method reference invoked when a bundle is removed.
* @return this builder
*/
BundleAdapterBuilder remove(InstanceCbBundle remove);
/**
* Sets a reference to a callback method invoked on a given Object instance.
* The method reference is invoked when the bundle is added and takes as argument a Bundle and a Component.
*
* @param add the method reference invoked when a bundle is added.
* @return this builder
*/
BundleAdapterBuilder add(InstanceCbBundleComponent add);
/**
* Sets a reference to a callback method invoked on a given Object instance.
* The method reference is invoked when the bundle has changed and takes as argument a Bundle and a Component.
*
* @param change the method reference invoked when a bundle has changed.
* @return this builder
*/
BundleAdapterBuilder change(InstanceCbBundleComponent change);
/**
* Sets a reference to a callback method invoked on a given Object instance.
* The method reference is invoked when the bundle is removed and takes as argument a Bundle and a Component.
*
* @param remove the method reference invoked when a bundle is removed.
* @return this builder
*/
BundleAdapterBuilder remove(InstanceCbBundleComponent remove);
}