package japicmp.filter; import javassist.CtBehavior; import javassist.CtClass; import javassist.NotFoundException; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; public class AnnotationBehaviorFilter extends AnnotationFilterBase implements BehaviorFilter { private static final Logger LOGGER = Logger.getLogger(AnnotationBehaviorFilter.class.getName()); public AnnotationBehaviorFilter(String filterString) { super(filterString.substring(1)); } @Override public boolean matches(CtBehavior ctBehavior) { List attributes = ctBehavior.getMethodInfo().getAttributes(); boolean hasAnnotation = hasAnnotation(attributes); if (!hasAnnotation) { CtClass declaringClass = ctBehavior.getDeclaringClass(); hasAnnotation = hasAnnotation(declaringClass.getClassFile().getAttributes()); if (!hasAnnotation) { try { declaringClass = declaringClass.getDeclaringClass(); if (declaringClass != null) { hasAnnotation = hasAnnotation(declaringClass.getClassFile().getAttributes()); } } catch (NotFoundException e) { LOGGER.log(Level.FINE, "Failed to load class '" + declaringClass.getName() + "': " + e.getLocalizedMessage(), e); } } } return hasAnnotation; } @Override public String toString() { return "@" + annotationClassName; } }