package hudson.plugins.testabilityexplorer.helpers;
import hudson.FilePath;
import hudson.model.AbstractBuild;
import hudson.model.BuildListener;
import hudson.model.Result;
import hudson.remoting.Callable;
import java.util.ArrayList;
import java.util.List;
import hudson.plugins.testabilityexplorer.parser.StatisticsParser;
import hudson.plugins.testabilityexplorer.report.health.ReportBuilder;
import hudson.plugins.testabilityexplorer.report.CostDetailBuilder;
/**
* The {@link BuildProxy} is proxying the the real build and enriching it with additional helper classes. These
* helper classes such as {@link CostDetailBuilder} or {@link StatisticsParser} will be used in different processing
* steps as the {@link BuildProxy} is passed around.
*
* @author reik.schatz
*/
public final class BuildProxy
{
private final FilePath m_moduleRoot;
private final StatisticsParser m_statisticsParser;
private final CostDetailBuilder m_detailBuilder;
private final ReportBuilder m_reportBuilder;
private final List<AbstractBuildAction<AbstractBuild<?, ?>>> m_actions = new ArrayList<AbstractBuildAction<AbstractBuild<?, ?>>>();
private Result m_result = null;
public BuildProxy(FilePath moduleRoot, StatisticsParser statisticsParser, CostDetailBuilder detailBuilder, ReportBuilder reportBuilder)
{
m_moduleRoot = moduleRoot;
m_statisticsParser = statisticsParser;
m_detailBuilder = detailBuilder;
m_reportBuilder = reportBuilder;
}
public boolean doPerform(ParseDelegate parseDelegate, AbstractBuild<?, ?> build, BuildListener listener)
{
Callable<BuildProxy, Exception> callableHelper = new BuildProxyCallableHelper(this, parseDelegate, listener);
BuildProxy buildProxy = null;
try
{
buildProxy = this.getModuleRoot().act(callableHelper);
buildProxy.updateBuild(build);
}
catch (Throwable e)
{
if (buildProxy != null)
{
buildProxy.setResult(Result.FAILURE);
}
return Boolean.FALSE;
}
return Boolean.TRUE;
}
public FilePath getModuleRoot()
{
return m_moduleRoot;
}
public StatisticsParser getStatisticsParser()
{
return m_statisticsParser;
}
public CostDetailBuilder getDetailBuilder()
{
return m_detailBuilder;
}
public ReportBuilder getReportBuilder()
{
return m_reportBuilder;
}
public Result getResult()
{
return m_result;
}
public void setResult(Result result)
{
m_result = result;
}
public void updateBuild(AbstractBuild<?, ?> build)
{
// add actions
for (AbstractBuildAction<AbstractBuild<?, ?>> action : m_actions)
{
if (!build.getActions().contains(action))
{
action.setBuild(build);
build.getActions().add(action);
}
}
// set result
Result result = getResult();
build.setResult(result == null ? Result.SUCCESS : result);
}
public void addAction(AbstractBuildAction<AbstractBuild<?, ?>> abstractBuildAction)
{
m_actions.add(abstractBuildAction);
}
}