/*
 *  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.vysper.compliance;

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;

/**
 * collects more than one spec compliant annotation on the same entity.
 * usage:
 * <code>
 * &#64;SpecCompliance(compliant = {
 *      &#64;SpecCompliant(spec = "RFC3921", section = "7.7.7."),
 *      &#64;SpecCompliant(spec = "RFC3921bis-06", section = "9.8.4")
 *      &#64;SpecCompliant(spec = "RFC3921bis-06", section = "9.8.6", coverage = SpecCompliant.ComplianceCoverage.PARTIAL)
 * })
 * </code>
 * 
 * @author The Apache MINA Project (dev@mina.apache.org)
 */
@Documented
@Retention(RetentionPolicy.SOURCE)
@Target( { ElementType.METHOD, ElementType.TYPE, ElementType.FIELD })
public @interface SpecCompliance {
    SpecCompliant[] compliant();
}
