1 19 20 package edu.umd.cs.findbugs.detect; 21 22 import edu.umd.cs.findbugs.*; 23 import edu.umd.cs.findbugs.ba.ClassContext; 24 import edu.umd.cs.findbugs.visitclass.AnnotationVisitor; 25 import java.util.*; 26 import org.apache.bcel.Repository; 27 import org.apache.bcel.classfile.JavaClass; 28 29 public class NoteSuppressedWarnings 30 extends AnnotationVisitor 31 implements Detector, NonReportingDetector { 32 33 private Set<String > packages = new HashSet<String >(); 34 35 private SuppressionMatcher suppressionMatcher; 36 37 private NoteSuppressedWarnings recursiveDetector; 38 39 public NoteSuppressedWarnings(BugReporter bugReporter) { 40 this(bugReporter, false); 41 } 42 43 public NoteSuppressedWarnings(BugReporter bugReporter, boolean recursive) { 44 if (!recursive) { 45 DelegatingBugReporter b = (DelegatingBugReporter) bugReporter; 46 BugReporter origBugReporter = b.getDelegate(); 47 suppressionMatcher = new SuppressionMatcher(); 48 BugReporter filterBugReporter = new FilterBugReporter(origBugReporter, 49 suppressionMatcher, false); 50 b.setDelegate(filterBugReporter); 51 recursiveDetector = new NoteSuppressedWarnings(bugReporter, true); 52 recursiveDetector.suppressionMatcher = suppressionMatcher; 53 } 54 } 55 56 public void visitClassContext(ClassContext classContext) { 57 JavaClass javaClass = classContext.getJavaClass(); 58 if (!FindUnreleasedLock.preTiger(javaClass)) javaClass.accept(this); 59 } 60 61 @Override 62 public void visit(JavaClass obj) { 63 if (recursiveDetector == null) 64 return; 65 try { 66 if (getClassName().endsWith("package-info")) 67 return; 68 String packageName = getPackageName().replace('/', '.'); 69 if (!packages.add(packageName)) 70 return; 71 String packageInfo = "package-info"; 72 if (packageName.length() > 0) 73 packageInfo = packageName + "." + packageInfo; 74 75 JavaClass packageInfoClass = Repository.lookupClass(packageInfo); 76 recursiveDetector.visitJavaClass(packageInfoClass); 77 } catch (ClassNotFoundException e) { 78 } 80 } 81 82 @Override 83 public void visitAnnotation(String annotationClass, Map<String , Object > map, 84 boolean runtimeVisible) { 85 if (!annotationClass.endsWith("SuppressWarnings")) 86 return; 87 Object value = map.get("value"); 88 if (value == null || !(value instanceof Object [])) { 89 suppressWarning(null); 90 return; 91 } 92 Object [] suppressedWarnings = (Object []) value; 93 if (suppressedWarnings.length == 0) 94 suppressWarning(null); 95 else 96 for (Object suppressedWarning : suppressedWarnings) 97 suppressWarning((String ) suppressedWarning); 98 } 99 100 private void suppressWarning(String pattern) { 101 String className = getDottedClassName(); 102 ClassAnnotation clazz = new ClassAnnotation(className); 103 if (className.endsWith("package-info") && recursiveDetector == null) 104 suppressionMatcher.addPackageSuppressor(new PackageWarningSuppressor(pattern, 105 getPackageName().replace('/', '.'))); 106 else if (visitingMethod()) 107 suppressionMatcher.addSuppressor(new MethodWarningSuppressor(pattern, clazz, 108 MethodAnnotation.fromVisitedMethod(this))); 109 else if (visitingField()) 110 suppressionMatcher.addSuppressor(new FieldWarningSuppressor(pattern, clazz, 111 FieldAnnotation.fromVisitedField(this))); 112 else 113 suppressionMatcher.addSuppressor(new ClassWarningSuppressor(pattern, clazz)); 114 } 115 116 public void report() { 117 118 } 119 120 } 121 | Popular Tags |