/*
* The MIT License
*
* Copyright (c) 2004-2010, Sun Microsystems, Inc., Tom Huybrechts, Yahoo!, Inc., Stellar Science Ltd Co, K. R. Walker
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package hudson.plugins.measurement_plots;
/**
* Measurement graph.
* @author krwalker
*/
public abstract class Graph extends hudson.util.Graph {
final String title;
protected Graph(String title, java.util.Calendar timestamp) {
super(timestamp, 600, 300);
this.title = title;
}
public String getUrlName() {
return "graph";
}
public String getImageUrlName() {
return "png";
}
public String getMapUrlName() {
return "map";
}
// GraphLabel is non-public, but exported through public API.
protected abstract hudson.util.DataSetBuilder<String, GraphLabel> getDataSetBuilder();
protected org.jfree.chart.JFreeChart createGraph() {
final org.jfree.data.category.CategoryDataset dataset = getDataSetBuilder().build();
final org.jfree.chart.JFreeChart chart = org.jfree.chart.ChartFactory.createStackedAreaChart(
title, // chart title
null, // unused
null, // range axis label
dataset, // data
org.jfree.chart.plot.PlotOrientation.VERTICAL, // orientation
false, // include legend
true, // tooltips
false // urls
);
chart.setBackgroundPaint(java.awt.Color.white);
final org.jfree.chart.plot.CategoryPlot plot = chart.getCategoryPlot();
// plot.setAxisOffset(new Spacer(Spacer.ABSOLUTE, 5.0, 5.0, 5.0, 5.0));
plot.setBackgroundPaint(java.awt.Color.WHITE);
plot.setOutlinePaint(null);
plot.setForegroundAlpha(0.8f);
// plot.setDomainGridlinesVisible(true);
// plot.setDomainGridlinePaint(Color.white);
plot.setRangeGridlinesVisible(true);
plot.setRangeGridlinePaint(java.awt.Color.black);
org.jfree.chart.axis.CategoryAxis domainAxis = new hudson.util.ShiftedCategoryAxis(null);
plot.setDomainAxis(domainAxis);
domainAxis.setCategoryLabelPositions(org.jfree.chart.axis.CategoryLabelPositions.UP_90);
domainAxis.setLowerMargin(0.0);
domainAxis.setUpperMargin(0.0);
domainAxis.setCategoryMargin(0.0);
final org.jfree.chart.axis.NumberAxis rangeAxis = (org.jfree.chart.axis.NumberAxis) plot.getRangeAxis();
hudson.util.ChartUtil.adjustChebyshev(dataset, rangeAxis);
rangeAxis.setStandardTickUnits(org.jfree.chart.axis.NumberAxis.createIntegerTickUnits());
rangeAxis.setAutoRange(true);
org.jfree.chart.renderer.category.StackedAreaRenderer areaRenderer = new hudson.util.StackedAreaRenderer2() {
@Override
public java.awt.Paint getItemPaint(int row, int column) {
GraphLabel key = (GraphLabel) dataset.getColumnKey(column);
if (key.getColor() != null) {
return key.getColor();
}
return super.getItemPaint(row, column);
}
@Override
public String generateURL(
org.jfree.data.category.CategoryDataset dataset,
int row, int column) {
GraphLabel label = (GraphLabel) dataset.getColumnKey(column);
return label.getUrl();
}
@Override
public String generateToolTip(
org.jfree.data.category.CategoryDataset dataset,
int row, int column) {
GraphLabel label = (GraphLabel) dataset.getColumnKey(column);
return label.getToolTip();
}
};
plot.setRenderer(areaRenderer);
areaRenderer.setSeriesPaint(2, hudson.util.ColorPalette.BLUE);
// crop extra space around the graph
plot.setInsets(new org.jfree.ui.RectangleInsets(0, 0, 0, 5.0));
return chart;
}
}
class GraphLabel implements Comparable<GraphLabel> {
private Measurement measurement;
String url;
public GraphLabel(Measurement measurement) {
this.measurement = measurement;
this.url = null;
}
private Measurement getMeasurement() {
return measurement;
}
public String getUrl() {
if (this.url == null) {
this.url = getMeasurement().getTestAction().getAbsoluteTestObjectUrl().toString();
}
return url;
}
public String getToolTip() {
return getMeasurement().getBuildName() + " : " +
getMeasurement().getValue();
}
public int compareTo(GraphLabel that) {
return this.getMeasurement().getBuildNumber() -
that.getMeasurement().getBuildNumber();
}
@Override
public boolean equals(Object object) {
if (!(object instanceof GraphLabel)) {
return false;
}
GraphLabel that = (GraphLabel) object;
return this.getMeasurement() == that.getMeasurement();
}
public java.awt.Color getColor() {
return hudson.util.ColorPalette.BLUE;
}
@Override
public int hashCode() {
return getMeasurement().hashCode();
}
@Override
public String toString() {
String buildName = getMeasurement().getBuildName();
String nodeName = getMeasurement().getNodeName();
if (nodeName != null) {
buildName += ' ' + nodeName;
}
return buildName;
}
}