package org.jvnet.hudson.plugins.purecoverage;
import hudson.model.AbstractBuild;
import hudson.model.Action;
import java.io.File;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.Arrays;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jvnet.hudson.plugins.purecoverage.domain.ProjectCoverage;
import org.jvnet.hudson.plugins.purecoverage.parser.PureCoverageParser;
import org.kohsuke.stapler.StaplerProxy;
@SuppressWarnings("unchecked")
public class CoverageBuildAction implements StaplerProxy, Action {
private static final long serialVersionUID = 1L;
private static final Logger logger = Logger.getLogger(CoverageBuildAction.class.getName());
private final AbstractBuild owner;
private transient WeakReference<CoverageResult> coverageResult;
private String coverageTotal;
public CoverageBuildAction(AbstractBuild owner, CoverageResult coverageResult) {
setCoverageResult(coverageResult);
if (owner == null) {
throw new RuntimeException("owner cannot be null");
}
this.owner = owner;
}
private void setCoverageResult(CoverageResult coverageResult) {
this.coverageResult = new WeakReference(coverageResult);
this.coverageTotal = coverageResult.getLineCoverage().toString();
}
public String getDisplayName() {
return "PureCoverage report";
}
public String getIconFileName() {
return "graph.gif";
}
public String getUrlName() {
return "purecoverage";
}
public Object getTarget() {
return getCoverageResult();
}
public CoverageResult getCoverageResult() {
if (!hasResult()) {
//try to reload from file
reloadReport();
}
if (!hasResult()) {
//return empty result
return new CoverageResult(owner, null);
}
return coverageResult.get();
}
private boolean hasResult() {
return coverageResult != null && coverageResult.get() != null;
}
private void reloadReport() {
CoverageReportsFinder finder = new CoverageReportsFinder();
File[] reports = finder.findReports(owner);
logger.log(Level.INFO, "Reloading PureCoverage report from file(s): " + Arrays.toString(reports));
for (File report : reports) {
try {
CoverageParser coverageParser = new PureCoverageParser();
ProjectCoverage projectCoverage = coverageParser.parse(report);
CoverageResult result = new CoverageResult(owner, projectCoverage);
setCoverageResult(result);
} catch (IOException e) {
logger.log(Level.WARNING, "Unable to load coverage report from file: " + report, e);
}
}
}
public String getCoverageTotal() {
return coverageTotal;
}
}