All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.osgi.service.component.annotations.Reference Maven / Gradle / Ivy

There is a newer version: 1.5.1
Show newest version
/*******************************************************************************
 * Copyright (c) Contributors to the Eclipse Foundation
 *
 * Licensed 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.
 *
 * SPDX-License-Identifier: Apache-2.0 
 *******************************************************************************/

package org.osgi.service.component.annotations;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.osgi.service.component.AnyService;

/**
 * Identify the annotated member or parameter as a reference of a Service
 * Component.
 * 

* When the annotation is applied to a method, the method is the bind method of * the reference. *

* When the annotation is applied to a field, the field will contain the bound * service(s) of the reference. *

* When the annotation is applied to a parameter of a constructor, the parameter * will contain the bound service(s) of the reference. *

* This annotation is not processed at runtime by Service Component Runtime. It * must be processed by tools and used to add a Component Description to the * bundle. *

* In the generated Component Description for a component, the references must * be ordered in ascending lexicographical order (using {@code String.compareTo} * ) of the reference {@link #name() name}s. * * @see "The reference element of a Component Description." * @author $Id: 3795837efc16f0270ec7f9df16e1bc0260dbb601 $ */ @Retention(RetentionPolicy.CLASS) @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER }) public @interface Reference { /** * The name of this reference. *

* The name of this reference must be specified when using this annotation * in the {@link Component#reference()} element since there is no annotated * member from which the name can be determined. If not specified, the name * of this reference is based upon how this annotation is used: *

    *
  • Annotated method - If the method name begins with {@code bind}, * {@code set} or {@code add}, that prefix is removed to create the name of * the reference. Otherwise, the name of the reference is the method * name.
  • *
  • Annotated field - The name of the reference is the field name.
  • *
  • Annotated constructor parameter - The name of the reference is the * parameter name.
  • *
* * @see "The name attribute of the reference element of a Component Description." */ String name() default ""; /** * The type of the service for this reference. *

* The type of the service for this reference must be specified when using * this annotation in the {@link Component#reference()} element since there * is no annotated member from which the type of the service can be * determined. *

* If not specified, the type of the service for this reference is based * upon how this annotation is used: *

    *
  • Annotated method - The type of the service is the type of the first * parameter of the method.
  • *
  • Annotated field - The type of the service is based upon the * cardinality of the reference and the type of the field being annotated. * If the cardinality is either {@link ReferenceCardinality#MULTIPLE 0..n}, * or {@link ReferenceCardinality#AT_LEAST_ONE 1..n}, the type of the field * must be one of {@code java.util.Collection}, {@code java.util.List}, or a * subtype of {@code java.util.Collection}, so the type of the service is * the generic type of the collection. If the cardinality is either * {@link ReferenceCardinality#OPTIONAL 0..1} or * {@link ReferenceCardinality#MANDATORY 1..1}, and the type of the field is * {@code java.util.Optional}, the type of the service is the generic type * of the {@code java.util.Optional}. Otherwise, the type of the service is * the type of the field.
  • *
  • Annotated constructor parameter - The type of the service is based * upon the cardinality of the reference and the type of the parameter being * annotated. If the cardinality is either * {@link ReferenceCardinality#MULTIPLE 0..n}, or * {@link ReferenceCardinality#AT_LEAST_ONE 1..n}, the type of the parameter * must be one of {@code java.util.Collection} or {@code java.util.List}, so * the type of the service is the generic type of the collection. If the * cardinality is either {@link ReferenceCardinality#OPTIONAL 0..1} or * {@link ReferenceCardinality#MANDATORY 1..1}, and the type of the * parameter is {@code java.util.Optional}, the type of the service is the * generic type of the {@code java.util.Optional}. Otherwise, the type of * the service is the type of the parameter.
  • *
* * @see "The interface attribute of the reference element of a Component Description." * @see AnyService */ Class service() default Object.class; /** * The cardinality of this reference. *

* If not specified, the cardinality of this reference is based upon how * this annotation is used: *

    *
  • Annotated method - The cardinality is * {@link ReferenceCardinality#MANDATORY 1..1}.
  • *
  • Annotated field - The cardinality is based on the type of the field. * If the type is either {@code java.util.Collection}, * {@code java.util.List}, or a subtype of {@code java.util.Collection}, the * cardinality is {@link ReferenceCardinality#MULTIPLE 0..n}. If the type is * {@code java.util.Optional}, the cardinality is * {@link ReferenceCardinality#OPTIONAL 0..1}. Otherwise the cardinality is * {@link ReferenceCardinality#MANDATORY 1..1}.
  • *
  • Annotated constructor parameter - The cardinality is based on the * type of the parameter. If the type is either {@code java.util.Collection} * or {@code java.util.List}, the cardinality is * {@link ReferenceCardinality#MULTIPLE 0..n}. If the type is * {@code java.util.Optional}, the cardinality is * {@link ReferenceCardinality#OPTIONAL 0..1}. Otherwise the cardinality is * {@link ReferenceCardinality#MANDATORY 1..1}.
  • *
  • {@link Component#reference()} element - The cardinality is * {@link ReferenceCardinality#MANDATORY 1..1}.
  • *
* * @see "The cardinality attribute of the reference element of a Component Description." */ ReferenceCardinality cardinality() default ReferenceCardinality.MANDATORY; /** * The policy for this reference. *

* If not specified, the policy of this reference is based upon how this * annotation is used: *

    *
  • Annotated method - The policy is {@link ReferencePolicy#STATIC * STATIC}.
  • *
  • Annotated field - The policy is based on the modifiers of the field. * If the field is declared {@code volatile}, the policy is * {@link ReferencePolicy#DYNAMIC}. Otherwise the policy is * {@link ReferencePolicy#STATIC STATIC}.
  • *
  • Annotated constructor parameter - The policy is * {@link ReferencePolicy#STATIC STATIC}. STATIC policy must be used for * constructor parameters.
  • *
  • {@link Component#reference()} element - The policy is * {@link ReferencePolicy#STATIC STATIC}.
  • *
* * @see "The policy attribute of the reference element of a Component Description." */ ReferencePolicy policy() default ReferencePolicy.STATIC; /** * The target property for this reference. *

* If not specified, no target property is set. A target property must be * specified if the {@link #service()} element refers to {@link AnyService}. * * @see "The target attribute of the reference element of a Component Description." */ String target() default ""; /** * The policy option for this reference. * *

* If not specified, the {@link ReferencePolicyOption#RELUCTANT RELUCTANT} * reference policy option is used. * * @see "The policy-option attribute of the reference element of a Component Description." * @since 1.2 */ ReferencePolicyOption policyOption() default ReferencePolicyOption.RELUCTANT; /** * The reference scope for this reference. * *

* If not specified, the {@link ReferenceScope#BUNDLE bundle} reference * scope is used. * * @see "The scope attribute of the reference element of a Component Description." * @since 1.3 */ ReferenceScope scope() default ReferenceScope.BUNDLE; /* Method injection elements */ /** * The name of the bind method for this reference. *

* If specified and this reference annotates a method, the specified name * must match the name of the annotated method. *

* If not specified, the name of the bind method is based upon how this * annotation is used: *

    *
  • Annotated method - The name of the annotated method is the name of * the bind method.
  • *
  • Annotated field - There is no bind method name.
  • *
  • Annotated constructor parameter - There is no bind method name.
  • *
  • {@link Component#reference()} element - There is no bind method name. *
  • *
*

* If there is a bind method name, the component must contain a method with * that name. * * @see "The bind attribute of the reference element of a Component Description." * @since 1.3 */ String bind() default ""; /** * The name of the updated method for this reference. *

* If not specified, the name of the updated method is based upon how this * annotation is used: *

    *
  • Annotated method - The name of the updated method is created from the * name of the annotated method. If the name of the annotated method begins * with {@code bind}, {@code set} or {@code add}, that prefix is replaced * with {@code updated} to create the name candidate for the updated method. * Otherwise, {@code updated} is prefixed to the name of the annotated * method to create the name candidate for the updated method. If the * component type contains a method with the candidate name, the candidate * name is used as the name of the updated method. To declare no updated * method when the component type contains a method with the candidate name, * the value {@code "-"} must be used.
  • *
  • Annotated field - There is no updated method name.
  • *
  • Annotated constructor parameter - There is no updated method * name.
  • *
  • {@link Component#reference()} element - There is no updated method * name.
  • *
*

* If there is an updated method name, the component must contain a method * with that name. * * @see "The updated attribute of the reference element of a Component Description." * @since 1.2 */ String updated() default ""; /** * The name of the unbind method for this reference. *

* If not specified, the name of the unbind method is based upon how this * annotation is used: *

    *
  • Annotated method - The name of the unbind method is created from the * name of the annotated method. If the name of the annotated method begins * with {@code bind}, {@code set} or {@code add}, that prefix is replaced * with {@code unbind}, {@code unset} or {@code remove}, respectively, to * create the name candidate for the unbind method. Otherwise, {@code un} is * prefixed to the name of the annotated method to create the name candidate * for the unbind method. If the component type contains a method with the * candidate name, the candidate name is used as the name of the unbind * method. To declare no unbind method when the component type contains a * method with the candidate name, the value {@code "-"} must be used.
  • *
  • Annotated field - There is no unbind method name.
  • *
  • Annotated constructor parameter - There is no unbind method * name.
  • *
  • {@link Component#reference()} element - There is no unbind method * name.
  • *
*

* If there is an unbind method name, the component must contain a method * with that name. * * @see "The unbind attribute of the reference element of a Component Description." */ String unbind() default ""; /* Field injection elements */ /** * The name of the field for this reference. *

* If specified and this reference annotates a field, the specified name * must match the name of the annotated field. *

* If not specified, the name of the field is based upon how this annotation * is used: *

    *
  • Annotated method - There is no field name.
  • *
  • Annotated field - The name of the annotated field is the name of the * field.
  • *
  • Annotated constructor parameter - There is no field name.
  • *
  • {@link Component#reference()} element - There is no field name.
  • *
*

* If there is a field name, the component must contain a field with that * name. * * @see "The field attribute of the reference element of a Component Description." * @since 1.3 */ String field() default ""; /** * The field option for this reference. *

* If not specified, the field option is based upon how this annotation is * used: *

    *
  • Annotated method - There is no field option.
  • *
  • Annotated field - The field option is based upon the policy and * cardinality of the reference and the modifiers of the field. If the * policy is {@link ReferencePolicy#DYNAMIC}, the cardinality is * {@link ReferenceCardinality#MULTIPLE 0..n} or * {@link ReferenceCardinality#AT_LEAST_ONE 1..n}, and the field is declared * {@code final}, the field option is {@link FieldOption#UPDATE}. Otherwise, * the field option is {@link FieldOption#REPLACE}.
  • *
  • Annotated constructor parameter - There is no field option.
  • *
  • {@link Component#reference()} element - There is no field * option.
  • *
* * @see "The field-option attribute of the reference element of a Component Description." * @since 1.3 */ FieldOption fieldOption() default FieldOption.REPLACE; /* Constructor injection elements */ /** * The zero-based parameter number of the constructor parameter for this * reference. *

* If specified and this reference annotates an constructor parameter, the * specified value must match the zero-based parameter number of the * annotated constructor parameter. *

* If not specified, the parameter number is based upon how this annotation * is used: *

    *
  • Annotated method - There is no parameter number.
  • *
  • Annotated field - There is no parameter number.
  • *
  • Annotated constructor parameter - The zero-based parameter number of * the parameter.
  • *
  • {@link Component#reference()} element - There is no parameter * number.
  • *
*

* If there is a parameter number, the component must declare a constructor * that has a parameter having the zero-based parameter number. * * @see "The parameter attribute of the reference element of a Component Description." * @see "The init attribute of the component element of a Component Description." * @since 1.4 */ int parameter() default 0; /* Field and Constructor injection elements */ /** * The collection type for this reference. *

* If not specified, the collection type is based upon how this annotation * is used: *

    *
  • Annotated method - There is no collection type.
  • *
  • Annotated field - The collection type is based upon the cardinality * of the reference and the type of the field. If the cardinality is either * {@link ReferenceCardinality#MULTIPLE 0..n} or * {@link ReferenceCardinality#AT_LEAST_ONE 1..n}, the collection type is * inferred from the generic type of the {@code java.util.Collection}. If * the cardinality is either {@link ReferenceCardinality#OPTIONAL 0..1} or * {@link ReferenceCardinality#MANDATORY 1..1}, and the type of the field is * {@code java.util.Optional}, the collection type is inferred from the * generic type of the {@code java.util.Optional}. Otherwise, there is no * collection type
  • *
  • Annotated constructor method parameter - The collection type is based * upon the cardinality of the reference and the type of the parameter. If * the cardinality is either {@link ReferenceCardinality#MULTIPLE 0..n} or * {@link ReferenceCardinality#AT_LEAST_ONE 1..n}, the collection type is * inferred from the generic type of the {@code java.util.Collection}. If * the cardinality is either {@link ReferenceCardinality#OPTIONAL 0..1} or * {@link ReferenceCardinality#MANDATORY 1..1}, and the type of the * parameter is {@code java.util.Optional}, the collection type is inferred * from the generic type of the {@code java.util.Optional}. Otherwise, there * is no collection type
  • *
  • {@link Component#reference()} element - There is no collection * type.
  • *
* * @see "The field-collection-type attribute of the reference element of a Component Description." * @since 1.4 */ CollectionType collectionType() default CollectionType.SERVICE; }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy