package hudson.plugins.cppncss;
import hudson.FilePath;
import hudson.model.AbstractBuild;
import hudson.model.Action;
import hudson.model.BuildListener;
import hudson.model.HealthReport;
import hudson.model.Result;
import hudson.plugins.cppncss.parser.Statistic;
import hudson.plugins.cppncss.parser.StatisticsResult;
import hudson.plugins.helpers.BuildProxy;
import hudson.plugins.helpers.Ghostwriter;
import java.io.File;
import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.xmlpull.v1.XmlPullParserException;
/**
* TODO javadoc.
*
* @author Stephen Connolly
* @since 08-Jan-2008 23:16:52
*/
public class CppNCSSGhostwriter
implements Ghostwriter,
Ghostwriter.MasterGhostwriter,
Ghostwriter.SlaveGhostwriter {
private final String reportFilenamePattern;
private final CppNCSSHealthTarget[] targets;
private final Integer functionCcnViolationThreshold;
private final Integer functionNcssViolationThreshold;
public CppNCSSGhostwriter(String reportFilenamePattern, Integer functionCcnViolationThreshold, Integer functionNcssViolationThreshold, CppNCSSHealthTarget... targets) {
this.reportFilenamePattern = reportFilenamePattern;
this.functionCcnViolationThreshold = functionCcnViolationThreshold;
this.functionNcssViolationThreshold = functionNcssViolationThreshold;
this.targets = targets;
}
public boolean performFromMaster(AbstractBuild<?, ?> build, FilePath executionRoot, BuildListener listener)
throws InterruptedException, IOException {
if (targets != null && targets.length > 0) {
List<Action> actions = build.getActions();
Result buildResult = build.getResult();
for (Action action : actions) {
if(action instanceof CppNCSSBuildIndividualReport) {
CppNCSSBuildIndividualReport cppncssAction = (CppNCSSBuildIndividualReport)action;
cppncssAction.setBuild(build);
for (CppNCSSHealthTarget target : targets) {
Result result = target.evaluateStability(cppncssAction);
if(result.isWorseThan(buildResult)){
buildResult = result;
}
}
}
}
build.setResult(buildResult);
}
return true;
}
public boolean performFromSlave(BuildProxy build, BuildListener listener) throws InterruptedException, IOException {
FilePath[] paths = build.getExecutionRootDir().list(reportFilenamePattern);
StatisticsResult results = null;
Set<String> parsedFiles = new HashSet<String>();
for (FilePath path : paths) {
final String pathStr = path.getRemote();
if (!parsedFiles.contains(pathStr)) {
parsedFiles.add(pathStr);
try {
StatisticsResult result = Statistic.parse(new File(pathStr));
if (results == null) {
results = result;
} else {
results = StatisticsResult.merge(results, result);
}
} catch (XmlPullParserException e) {
e.printStackTrace(listener.getLogger());
}
}
}
if (results != null) {
CppNCSSBuildIndividualReport action = new CppNCSSBuildIndividualReport(results, functionCcnViolationThreshold, functionNcssViolationThreshold);
if (targets != null && targets.length > 0) {
HealthReport r = null;
for (CppNCSSHealthTarget target : targets) {
r = HealthReport.min(r, target.evaluateHealth(action, PluginImpl.DISPLAY_NAME + ": "));
}
action.setBuildHealth(r);
}
build.getActions().add(action);
}
return true;
}
}