/*
 * 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.scrplugin.annotations;

import java.lang.annotation.*;

/**
 * The <code>Reference</code> annotation defines references to other services
 * made available to the component by the Service Component Runtime.
 * <p>
 * This annotation may be declared for a Java Class or any Java Field to which
 * it might apply. Depending on where the annotation is declared, the parameters
 * may have different default values.
 * <p>
 * This annotation is used to declare &lt;reference&gt; elements of the
 * component declaration. See section 112.4.7, Reference Element, in the OSGi
 * Service Platform Service Compendium Specification for more information.
 */
@Target( { ElementType.TYPE, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Reference {

    /**
     * The local name of the reference. If the annotation is declared on class
     * level, this parameter is required. If the tag is declared for a field,
     * the default value for the name parameter is the name of the field.
     */
    String name() default "";

    /**
     * The name of the service interface. This name is used by the Service
     * Component Runtime to access the service on behalf of the component. If
     * the annotation is declared on class level, this parameter is required. If
     * the annotation is declared for a field, the default value for the
     * interface parameter is the type of the field.
     */
    Class referenceInterface() default AutoDetect.class;

    /**
     * The cardinality of the service reference. This must be one of 0..1, 1..1,
     * 0..n, and 1..n.
     */
    ReferenceCardinality cardinality() default ReferenceCardinality.ONE_TO_ONE;

    /**
     * The dynamicity policy of the reference. If dynamic the service will be
     * made available to the component as it comes and goes. If static the
     * component will be deactivated and re-activated if the service comes
     * and/or goes away.
     */
    ReferencePolicy policy() default ReferencePolicy.STATIC;

    /**
     * A service target filter to select specific services to be made available.
     * In order to be able to overwrite the value of this value by a
     * configuration property, this parameter must be declared. If the parameter
     * is not declared, the respective declaration attribute will not be
     * generated.
     */
    String target() default "";

    /**
     * The name of the method to be called when the service is to be bound to
     * the component. The default value is the name created by appending the
     * reference name to the string bind. The method must be declared
     * <code>public</code> or <code>protected</code> and take single argument
     * which is declared with the service interface type.
     */
    String bind() default "";

    /**
     * The name of the method to be called when the service is to be unbound
     * from the component. The default value is the name created by appending
     * the reference name to the string unbind. The method must be declared
     * <code>public</code> or <code>protected</code> and take single argument
     * which is declared with the service interface type.
     */
    String unbind() default "";

    /**
     * TODO: parameter documentation missing
     */
    boolean checked() default false;

    /**
     * TODO: parameter documentation missing
     * @since 1.0.9
     */
    String strategy() default "";

}
