blob: b114b18c38c4c10e80feb66e45a327999e179c25 [file] [log] [blame]
package org.apache.tapestry5.internal.plastic;
import java.lang.annotation.Annotation;
import java.lang.annotation.Inherited;
import org.apache.tapestry5.plastic.AnnotationAccess;
/**
* Delegating annotation access is used when resolving annotations on a class; it searches the primary
* annotation access and if not found there (and {@link Inherited} is on the annotation being searched),
* it searches in the inherited access.
*/
public class DelegatingAnnotationAccess implements AnnotationAccess
{
private final AnnotationAccess primary;
private final AnnotationAccess inherited;
public DelegatingAnnotationAccess(AnnotationAccess primary, AnnotationAccess inherited)
{
this.primary = primary;
this.inherited = inherited;
}
private boolean isInherited(Class<? extends Annotation> annotationType)
{
return annotationType.getAnnotation(Inherited.class) != null;
}
@Override
public <T extends Annotation> boolean hasAnnotation(Class<T> annotationType)
{
if (primary.hasAnnotation(annotationType))
return true;
return isInherited(annotationType) && inherited.hasAnnotation(annotationType);
}
@Override
public <T extends Annotation> T getAnnotation(Class<T> annotationType)
{
T fromPrimary = primary.getAnnotation(annotationType);
if (fromPrimary != null)
return fromPrimary;
return isInherited(annotationType) ? inherited.getAnnotation(annotationType) : null;
}
}