/* * 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.workflow; import java.util.HashSet; import java.util.Map; import java.util.TreeMap; import edu.umd.cs.findbugs.DetectorFactoryCollection; import edu.umd.cs.findbugs.FindBugs; import edu.umd.cs.findbugs.PackageStats; import edu.umd.cs.findbugs.SortedBugCollection; import edu.umd.cs.findbugs.core.Priorities; import edu.umd.cs.findbugs.util.Bag; public class TreemapVisualization { static HashSet<String> buggyPackages = new HashSet<String>(); static HashSet<String> interiorPackages = new HashSet<String>(); static Bag<String> goodCodeSize = new Bag<String>(new TreeMap<String, Integer>()); static Bag<String> goodCodeCount = new Bag<String>(new TreeMap<String, Integer>()); public static void addInteriorPackages(String packageName) { String p = superpackage(packageName); if (p.length() > 0) { interiorPackages.add(p); addInteriorPackages(p); } } /** * @param packageName * @return */ private static String superpackage(String packageName) { int i = packageName.lastIndexOf('.'); if (i == -1) return ""; String p = packageName.substring(0, i); return p; } public static boolean isInteriorPackage(String packageName) { return interiorPackages.contains(packageName); } public static void cleanCode(String packageName, int loc, int classes) { String superpackage = superpackage(packageName); if (buggyPackages.contains(superpackage) || interiorPackages.contains(superpackage) || superpackage.length() == 0) { goodCodeCount.add(packageName, classes); goodCodeSize.add(packageName, loc); if (superpackage.length() > 0) interiorPackages.add(superpackage); } else cleanCode(superpackage, loc, classes); } public static void main(String[] args) throws Exception { FindBugs.setNoAnalysis(); DetectorFactoryCollection.instance(); // load plugins SortedBugCollection bugCollection = new SortedBugCollection(); int argCount = 0; if (argCount < args.length) bugCollection.readXML(args[argCount++]); else bugCollection.readXML(System.in); for (PackageStats p : bugCollection.getProjectStats().getPackageStats()) if (p.getTotalBugs() > 0) { buggyPackages.add(p.getPackageName()); addInteriorPackages(p.getPackageName()); } for (PackageStats p : bugCollection.getProjectStats().getPackageStats()) if (p.getTotalBugs() == 0) { cleanCode(p.getPackageName(), p.size(), p.getClassStats().size()); } System.out.println("LOC\tTypes\tH\tHM\tDensity"); System.out.println("INTEGER\tINTEGER\tINTEGER\tINTEGER\tFLOAT"); for (PackageStats p : bugCollection.getProjectStats().getPackageStats()) if (p.getTotalBugs() > 0) { int high = p.getBugsAtPriority(Priorities.HIGH_PRIORITY); int normal = p.getBugsAtPriority(Priorities.NORMAL_PRIORITY); System.out.printf("%d\t%d\t%d\t%d\t%g\t\t%s", p.size(), p.getClassStats().size(), high, high + normal, (high + normal) * 1000.0 / p.size(), p.getPackageName().substring(11).replace('.', '\t')); if (isInteriorPackage(p.getPackageName())) System.out.print("\t*"); System.out.println(); } for (Map.Entry<String, Integer> e : goodCodeSize.entrySet()) { System.out.printf("%d\t%d\t%d\t%d\t%g\t\t%s%n", e.getValue(), goodCodeCount.getCount(e.getKey()), 0, 0, 0.0, e .getKey().substring(11).replace('.', '\t')); } } }