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 }