package com.ikokoon.serenity.process.aggregator; import java.util.List; import java.util.Set; import java.util.TreeSet; import com.ikokoon.serenity.model.Afferent; import com.ikokoon.serenity.model.Class; import com.ikokoon.serenity.model.Efferent; import com.ikokoon.serenity.model.Line; import com.ikokoon.serenity.model.Method; import com.ikokoon.serenity.model.Package; import com.ikokoon.serenity.persistence.IDataBase; /** * @author Michael Couck * @since 07.03.10 * @version 01.00 */ public class PackageAggregator extends AAggregator { private Package<?, ?> pakkage; public PackageAggregator(IDataBase dataBase, Package<?, ?> pakkage) { super(dataBase); this.pakkage = pakkage; } @SuppressWarnings("unchecked") public void aggregate() { // First do the classes List<Class<?, ?>> classes = pakkage.getChildren(); for (Class klass : classes) { new ClassAggregator(dataBase, klass).aggregate(); } aggregate(pakkage); setPrecision(pakkage); dataBase.persist(pakkage); } @SuppressWarnings("unchecked") protected void aggregate(Package pakkage) { logger.debug("Processing package : " + pakkage); List<Line<?, ?>> lines = getLines(pakkage); List<Method<?, ?>> methods = getMethods(pakkage); double interfaces = 0d; double implementations = 0d; double executed = 0d; double methodAccumulatedComplexity = 0d; if (methods != null) { for (Method<?, ?> method : methods) { methodAccumulatedComplexity += method.getComplexity(); } } if (lines != null) { for (Line<?, ?> line : lines) { if (line.getCounter() > 0) { executed++; } } } Set<Efferent> efference = new TreeSet<Efferent>(); Set<Afferent> afference = new TreeSet<Afferent>(); List<Class<?, ?>> classes = pakkage.getChildren(); for (Class klass : classes) { if (klass.getInterfaze()) { interfaces++; } else { implementations++; } List<Efferent> efferents = klass.getEfferent(); for (Efferent efferent : efferents) { efference.add(efferent); } List<Afferent> afferents = klass.getAfferent(); for (Afferent afferent : afferents) { afference.add(afferent); } logger.info("Class : " + klass.getName()); } logger.info("Package : " + pakkage.getName() + ", interfaces : " + interfaces + ", implementations : " + implementations); pakkage.setEfferent(efference); pakkage.setAfferent(afference); pakkage.setLines(lines.size()); pakkage.setExecuted(executed); // lines.size() > 0 ? (linesExecuted / lines.size()) * 100d : 0; double coverage = getCoverage(lines.size(), executed); // methods.size() > 0 ? methodAccumulatedComplexity / methods.size() : 1; double complexity = getComplexity(methods.size(), methodAccumulatedComplexity); // (interfaces + implementations) > 0 ? interfaces / (interfaces + implementations) : 1; double abstractness = getAbstractness(interfaces, implementations); // (efferent + afferent) > 0 ? efferent / (efferent + afferent) : 1d; double stability = getStability(efference.size(), afference.size()); // Math.abs(-stability + -abstractness + 1) / Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2)); double distance = getDistance(stability, abstractness); pakkage.setInterfaces(interfaces); pakkage.setImplementations(implementations); pakkage.setEfference(efference.size()); pakkage.setAfference(afference.size()); pakkage.setCoverage(coverage); pakkage.setComplexity(complexity); pakkage.setStability(stability); pakkage.setAbstractness(abstractness); pakkage.setDistance(distance); } }