package aQute.bnd.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * <p> * A change in a provider type (that is all except Consumer types) can be * changed with only (at minimum) a minor update to the package API version * number. This interface is similar to the Eclipse @noextend and @noimplement * annotations. OSGi specifications use the @noimplement annotation, see below. * </p> * <h2>Elaborate and Simple Explanation</h2> * <p> * There is a distinction between "provider implemented" and * "consumer implemented" interfaces, which is reflected in the * {@link ProviderType} and {@link ConsumerType} annotations respectively. * </p> * <p> * These annotations can be placed on an interface to enable the tooling to * detect the role of the interface and generate the correct import range. * </p> * <p> * Usually - to a developer - the role of the interface is clear: interfaces * that are merely call-backs or listeners are generally "consumer implemented". * </p> * <h2>Thought Experiment with ConfigurationAdmin</h2> * <p> * In the case of the ConfigurationAdmin specification: implementing * ManagedService or ManagedServiceFactory does not make you a provider. You * would have to implement ConfigurationAdmin in order to be a provider. * </p> * <p> * <b>Rule of thumb:</b> suppose a method would be added to * ManagedServiceFactory. How many bundles would be broken as a result? The * answer is "lots" and therefore ManagedServiceFactory is a consumer type. * However, if a method would be added to ConfigurationAdmin then only a very * small number of bundles would be broken; these are the providers of the * ConfigurationAdmin API, e.g. org.apache.felix.configadmin and so on. * </p> * <h2>Relation to OSGi Specifications and Javadoc</h2> * <p> * At OSGi, the javadoc tag @noimplement is used to mark "provider implemented" * interfaces. Interfaces not marked @noimplement are "consumer implemented" * interfaces. * </p> * <p> * So, for example, the ConfigurationAdmin interface is marked @noimplement * while the ManagedService and ManagedServiceFactory interfaces are not. * </p> * <p> * In the specification, you will see "No Implement Consumers of this API must * not implement this interface" for @noimplement marked interfaces. * </p> * <p> * In the html javadoc, you will see "Consumers of this API must not implement * this interface" for @noimplement marked interfaces. * </p> */ @Documented @Retention(RetentionPolicy.CLASS) @Target(ElementType.TYPE) public @interface ProviderType { }