    001    package org.apache.tapestry5.internal.plastic;
    002
    003    import java.lang.annotation.Annotation;
    004    import java.lang.annotation.Inherited;
    005
    006    import org.apache.tapestry5.plastic.AnnotationAccess;
    007
    008    /**
    009     * Delegating annotation access is used when resolving annotations on a class; it searches the primary
    010     * annotation access and if not found there (and {@link Inherited} is on the annotation being searched),
    011     * it searches in the inherited access.
    012     */
    013    public class DelegatingAnnotationAccess implements AnnotationAccess
    014    {
    015        private final AnnotationAccess primary;
    016
    017        private final AnnotationAccess inherited;
    018
    019        public DelegatingAnnotationAccess(AnnotationAccess primary, AnnotationAccess inherited)
    020        {
    021            this.primary = primary;
    022            this.inherited = inherited;
    023        }
    024
    025        private boolean isInherited(Class<? extends Annotation> annotationType)
    026        {
    027            return annotationType.getAnnotation(Inherited.class) != null;
    028        }
    029
    030        public <T extends Annotation> boolean hasAnnotation(Class<T> annotationType)
    031        {
    032            if (primary.hasAnnotation(annotationType))
    033                return true;
    034
    035            return isInherited(annotationType) && inherited.hasAnnotation(annotationType);
    036        }
    037
    038        public <T extends Annotation> T getAnnotation(Class<T> annotationType)
    039        {
    040            T fromPrimary = primary.getAnnotation(annotationType);
    041
    042            if (fromPrimary != null)
    043                return fromPrimary;
    044
    045            return isInherited(annotationType) ? inherited.getAnnotation(annotationType) : null;
    046        }
    047    }