/*
 * 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());
                    }
                }
            }
        }

    }

}
