package org.projectusus.statistics;
import java.util.ArrayList;
import java.util.List;
import org.projectusus.core.basis.CodeProportion;
import org.projectusus.core.basis.CodeStatistic;
import org.projectusus.core.basis.Hotspot;
import org.projectusus.core.basis.PackageHotspot;
import org.projectusus.core.filerelations.model.Cycle;
import org.projectusus.core.filerelations.model.PackageCycles;
import org.projectusus.core.filerelations.model.PackageRelations;
import org.projectusus.core.filerelations.model.Packagename;
import org.projectusus.core.statistics.CockpitExtension;
import org.projectusus.core.statistics.visitors.PackageCountVisitor;
public class PackageCycleStatistic extends CockpitExtension {
public PackageCycleStatistic() {
super( codeProportionUnit_PACKAGE_label, 0 ); //$NON-NLS-1$
}
@Override
public CodeProportion getCodeProportion() {
CodeStatistic basisStatistic = getBasisStatistic();
PackageCycles packageCycles = new PackageRelations().getPackageCycles();
int violations = packageCycles.numberOfPackagesInAnyCycles();
double level = calculateAverage( violations, basisStatistic.getValue() );
return new CodeProportion( getLabel(), getDescription(), getTooltip(), violations, basisStatistic, level, createHotspots( packageCycles ), getHistogram(),
getLocationType() );
}
private List<Hotspot> createHotspots( PackageCycles packageCycles ) {
List<Hotspot> hotspots = new ArrayList<Hotspot>();
for( Cycle<Packagename> cycle : packageCycles.getPackageCycles() ) {
int cyclesize = cycle.numberOfElements();
for( Packagename pack : cycle.getElementsInCycle() ) {
hotspots.add( new PackageHotspot( pack, cyclesize, cycle ) );
}
}
return hotspots;
}
@Override
public CodeStatistic getBasisStatistic() {
return new PackageCountVisitor().visitAndReturn().getCodeStatistic();
}
@Override
public int getBasis() {
return getBasisStatistic().getValue();
}
@Override
public int getViolations() {
return new PackageRelations().getPackageCycles().numberOfPackagesInAnyCycles();
}
@Override
public String getLabel() {
return "Packages with cyclic dependencies"; //$NON-NLS-1$
}
@Override
protected String getRatingFunction() {
return "\nRating function: f(value) = value";
}
@Override
protected String getTooltip() {
return "The underlying metric determines the relationships between classes.\n" //$NON-NLS-1$
+ "The statistic reduces these class relationships to relationships between the packages involved and examines the result with regard to cyclic dependencies.\n" + //$NON-NLS-1$
"Such dependencies appear when classes are located in the wrong packages. It indicates problems in the design and the structuring of the code.\n"
+ getDescription(); //$NON-NLS-1$
}
@Override
protected String hotspotsAreUnits() {
return "that are part of a cycle.";
}
}