/* * FindBugs - Find bugs in Java programs * Copyright (C) 2003-2005 William Pugh * 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 edu.umd.cs.findbugs.BugCollection; import edu.umd.cs.findbugs.FindBugs; import edu.umd.cs.findbugs.PackageStats; import edu.umd.cs.findbugs.PackageStats.ClassStats; import edu.umd.cs.findbugs.ProjectStats; import edu.umd.cs.findbugs.SortedBugCollection; /** * Java main application to compute defect density for a bug collection (stored * as an XML collection) * * @author William Pugh */ public class DefectDensity { private static void printRow(Object... values) { for (Object s : values) { System.out.print(s); System.out.print("\t"); } System.out.println(); } public static double density(int bugs, int ncss) { if (ncss == 0) return Double.NaN; long bugsPer10KNCSS = Math.round(10000.0 * bugs / ncss); return bugsPer10KNCSS / 10.0; } public static void main(String args[]) throws Exception { if (args.length > 1 || (args.length > 0 && "-help".equals(args[0]))) { System.err.println("Usage: " + DefectDensity.class.getName() + " [<infile>]"); System.exit(1); } FindBugs.setNoAnalysis(); BugCollection origCollection = new SortedBugCollection(); int argCount = 0; if (argCount == args.length) origCollection.readXML(System.in); else origCollection.readXML(args[argCount]); ProjectStats stats = origCollection.getProjectStats(); printRow("kind", "name", "density/KNCSS", "bugs", "NCSS"); double projectDensity = density(stats.getTotalBugs(), stats.getCodeSize()); printRow("project", origCollection.getCurrentAppVersion().getReleaseName(), projectDensity, stats.getTotalBugs(), stats.getCodeSize()); for (PackageStats p : stats.getPackageStats()) if (p.getTotalBugs() > 4) { double packageDensity = density(p.getTotalBugs(), p.size()); if (Double.isNaN(packageDensity) || packageDensity < projectDensity) continue; printRow("package", p.getPackageName(), packageDensity, p.getTotalBugs(), p.size()); for (ClassStats c : p.getSortedClassStats()) if (c.getTotalBugs() > 4) { double density = density(c.getTotalBugs(), c.size()); if (Double.isNaN(density) || density < packageDensity) continue; printRow("class", c.getName(), density, c.getTotalBugs(), c.size()); } } } }