package org.projectusus.statistics;
import org.projectusus.core.basis.MetricsResults;
import org.projectusus.core.basis.SourceCodeLocation;
import org.projectusus.core.statistics.CockpitExtension;
public class MudholeStatistic extends CockpitExtension {
private static final int MUDHOLE_LIMIT = 49;
// class metrics
private LinearClassSizeStatistic classSize = new LinearClassSizeStatistic();
// method metrics
private LinearMethodLengthStatistic methodLength = new LinearMethodLengthStatistic();
private LinearCyclomaticComplexityStatistic cc = new LinearCyclomaticComplexityStatistic();
private int currentClassValue;
public MudholeStatistic() {
super( codeProportionUnit_METHOD_label, MUDHOLE_LIMIT );
}
@Override
public void inspectClass( SourceCodeLocation location, MetricsResults results ) {
int result = classSize.valueForClass( results );
currentClassValue = result >= LinearClassSizeStatistic.KG_LIMIT ? result : 0;
}
@Override
public void inspectMethod( SourceCodeLocation location, MetricsResults results ) {
int methodValue = methodLength.valueForMethod( results ) * cc.valueForMethod( results );
methodValue += currentClassValue;
addResult( location, methodValue );
}
@Override
public String getLabel() {
return "Mudholes"; //$NON-NLS-1$
}
@Override
protected String hotspotsAreUnits() {
return format( "where the product of method length and cyclomatic complexity (increased by the class size if the latter exceeds %d) is greater than %d.",
LinearClassSizeStatistic.KG_LIMIT, MUDHOLE_LIMIT );
}
@Override
protected String getRatingFunction() {
return format( "\nRating function: f(ML) * f(CC) + f(KG) > %d", MUDHOLE_LIMIT ); //$NON-NLS-1$
}
}