}
}
private boolean validateAspect(String className) throws Throwable {
ClassReader classReader = getClassReader(className);
if (classReader == null) {
return false;
}
AspectAnnotationVisitor v = new AspectAnnotationVisitor();
classReader.accept(v, 0);
if (!v.getClassInfo().hasAspectAnnotation()) {
return false;
}
else {
// we know it's an aspect, but we don't know whether it is an
// @AspectJ aspect or a code style aspect.
// This is an *unclean* test whilst waiting for AspectJ to
// provide us with something better
for (String m : v.getClassInfo().getMethodNames()) {
if (m.startsWith(AJC_MAGIC)) {
// must be a code style aspect
return false;
}
}
// validate supported instantiation models
if (v.getClassInfo().getAspectAnnotation().getValue() != null) {
if (v.getClassInfo().getAspectAnnotation().getValue().toUpperCase().equals(
PerClauseKind.PERCFLOW.toString())) {
return false;
}
if (v.getClassInfo().getAspectAnnotation().getValue().toUpperCase().toString().equals(
PerClauseKind.PERCFLOWBELOW.toString())) {
return false;
}
}
// check if super class is Aspect as well and abstract
if (v.getClassInfo().getSuperType() != null) {
classReader = getClassReader(v.getClassInfo().getSuperType());
if (classReader == null) {
return false;
}
AspectAnnotationVisitor sv = new AspectAnnotationVisitor();
classReader.accept(sv, 0);
if (sv.getClassInfo().getAspectAnnotation() != null
&& !((sv.getClassInfo().getModifier() & Opcodes.ACC_ABSTRACT) != 0)) {
return false;
}