1 20 21 package edu.umd.cs.findbugs.detect; 22 23 import java.util.HashMap ; 24 import java.util.Map ; 25 26 import org.apache.bcel.classfile.JavaClass; 27 import org.apache.bcel.classfile.Method; 28 29 import edu.umd.cs.findbugs.BugInstance; 30 import edu.umd.cs.findbugs.BugReporter; 31 import edu.umd.cs.findbugs.BytecodeScanningDetector; 32 import edu.umd.cs.findbugs.StatelessDetector; 33 34 public class BadlyOverriddenAdapter extends BytecodeScanningDetector { 35 private BugReporter bugReporter; 36 private boolean isAdapter; 37 private Map <String , String > methodMap; 38 private Map <String , BugInstance> badOverrideMap; 39 40 public BadlyOverriddenAdapter(BugReporter bugReporter) { 41 this.bugReporter = bugReporter; 42 methodMap = new HashMap <String , String >(); 43 badOverrideMap = new HashMap <String ,BugInstance>(); 44 } 45 46 47 48 @Override 49 public void visit(JavaClass obj) { 50 try { 51 methodMap.clear(); 52 badOverrideMap.clear(); 53 JavaClass superClass = obj.getSuperClass(); 54 if (superClass == null) return; 55 String packageName = superClass.getPackageName(); 56 String className = superClass.getClassName(); 57 58 isAdapter = ((className.endsWith("Adapter")) && (packageName.equals("java.awt.event") || packageName.equals("javax.swing.event"))) 60 ||((className.equals("DefaultHandler") && (packageName.equals("org.xml.sax.helpers")))); 61 if (isAdapter) { 62 Method[] methods = superClass.getMethods(); 63 for (Method method1 : methods) { 64 methodMap.put(method1.getName(), method1.getSignature()); 65 } 66 } 67 } catch (ClassNotFoundException cnfe) { 68 bugReporter.reportMissingClass(cnfe); 69 } 70 } 71 72 @Override 73 public void visitAfter(JavaClass obj) { 74 for (BugInstance bi : badOverrideMap.values()) { 75 if (bi != null) 76 bugReporter.reportBug(bi); 77 } 78 } 79 80 @Override 81 public void visit(Method obj) { 82 if (isAdapter) { 83 String methodName = obj.getName(); 84 String signature = methodMap.get(methodName); 85 if (!methodName.equals("<init>") && signature != null) { 86 if (!signature.equals(obj.getSignature())) { 87 if (!badOverrideMap.keySet().contains(methodName)) { 88 badOverrideMap.put(methodName, new BugInstance(this, "BOA_BADLY_OVERRIDDEN_ADAPTER", NORMAL_PRIORITY) 89 .addClassAndMethod(this) 90 .addSourceLine(this)); 91 } 92 } 93 else { 94 badOverrideMap.put(methodName, null); 95 } 96 } 97 } 98 } 99 } 100 101 | Popular Tags |