1 19 20 package edu.umd.cs.findbugs.detect; 21 22 import java.util.HashMap ; 23 import java.util.Map ; 24 25 import org.apache.bcel.classfile.JavaClass; 26 27 import edu.umd.cs.findbugs.BugReporter; 28 import edu.umd.cs.findbugs.Detector; 29 import edu.umd.cs.findbugs.NonReportingDetector; 30 import edu.umd.cs.findbugs.ba.AnalysisContext; 31 import edu.umd.cs.findbugs.ba.ClassContext; 32 import edu.umd.cs.findbugs.visitclass.AnnotationVisitor; 33 34 public class NoteAnnotationRetention extends AnnotationVisitor implements 35 Detector, NonReportingDetector { 36 37 private boolean classfileRetention; 38 39 BugReporter bugReporter; 40 41 public NoteAnnotationRetention(BugReporter bugReporter) { 42 this.bugReporter = bugReporter; 43 } 44 45 @Override 46 public void visitAnnotation(String annotationClass, 47 Map <String , Object > map, boolean runtimeVisible) { 48 49 if (!annotationClass.equals("java.lang.annotation.Retention")) 50 return; 51 Object value = map.get("value"); 52 if ("java.lang.annotation.RetentionPolicy.RUNTIME".equals(value) 53 || "java.lang.annotation.RetentionPolicy.CLASSFILE" 54 .equals(value)) 55 classfileRetention = true; 56 } 57 58 @Override 59 public void visit(JavaClass obj) { 60 classfileRetention = false; 61 } 62 63 @Override 64 public void visitAfter(JavaClass obj) { 65 for (String i : obj.getInterfaceNames()) 66 if (i.equals("java.lang.annotation.Annotation")) 67 AnalysisContext.currentAnalysisContext() 68 .getAnnotationRetentionDatabase().setClassfileRetention(getDottedClassName(), 69 classfileRetention); 70 71 } 72 73 public void visitClassContext(ClassContext classContext) { 74 JavaClass javaClass = classContext.getJavaClass(); 75 if (!FindUnreleasedLock.preTiger(javaClass)) javaClass.accept(this); 76 77 } 78 79 80 public void report() { 81 82 } 83 84 85 } 86 | Popular Tags |