package org.projectusus.statistics; import java.util.List; import java.util.Set; import org.projectusus.core.basis.CodeProportion; import org.projectusus.core.basis.CodeStatistic; import org.projectusus.core.basis.Hotspot; import org.projectusus.core.basis.SinglePackageHotspot; import org.projectusus.core.filerelations.model.ClassDescriptor; import org.projectusus.core.filerelations.model.IntraPackageComponents; 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; import ch.akuhn.foreach.Collect; import ch.akuhn.foreach.ForEach; import ch.akuhn.foreach.Select; public class LackOfCohesionOfClassesStatistic extends CockpitExtension { private static final int LCOC_LIMIT = 1; public LackOfCohesionOfClassesStatistic() { super( codeProportionUnit_PACKAGE_label, LCOC_LIMIT ); //$NON-NLS-1$ } @Override public CodeProportion getCodeProportion() { CodeStatistic basisStatistic = getBasisStatistic(); IntraPackageComponents intraPackageComponents = new IntraPackageComponents(); int setCount = intraPackageComponents.getComponents().size(); double level = average( setCount, basisStatistic.getValue() ); List<Hotspot> hotspots = createHotspots( intraPackageComponents ); return new CodeProportion( getLabel(), getDescription(), getTooltip(), hotspots.size(), basisStatistic, level, hotspots, getHistogram(), getLocationType() ); } private double average( int setCount, int baseCount ) { if( (double)baseCount == 0 ) { return 0.0; } return (double)setCount / (double)baseCount; } private List<Hotspot> createHotspots( IntraPackageComponents intraPackageComponents ) { List<List<Set<ClassDescriptor>>> listen = zusammenhangskomponentenListenFuerMehrteiligePackages( intraPackageComponents ); for( Collect<List<Set<ClassDescriptor>>> element : ForEach.collect( listen ) ) { Set<ClassDescriptor> menge = element.value.iterator().next(); Packagename pkg = menge.iterator().next().getPackagename(); element.yield = new SinglePackageHotspot( pkg, element.value.size(), pkg.getOSPath(), pkg.getClassesInPackage() ); } return ForEach.result(); } private List<List<Set<ClassDescriptor>>> zusammenhangskomponentenListenFuerMehrteiligePackages( IntraPackageComponents intraPackageComponents ) { for( Select<List<Set<ClassDescriptor>>> entry : ForEach.select( intraPackageComponents.getSetsPerPackage().values() ) ) { entry.yield = entry.value.size() > LCOC_LIMIT; } return ForEach.<List<List<Set<ClassDescriptor>>>> result(); } @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 "Lack of cohesion of classes"; //$NON-NLS-1$ } @Override protected String getTooltip() { return "This statistic describes the number of unconnected groups of classes in a package.\n" + getDescription(); } @Override protected String hotspotsAreUnits() { return format( "with a LCOC greater than %d.", LCOC_LIMIT ); } }