package hudson.plugins.PerfPublisher; import java.awt.Color; import java.io.IOException; import java.util.List; import org.jfree.chart.ChartFactory; 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.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.renderer.category.CategoryItemRenderer; import org.jfree.ui.RectangleInsets; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import hudson.model.ModelObject; import hudson.model.AbstractBuild; import hudson.model.Result; import hudson.plugins.PerfPublisher.Report.Test; import hudson.util.ChartUtil; import hudson.util.ColorPalette; import hudson.util.DataSetBuilder; import hudson.util.ShiftedCategoryAxis; import hudson.util.ChartUtil.NumberOnlyBuildLabel; public class TestDetails implements ModelObject { private final Test test; private final AbstractBuild<?, ?> _owner; public TestDetails(final AbstractBuild<?, ?> owner, Test test) { this.test = test; this._owner = owner; } public AbstractBuild<?, ?> getOwner() { return _owner; } public String getDisplayName() { return "Details of test " + test.getName(); } public Test getTest() { return test; } public String getSuccessGraph() { String result = ""; Object ob_builds = (Object)_owner.getProject().getBuilds(); List<Object> builds = (List<Object>) ob_builds; float taille_case = 100.0f/Math.min(builds.size(), 25); int total = 0; int indice_build = 0; for (int j=0; j<Math.min(builds.size(), 25); j++) { Object build = builds.get(j); String numberBuild = "#"; String color = "white"; AbstractBuild abstractBuild = (AbstractBuild) build; if (!abstractBuild.isBuilding() && abstractBuild.getResult().isBetterOrEqualTo(Result.SUCCESS)) { PerfPublisherBuildAction action = abstractBuild.getAction(PerfPublisherBuildAction.class); if (action!=null && action.getReport() != null) { Test prev_test = action.getReports().getTestWithName(this.test.getName()); if (prev_test!=null) { if (!prev_test.isExecuted()) { color="orange"; } else { if (prev_test.isSuccessfull() && prev_test.isExecuted()) { color="blue"; } else { color="red"; } } } else { color = "grey"; } } } numberBuild = "#"+abstractBuild.getNumber(); total +=taille_case; if (indice_build==Math.min(builds.size(), 25)-1 && total<100) { taille_case +=100-total; } result+="<div id=\""+color+"\" style=\"width:"+taille_case+"%;\">"+numberBuild+"</div>"; } return result; } public void doPerformanceGraph(StaplerRequest request, StaplerResponse response) throws IOException { ChartUtil.generateGraph(request, response, createPerformanceGraph(), 800, 250); } private JFreeChart createPerformanceGraph() { DataSetBuilder<String, NumberOnlyBuildLabel> builder = new DataSetBuilder<String, NumberOnlyBuildLabel>(); for (Object build : _owner.getProject().getBuilds()) { AbstractBuild abstractBuild = (AbstractBuild) build; if (!abstractBuild.isBuilding() && abstractBuild.getResult().isBetterOrEqualTo( Result.SUCCESS)) { PerfPublisherBuildAction action = abstractBuild .getAction(PerfPublisherBuildAction.class); if (action!=null && action.getReport() != null) { for (int i = 0; i < action.getReports().getNumberOfTest(); i++) { if (action.getReports().getTests().get(i).getName() .equals(test.getName()) && action.getReports().getTests().get(i).isPerformance()) { builder.add(action.getReports().getTests().get(i) .getPerformance().getMeasure(), "Performance", new NumberOnlyBuildLabel( abstractBuild)); } } } } } JFreeChart chart = ChartFactory.createLineChart3D( "Evolution of Performance", "Build", "Performance", builder .build(), PlotOrientation.VERTICAL, true, true, false); chart.setBackgroundPaint(Color.WHITE); CategoryPlot plot = chart.getCategoryPlot(); plot.setBackgroundPaint(Color.WHITE); plot.setOutlinePaint(null); plot.setForegroundAlpha(0.4f); plot.setRangeGridlinesVisible(true); plot.setRangeGridlinePaint(Color.black); CategoryAxis domainAxis = new ShiftedCategoryAxis(null); plot.setDomainAxis(domainAxis); domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90); domainAxis.setLowerMargin(0.0); domainAxis.setUpperMargin(0.0); domainAxis.setCategoryMargin(0.0); CategoryItemRenderer renderer = plot.getRenderer(); renderer.setSeriesPaint(0, ColorPalette.BLUE); NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); // crop extra space around the graph plot.setInsets(new RectangleInsets(0, 0, 0, 5.0)); return chart; } public void doExecutionTimeGraph(StaplerRequest request, StaplerResponse response) throws IOException { ChartUtil.generateGraph(request, response, createExecutionTimeGraph(), 800, 250); } private JFreeChart createExecutionTimeGraph() { DataSetBuilder<String, NumberOnlyBuildLabel> builder = new DataSetBuilder<String, NumberOnlyBuildLabel>(); for (Object build : _owner.getProject().getBuilds()) { AbstractBuild abstractBuild = (AbstractBuild) build; if (!abstractBuild.isBuilding() && abstractBuild.getResult().isBetterOrEqualTo( Result.SUCCESS)) { PerfPublisherBuildAction action = abstractBuild .getAction(PerfPublisherBuildAction.class); if (action!=null && action.getReport() != null) { for (int i = 0; i < action.getReports().getNumberOfTest(); i++) { if (action.getReports().getTests().get(i).getName() .equals(test.getName()) && action.getReports().getTests().get(i).isExecutionTime()) { builder.add(action.getReports().getTests().get(i) .getExecutionTime().getMeasure(), "Execution Time", new NumberOnlyBuildLabel( abstractBuild)); } } } } } JFreeChart chart = ChartFactory.createLineChart3D( "Evolution of Execution Time", "Build", "Execution time", builder .build(), PlotOrientation.VERTICAL, true, true, false); chart.setBackgroundPaint(Color.WHITE); CategoryPlot plot = chart.getCategoryPlot(); plot.setBackgroundPaint(Color.WHITE); plot.setOutlinePaint(null); plot.setForegroundAlpha(0.4f); plot.setRangeGridlinesVisible(true); plot.setRangeGridlinePaint(Color.black); CategoryAxis domainAxis = new ShiftedCategoryAxis(null); plot.setDomainAxis(domainAxis); domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90); domainAxis.setLowerMargin(0.0); domainAxis.setUpperMargin(0.0); domainAxis.setCategoryMargin(0.0); CategoryItemRenderer renderer = plot.getRenderer(); renderer.setSeriesPaint(0, ColorPalette.BLUE); NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); // crop extra space around the graph plot.setInsets(new RectangleInsets(0, 0, 0, 5.0)); return chart; } public void doCompileTimeGraph(StaplerRequest request, StaplerResponse response) throws IOException { ChartUtil.generateGraph(request, response, createCompileTimeGraph(), 800, 250); } private JFreeChart createCompileTimeGraph() { DataSetBuilder<String, NumberOnlyBuildLabel> builder = new DataSetBuilder<String, NumberOnlyBuildLabel>(); for (Object build : _owner.getProject().getBuilds()) { AbstractBuild abstractBuild = (AbstractBuild) build; if (!abstractBuild.isBuilding() && abstractBuild.getResult().isBetterOrEqualTo( Result.SUCCESS)) { PerfPublisherBuildAction action = abstractBuild .getAction(PerfPublisherBuildAction.class); if (action!=null && action.getReport() != null) { for (int i = 0; i < action.getReports().getNumberOfTest(); i++) { if (action.getReports().getTests().get(i).getName() .equals(test.getName()) && action.getReports().getTests().get(i).isCompileTime()) { builder.add(action.getReports().getTests().get(i) .getCompileTime().getMeasure(), "Compile Time", new NumberOnlyBuildLabel( abstractBuild)); } } } } } JFreeChart chart = ChartFactory.createLineChart3D( "Evolution of Compile Time", "Build", "Compile time", builder .build(), PlotOrientation.VERTICAL, true, true, false); chart.setBackgroundPaint(Color.WHITE); CategoryPlot plot = chart.getCategoryPlot(); plot.setBackgroundPaint(Color.WHITE); plot.setOutlinePaint(null); plot.setForegroundAlpha(0.4f); plot.setRangeGridlinesVisible(true); plot.setRangeGridlinePaint(Color.black); CategoryAxis domainAxis = new ShiftedCategoryAxis(null); plot.setDomainAxis(domainAxis); domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90); domainAxis.setLowerMargin(0.0); domainAxis.setUpperMargin(0.0); domainAxis.setCategoryMargin(0.0); CategoryItemRenderer renderer = plot.getRenderer(); renderer.setSeriesPaint(0, ColorPalette.BLUE); NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); // crop extra space around the graph plot.setInsets(new RectangleInsets(0, 0, 0, 5.0)); return chart; } }