package org.projectusus.statistics; import static org.projectusus.core.basis.LocationType.PROJECT; import org.projectusus.core.basis.LocationType; import org.projectusus.core.basis.MetricsResults; import org.projectusus.core.filerelations.model.Packagename; import org.projectusus.core.statistics.CockpitExtension; /** * Implements a linear measurement schema for class size. Classes with more than 20 methods are measured. 21 methods counts 0.05, 40 methods counts 1, and so on. * * @author Nicole Rauch * */ public class LinearPackageLocationSizeStatistic extends CockpitExtension { private static int PKG_LIMIT = 12; private double linearViolations = 0.0; public LinearPackageLocationSizeStatistic() { super( codeProportionUnit_PACKAGE_PER_PROJECT_label, PKG_LIMIT ); } @Override public void inspectPackage( Packagename pkg, MetricsResults results ) { int pkgSize = valueForPackage( results ); addResult( pkg, pkgSize, pkg.getClassesInPackage() ); int surplusClasses = pkgSize - PKG_LIMIT; if( surplusClasses > 0 ) { linearViolations += ((double)surplusClasses / PKG_LIMIT); } } public int valueForPackage( MetricsResults results ) { return results.getIntValue( MetricsResults.CLASSES ); } @Override public double getAverage() { return calculateAverage( linearViolations, getBasis() ); } @Override public String getLabel() { return "Package size (per project)"; //$NON-NLS-1$ } @Override protected String getTooltip() { return "The underlying metric determines the number of classes in each package of a project.\n" //$NON-NLS-1$ + "If a package occurs in multiple projects, it is counted several times.\n" //$NON-NLS-1$ + "The class visibility is not taken into account.\n" + getDescription(); //$NON-NLS-1$ } @Override protected LocationType getLocationType() { return PROJECT; } @Override protected String hotspotsAreUnits() { return format( "with more than %d classes.", PKG_LIMIT ); } }