/* * FindBugs - Find Bugs in Java programs * Copyright (C) 2005, University of Maryland * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package edu.umd.cs.findbugs; import edu.umd.cs.findbugs.model.ClassNameRewriter; import edu.umd.cs.findbugs.model.ClassNameRewriterUtil; import edu.umd.cs.findbugs.model.IdentityClassNameRewriter; /** * Very sloppy bug comparator: if the warnings are of the same type, * and in the same class/method/field, assume they are the same. * * @author David Hovemeyer */ public class SloppyBugComparator implements WarningComparator { private static final boolean DEBUG = SystemProperties.getBoolean("sloppyComparator.debug"); private static final long serialVersionUID = 1L; private ClassNameRewriter classNameRewriter = IdentityClassNameRewriter.instance(); /** * Constructor. */ public SloppyBugComparator() { } public void setClassNameRewriter(ClassNameRewriter classNameRewriter) { this.classNameRewriter = classNameRewriter; } private int compareNullElements(Object lhs, Object rhs) { if (lhs == null && rhs == null) return 0; else return (lhs == null) ? -1 : 1; } /** * Compare class annotations. * * @param lhs left hand class annotation * @param rhs right hand class annotation * @return comparison of the class annotations */ private int compareClassesAllowingNull(ClassAnnotation lhs, ClassAnnotation rhs) { if (lhs == null || rhs == null) { return compareNullElements(lhs, rhs); } String lhsClassName = classNameRewriter.rewriteClassName(lhs.getClassName()); String rhsClassName = classNameRewriter.rewriteClassName(rhs.getClassName()); if (DEBUG) System.err.println("Comparing " + lhsClassName + " and " + rhsClassName); int cmp = lhsClassName.compareTo(rhsClassName); if (DEBUG) System.err.println("\t==> " + cmp); return cmp; } private int compareMethodsAllowingNull(MethodAnnotation lhs, MethodAnnotation rhs) { if (lhs == null || rhs == null) { return compareNullElements(lhs, rhs); } lhs = convertMethod(lhs); rhs = convertMethod(rhs); return lhs.compareTo(rhs); } private int compareFieldsAllowingNull(FieldAnnotation lhs, FieldAnnotation rhs) { if (lhs == null || rhs == null) { return compareNullElements(lhs, rhs); } lhs = convertField(lhs); rhs = convertField(rhs); if (DEBUG) System.err.println("Compare fields: " + lhs + " and " + rhs); return lhs.compareTo(rhs); } private MethodAnnotation convertMethod(MethodAnnotation methodAnnotation) { return ClassNameRewriterUtil.convertMethodAnnotation(classNameRewriter, methodAnnotation); } private FieldAnnotation convertField(FieldAnnotation fieldAnnotation) { return ClassNameRewriterUtil.convertFieldAnnotation(classNameRewriter, fieldAnnotation); } /* (non-Javadoc) * @see edu.umd.cs.findbugs.WarningComparator#compare(edu.umd.cs.findbugs.BugInstance, edu.umd.cs.findbugs.BugInstance) */ public int compare(BugInstance lhs, BugInstance rhs) { int cmp; // Bug abbrevs must match BugPattern lhsPattern = lhs.getBugPattern(); BugPattern rhsPattern = rhs.getBugPattern(); String lhsAbbrev, rhsAbbrev; if (lhsPattern == null || rhsPattern == null) { lhsAbbrev = getAbbrevFromBugType(lhs.getType()); rhsAbbrev = getAbbrevFromBugType(rhs.getType()); } else { lhsAbbrev = lhsPattern.getAbbrev(); rhsAbbrev = rhsPattern.getAbbrev(); } cmp = lhsAbbrev.compareTo(rhsAbbrev); if (cmp != 0) { if (DEBUG) System.err.println("bug abbrevs do not match"); return cmp; } // Primary class must match cmp = compareClassesAllowingNull(lhs.getPrimaryClass(), rhs.getPrimaryClass()); if (cmp != 0) return cmp; // Primary method must match (if any) cmp = compareMethodsAllowingNull(lhs.getPrimaryMethod(), rhs.getPrimaryMethod()); if (cmp != 0) { if (DEBUG) System.err.println("primary methods do not match"); return cmp; } // Primary field must match (if any) cmp = compareFieldsAllowingNull(lhs.getPrimaryField(), rhs.getPrimaryField()); if (cmp != 0) { if (DEBUG) System.err.println("primary fields do not match"); return cmp; } // Assume they're the same return 0; } /** * @param type * @return */ private static String getAbbrevFromBugType(String type) { int bar = type.indexOf('_'); return (bar >= 0) ? type.substring(0, bar) : ""; } }