/*
* Copyright (C) 2008 Digital Sundhed (SDSD)
*
* All source code and information supplied as part of chronos
* is copyright to its contributers.
*
* The source code has been released under a dual license - meaning you can
* use either licensed version of the library with your code.
*
* It is released under the Common Public License 1.0, a copy of which can
* be found at the link below.
* http://www.opensource.org/licenses/cpl.php
*
* It is released under the LGPL (GNU Lesser General Public License), either
* version 2.1 of the License, or (at your option) any later version. A copy
* of which can be found at the link below.
* http://www.gnu.org/copyleft/lesser.html
*/
package org.codehaus.mojo.chronos.chart;
import java.awt.Color;
import java.text.SimpleDateFormat;
import java.util.ResourceBundle;
import org.codehaus.mojo.chronos.ReportConfig;
import org.codehaus.mojo.chronos.responsetime.ResponsetimeSamples;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.AxisLocation;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.plot.CombinedDomainXYPlot;
import org.jfree.chart.plot.SeriesRenderingOrder;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.time.Millisecond;
import org.jfree.data.time.MovingAverage;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
/**
* This class is responsible for generating throughput charts.
*
* @author ksr@lakeside.dk
*/
public final class SummaryThroughputChartSource implements ChartSource {
private ResponsetimeSamples samples;
public SummaryThroughputChartSource(ResponsetimeSamples samples) {
this.samples = samples;
}
public boolean isEnabled(ResourceBundle bundle, ReportConfig config) {
return config.isShowthroughput() && config.isShowsummary();
}
public String getFileName(ResourceBundle bundle, ReportConfig config) {
return "throughput-" + config.getId();
}
public JFreeChart getChart(ResourceBundle bundle, ReportConfig config) {
XYPlot throughputPlot = createThroughputPlot(bundle, config);
XYPlot threadCountPlot = createThreadCountPlot(bundle, config);
String label = bundle.getString("chronos.label.throughput.time");
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
DateAxis timeAxis = ChartUtil.createTimeAxis(label, dateFormat);
CombinedDomainXYPlot combineddomainxyplot = ChartUtil.createCombinedPlot(timeAxis, throughputPlot,
threadCountPlot);
return new JFreeChart(bundle.getString("chronos.label.throughput"), combineddomainxyplot);
}
private XYPlot createThroughputPlot(ResourceBundle bundle, ReportConfig config) {
TimeSeriesCollection dataset1 = createThroughputDataset(bundle, config);
XYPlot throughputPlot = ChartUtil
.newPlot(dataset1, bundle.getString("chronos.label.throughput.requests"), true);
throughputPlot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_LEFT);
throughputPlot.getRenderer().setSeriesPaint(0, Color.GREEN);
throughputPlot.getRenderer().setSeriesPaint(1, Color.BLUE);
throughputPlot.setSeriesRenderingOrder(SeriesRenderingOrder.FORWARD);
double maxAvgThroughput = samples.getMaxAverageThroughput(config.getAverageduration(),
config.getResponsetimedivider());
String maxThroughputLabel = bundle.getString("chronos.label.maxaveragethroughput");
ChartUtil.addRangeMarker(throughputPlot, maxThroughputLabel, maxAvgThroughput);
return throughputPlot;
}
private TimeSeriesCollection createThroughputDataset(ResourceBundle bundle, ReportConfig config) {
TimeSeriesCollection dataset = new TimeSeriesCollection();
TimeSeries series = samples.createMovingThroughput(bundle.getString("chronos.label.throughput"),
config.getResponsetimedivider());
dataset.addSeries(series);
int avgDuration = config.getAverageduration();
String label = bundle.getString("chronos.label.average");
TimeSeries averageseries = MovingAverage.createMovingAverage(series, label, avgDuration, 0);
dataset.addSeries(averageseries);
return dataset;
}
private XYPlot createThreadCountPlot(ResourceBundle bundle, ReportConfig config) {
TimeSeriesCollection dataset2 = createThreadCountdataset(bundle, config);
String label = bundle.getString("chronos.label.threadcount.y");
XYPlot threadCountPlot = ChartUtil.newPlot(dataset2, label, false);
threadCountPlot.setRangeAxisLocation(AxisLocation.TOP_OR_LEFT);
threadCountPlot.getRenderer().setSeriesPaint(0, Color.GRAY);
return threadCountPlot;
}
private TimeSeriesCollection createThreadCountdataset(ResourceBundle bundle, ReportConfig config) {
String label = bundle.getString("chronos.label.threadcount");
TimeSeries series = new TimeSeries(label, Millisecond.class);
samples.appendThreadCounts(series, config.getThreadcountduration());
TimeSeriesCollection dataset = new TimeSeriesCollection();
dataset.addSeries(series);
return dataset;
}
}