package com.ikokoon.serenity.process.aggregator;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import com.ikokoon.serenity.model.Afferent;
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.model.Project;
import com.ikokoon.serenity.persistence.IDataBase;
import com.ikokoon.toolkit.Toolkit;
/**
* @author Michael Couck
* @since 07.03.10
* @version 01.00
*/
public class ProjectAggregator extends AAggregator {
public ProjectAggregator(IDataBase dataBase) {
super(dataBase);
}
@SuppressWarnings("unchecked")
public void aggregate() {
// First do the packages
List<Package> packages = dataBase.find(Package.class);
for (Package pakkage : packages) {
new PackageAggregator(dataBase, pakkage).aggregate();
}
Project<?, ?> project = dataBase.find(Project.class, Toolkit.hash(Project.class.getName()));
if (project == null) {
project = new Project();
project.setName(Project.class.getName());
}
aggregate(project);
setPrecision(project);
dataBase.persist(project);
}
@SuppressWarnings("unchecked")
protected void aggregate(Project<?, ?> project) {
logger.debug("Processing project : " + project);
List<Package> packages = dataBase.find(Package.class);
logger.debug("Packages : " + packages);
project.setTimestamp(new Date());
List<Line<?, ?>> lines = getLines(packages);
List<Method<?, ?>> methods = getMethods(packages);
double classes = 0d;
double totalComplexity = 0;
double executed = 0d;
double interfaces = 0;
double implementations = 0;
Set<Efferent> efference = new TreeSet<Efferent>();
Set<Afferent> afference = new TreeSet<Afferent>();
for (Method<?, ?> method : methods) {
totalComplexity += method.getComplexity();
}
for (Line<?, ?> line : lines) {
if (line.getCounter() > 0) {
executed++;
}
}
if (logger.isDebugEnabled()) {
logger.debug("Lines : " + lines.size() + ", executed : " + executed);
}
if (lines.size() > 0) {
for (Package<?, ?> pakkage : packages) {
interfaces += pakkage.getInterfaces();
implementations += pakkage.getImplementations();
efference.addAll(pakkage.getEfferent());
afference.addAll(pakkage.getAfferent());
classes += pakkage.getChildren().size();
}
}
// lines.size() > 0 ? (executed / lines.size()) * 100d : 0;
double coverage = getCoverage(lines.size(), executed);
// methods.size() > 0 ? totalComplexity / methods.size() : 0;
double complexity = getComplexity(methods.size(), totalComplexity);
// (efferent + afferent) > 0 ? efferent / (efferent + afferent) : 1d;
double stability = getStability(efference.size(), afference.size());
// (interfaces + implementations) > 0 ? interfaces / (interfaces + implementations) : 1d;
double abstractness = getAbstractness(interfaces, implementations);
// Math.abs(-stability + -abstractness + 1) / Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2));
double distance = getDistance(stability, abstractness);
project.setComplexity(complexity);
project.setCoverage(coverage);
project.setAbstractness(abstractness);
project.setStability(stability);
project.setDistance(distance);
project.setLines(lines.size());
project.setMethods(methods.size());
project.setClasses(classes);
project.setPackages(packages.size());
setPrecision(project);
}
}