package hudson.plugins.crap4j;
import hudson.model.AbstractBuild;
import hudson.model.HealthReport;
import hudson.model.HealthReportingAction;
import hudson.plugins.crap4j.calculation.HealthBuilder;
import hudson.plugins.crap4j.chart.AbstractChartMaker;
import hudson.plugins.crap4j.chart.AreaChartMaker;
import hudson.plugins.crap4j.chart.ChartSeriesDefinition;
import hudson.plugins.crap4j.chart.CrapDataSet;
import hudson.plugins.crap4j.model.ProjectCrapBean;
import hudson.util.ChartUtil;
import java.io.IOException;
import org.kohsuke.stapler.StaplerProxy;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
public class Crap4JBuildAction implements StaplerProxy, HealthReportingAction {
private static final long serialVersionUID = 8586323795728749743L;
private final CrapBuildResult crapResult;
private final AbstractBuild<?, ?> build;
private transient HealthBuilder healthBuilder;
public Crap4JBuildAction(AbstractBuild<?, ?> owner,
CrapBuildResult crapResult,
HealthBuilder healthBuilder) {
super();
this.build = owner;
this.crapResult = crapResult;
this.healthBuilder = healthBuilder;
}
//@Override
public String getDisplayName() {
return "Crap";
}
public ProjectCrapBean getCrap() {
return getTarget().getResultData();
}
//@Override
public String getIconFileName() {
return "/plugin/crap4j/icons/crap-32x32.gif";
}
//@Override
public String getUrlName() {
return "crapResult";
}
public CrapBuildResult getTarget() {
this.crapResult.setOwner(this.build);
return this.crapResult;
}
public CrapBuildResult getResult() {
return getTarget();
}
public boolean hasPreviousCrap() {
return (null != getTarget().getPrevious());
}
//@Override
public HealthReport getBuildHealth() {
if (null == this.healthBuilder) {
this.healthBuilder = Crap4JPublisher.DESCRIPTOR.getHealthBuilder();
}
return (this.healthBuilder.getHealthReportFor(getCrap()));
}
public final void doGraphMap(final StaplerRequest request, final StaplerResponse response) throws IOException {
if (null != ChartUtil.awtProblemCause) {
response.sendRedirect2(request.getContextPath() + "/images/headless.png");
return;
}
CrapDataSet dataset = new CrapDataSet(getResult());
ChartSeriesDefinition definition = getChartDefinitionFor(request);
ChartUtil.generateClickableMap(request, response,
definition.getChartMaker().createChart(
dataset.buildCategoryDataSet(definition),
definition.getAxisTitle()),
500, 200);
}
public final void doGraph(final StaplerRequest request, final StaplerResponse response) throws IOException {
if (null != ChartUtil.awtProblemCause) {
response.sendRedirect2(request.getContextPath() + "/images/headless.png");
return;
}
CrapDataSet dataset = new CrapDataSet(getResult());
ChartSeriesDefinition definition = getChartDefinitionFor(request);
ChartUtil.generateGraph(request, response,
definition.getChartMaker().createChart(
dataset.buildCategoryDataSet(definition),
definition.getAxisTitle()),
500, 200);
}
private String getRelPath(StaplerRequest req) {
String relPath = req.getParameter("rel");
if (null == relPath) {
return "";
}
return relPath;
}
private ChartSeriesDefinition getChartDefinitionFor(final StaplerRequest request) {
String dataType = request.getParameter("data");
if ("crapMethodCount".equals(dataType)) {
return new ChartSeriesDefinition("crap methods", "method count") {
@Override
public Number extractNumberFrom(ProjectCrapBean crap) {
return crap.getCrapMethodCount();
}
@Override
public AbstractChartMaker getChartMaker() {
return new AreaChartMaker(getRelPath(request));
}
};
}
if ("crapLoad".equals(dataType)) {
return new ChartSeriesDefinition("crap load", "crap load") {
@Override
public Number extractNumberFrom(ProjectCrapBean crap) {
return crap.getCrapLoad();
}
};
}
if ("crap".equals(dataType)) {
return new ChartSeriesDefinition("crap", "crap amount") {
@Override
public Number extractNumberFrom(ProjectCrapBean crap) {
return crap.getTotalCrap();
}
};
}
/* default */
return new ChartSeriesDefinition("crappyness", "crap method percentage") {
@Override
public Number extractNumberFrom(ProjectCrapBean crap) {
return crap.getCrapMethodPercent();
}
};
}
}