package net.sourceforge.cobertura.dsl;
import net.sourceforge.cobertura.check.CheckCoverageTask;
import net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler;
import net.sourceforge.cobertura.coveragedata.ProjectData;
import net.sourceforge.cobertura.instrument.CodeInstrumentationTask;
import net.sourceforge.cobertura.merge.MergeProjectDataFilesTask;
import net.sourceforge.cobertura.reporting.ComplexityCalculator;
import net.sourceforge.cobertura.reporting.CompositeReport;
import net.sourceforge.cobertura.reporting.NativeReport;
import net.sourceforge.cobertura.reporting.Report;
import java.util.concurrent.atomic.AtomicBoolean;
import static net.sourceforge.cobertura.coveragedata.TouchCollector.applyTouchesOnProjectData;
/*
* Cobertura - http://cobertura.sourceforge.net/
*
*
* Cobertura is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation; either version 2 of the License,
* or (at your option) any later version.
*
* Cobertura is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Cobertura; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*/
public class Cobertura {
private Arguments args;
private ProjectData projectData;
private CodeInstrumentationTask instrumentationTask;
private CheckCoverageTask checkCoverageTask;
private MergeProjectDataFilesTask mergeProjectDataFilesTask;
private AtomicBoolean didApplyInstrumentationResults;
private CompositeReport report;
/*
* Private constructor so we get sure Cobertura
* is always initialized with Arguments
*/
private Cobertura() {
report = new CompositeReport();
}
public Cobertura(Arguments arguments) {
report = new CompositeReport();
args = arguments;
instrumentationTask = new CodeInstrumentationTask();
checkCoverageTask = new CheckCoverageTask();
mergeProjectDataFilesTask = new MergeProjectDataFilesTask();
didApplyInstrumentationResults = new AtomicBoolean(false);
}
Instruments the code. Should be invoked after compiling.
Classes to be instrumented are taken from constructor args
Throws: Returns: this Cobertura instance
/**
* Instruments the code. Should be invoked after compiling.
* Classes to be instrumented are taken from constructor args
* @return this Cobertura instance
* @throws Throwable
*/
public Cobertura instrumentCode() throws Throwable {
instrumentationTask.instrument(args, getProjectDataInstance());
return this;
}
This should be invoked after running tests.
Returns: this Cobertura instance
/**
* This should be invoked after running tests.
* @return this Cobertura instance
*/
public Cobertura calculateCoverage() {
applyTouchesOnProjectData(projectData);
didApplyInstrumentationResults.set(true);
return this;
}
Checks metrics values against thresholds
Returns: this Cobertura instance
/**
* Checks metrics values against thresholds
* @return this Cobertura instance
*/
public Cobertura checkThresholds() {
report.addReport(checkCoverageTask.checkCoverage(args,
getProjectDataInstance()));
return this;
}
Merges specified project data files as specified on arguments;
Returns: this Cobertura instance
/**
* Merges specified project data files as specified on arguments;
* @return this Cobertura instance
*/
public Cobertura merge() {
mergeProjectDataFilesTask.mergeProjectDataFiles(args,
getProjectDataInstance());
return this;
}
Creates a report with coverage and metrics data
Returns: Report instance, never null
/**
* Creates a report with coverage and metrics data
* @return Report instance, never <code>null</code>
*/
public Report report() {
// if (!didApplyInstrumentationResults.get()) {
// calculateCoverage();
// }
ComplexityCalculator complexityCalculator = new ComplexityCalculator(
args.getSources());
complexityCalculator.setEncoding(args.getEncoding());
complexityCalculator.setCalculateMethodComplexity(args.isCalculateMethodComplexity());
report.addReport(new NativeReport(getProjectDataInstance(), args
.getDestinationDirectory(), args.getSources(),
complexityCalculator, args.getEncoding()));
return report;
}
Serializes project data to file specified in constructor args
Returns: this Cobertura instance
/**
* Serializes project data to file specified in constructor args
* @return this Cobertura instance
*/
public Cobertura saveProjectData() {
CoverageDataFileHandler.saveCoverageData(getProjectDataInstance(), args
.getDataFile());
return this;
}
/* Aux methods */
private ProjectData getProjectDataInstance() {
// Load project data; see notes at the beginning of CodeInstrumentationTask class
if (projectData != null) {
return projectData;
}
if (args.getDataFile().isFile())
projectData = CoverageDataFileHandler.loadCoverageData(args
.getDataFile());
if (projectData == null)
projectData = new ProjectData();
return projectData;
}
}