    001package org.apache.tapestry5.internal.plastic;
    002
    003import java.lang.annotation.Annotation;
    004import java.lang.annotation.Inherited;
    005
    006import 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 */
    013public 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    @Override
    031    public <T extends Annotation> boolean hasAnnotation(Class<T> annotationType)
    032    {
    033        if (primary.hasAnnotation(annotationType))
    034            return true;
    035
    036        return isInherited(annotationType) && inherited.hasAnnotation(annotationType);
    037    }
    038
    039    @Override
    040    public <T extends Annotation> T getAnnotation(Class<T> annotationType)
    041    {
    042        T fromPrimary = primary.getAnnotation(annotationType);
    043
    044        if (fromPrimary != null)
    045            return fromPrimary;
    046
    047        return isInherited(annotationType) ? inherited.getAnnotation(annotationType) : null;
    048    }
    049}