package net.unit8.waitt.feature.coverage;
import java.io.File;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
import net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler;
import net.sourceforge.cobertura.coveragedata.ProjectData;
import net.sourceforge.cobertura.coveragedata.TouchCollector;
import net.sourceforge.cobertura.reporting.ComplexityCalculator;
import net.sourceforge.cobertura.reporting.html.HTMLReport;
import net.sourceforge.cobertura.util.FileFinder;
/**
*
* @author kawasima
*/
public class ReportGenerator implements Runnable {
private static final Logger LOG = Logger.getLogger(ReportGenerator.class.getName());
private final ComplexityCalculator complexity;
private final FileFinder finder;
private final ClassLoader classLoader;
private final File reportDirectory;
private final long reportInterval;
public ReportGenerator(ClassLoader classLoader, CoverageMonitorConfiguration config) {
this.classLoader = classLoader;
finder = new FileFinder();
finder.addSourceDirectory(config.getSourceDirectory().getAbsolutePath());
complexity = new ComplexityCalculator(finder);
reportDirectory = config.getCoverageReportDirectory();
reportInterval = config.getReportIntervalSeconds();
}
@Override
public void run() {
while(true) {
if (!(classLoader instanceof CoberturaClassLoader)) {
LOG.warning("CoverageMonitor wasn't loaded from CoberturaClassLoader.");
break;
}
ProjectData data = ((CoberturaClassLoader) classLoader).getInstrumenter().getProjectData();
TouchCollector.applyTouchesOnProjectData(data);
CoverageDataFileHandler.saveCoverageData(data, CoverageDataFileHandler.getDefaultDataFile());
try {
new HTMLReport(data, reportDirectory, finder, complexity, "UTF-8");
} catch (Exception ignore) {
/* ignore */
}
try {
TimeUnit.SECONDS.sleep(reportInterval);
} catch (InterruptedException ignore) { /* ignore */ }
}
}
}