package hudson.plugins.grinder;
import hudson.model.AbstractBuild;
import hudson.util.ChartUtil;
import hudson.util.ColorPalette;
import hudson.util.DataSetBuilder;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.renderer.category.StatisticalBarRenderer;
import org.jfree.data.statistics.DefaultStatisticalCategoryDataset;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import java.awt.Color;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.util.List;
/**
* Action used for Grinder report on build level.
*
* @author Eivind B Waaler
*/
public class GrinderBuildAction extends AbstractGrinderAction {
private final AbstractBuild<?, ?> build;
private Test totals;
private List<Test> tests;
public GrinderBuildAction(AbstractBuild<?, ?> build, InputStream is, PrintStream logger) {
this.build = build;
ResultReader rs = new ResultReader(is, logger);
totals = rs.getTotals();
tests = rs.getTests();
logger.println("Created Grinder results");
}
public AbstractBuild<?, ?> getBuild() {
return build;
}
public Test getTotals() {
return totals;
}
public List<Test> getTests() {
return tests;
}
public void doTestGraph(StaplerRequest request, StaplerResponse response)
throws IOException {
if (shouldReloadGraph(request, response, build)) {
ChartUtil.generateGraph(request, response, createTestGraph(), 800, 400);
}
}
private JFreeChart createTestGraph() {
DefaultStatisticalCategoryDataset timeDS = new DefaultStatisticalCategoryDataset();
DataSetBuilder<String, Comparable> lengthDS = new DataSetBuilder<String, Comparable>();
for (Test test : tests) {
timeDS.add(test.getMeanTime(), test.getStdDev(), Test.MEAN_TEST_TIME, test.getId());
lengthDS.add(test.getMeanRespLength(), Test.MEAN_RESPONSE_LENGTH, test.getId());
}
final CategoryAxis xAxis = new CategoryAxis("Test name");
xAxis.setLowerMargin(0.01);
xAxis.setUpperMargin(0.01);
xAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90);
xAxis.setMaximumCategoryLabelLines(3);
final ValueAxis timeAxis = new NumberAxis("Time (ms)");
final ValueAxis lengthAxis = new NumberAxis("Length (bytes)");
final BarRenderer timeRenderer = new StatisticalBarRenderer();
timeRenderer.setSeriesPaint(2, ColorPalette.RED);
timeRenderer.setSeriesPaint(1, ColorPalette.YELLOW);
timeRenderer.setSeriesPaint(0, ColorPalette.BLUE);
timeRenderer.setItemMargin(0.0);
final CategoryPlot plot = new CategoryPlot(timeDS, xAxis, timeAxis, timeRenderer);
plot.setBackgroundPaint(Color.WHITE);
plot.setOutlinePaint(null);
plot.setForegroundAlpha(0.8f);
plot.setRangeGridlinesVisible(true);
plot.setRangeGridlinePaint(Color.black);
final CategoryItemRenderer lengthRenderer = new LineAndShapeRenderer();
plot.setRangeAxis(1, lengthAxis);
plot.setDataset(1, lengthDS.build());
plot.mapDatasetToRangeAxis(1, 1);
plot.setRenderer(1, lengthRenderer);
JFreeChart chart = new JFreeChart("Test time", plot);
chart.setBackgroundPaint(Color.WHITE);
return chart;
}
}