package org.googlecode.perftrace.aopmatcher.support.annotation;
import java.lang.annotation.Annotation;
import org.googlecode.perftrace.aopmatcher.support.StaticMethodMatcher;
import org.googlecode.perftrace.javassist.CtClass;
import org.googlecode.perftrace.javassist.CtMethod;
/**
* Simple MethodMatcher that looks for a specific Java 5 annotation being
* present on a method (checking both the method on the invoked interface, if
* any, and the corresponding method on the target class).
*
* @see AnnotationMatchingPointcut
*/
public class AnnotationMethodMatcher extends StaticMethodMatcher {
private final Class<? extends Annotation> annotationType;
/**
* Create a new AnnotationClassFilter for the given annotation type.
*
* @param annotationType
* the annotation type to look for
*/
public AnnotationMethodMatcher(Class<? extends Annotation> annotationType) {
// Assert.notNull(annotationType, "Annotation type must not be null");
this.annotationType = annotationType;
}
public boolean matches(CtMethod method, CtClass targetClass) {
if (method.hasAnnotation(this.annotationType)) {
return true;
}
// The method may be on an interface, so let's check on the target class
// as well.
// Method specificMethod = AopUtils.getMostSpecificMethod(method,
// targetClass);
// return (specificMethod != method &&
// specificMethod.isAnnotationPresent(this.annotationType));
return false;
}
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
}
if (!(other instanceof AnnotationMethodMatcher)) {
return false;
}
AnnotationMethodMatcher otherMm = (AnnotationMethodMatcher) other;
return this.annotationType.equals(otherMm.annotationType);
}
@Override
public int hashCode() {
return this.annotationType.hashCode();
}
}