package com.ibm.nmon.gui.chart;
import org.slf4j.Logger;
import java.util.List;
import org.jfree.chart.JFreeChart;
import com.ibm.nmon.NMONVisualizerApp;
import com.ibm.nmon.interval.Interval;
import com.ibm.nmon.analysis.AnalysisRecord;
import com.ibm.nmon.chart.definition.*;
import com.ibm.nmon.data.DataSet;
import com.ibm.nmon.gui.chart.builder.*;
/**
* Helper class for building {@link JFreeChart charts} from {@link BaseChartDefinition chart
* definitions}.
*/
public class ChartFactory {
private static final Logger LOGGER = org.slf4j.LoggerFactory.getLogger(ChartFactory.class);
private final NMONVisualizerApp app;
private final LineChartBuilder lineChartBuilder;
private final BarChartBuilder barChartBuilder;
private final IntervalChartBuilder intervalChartBuilder;
private final HistogramChartBuilder histogramChartBuilder;
public ChartFactory(NMONVisualizerApp app) {
this.app = app;
lineChartBuilder = new LineChartBuilder();
lineChartBuilder.addPlugin(new LineChartBuilderPlugin(app));
barChartBuilder = new BarChartBuilder();
intervalChartBuilder = new IntervalChartBuilder();
histogramChartBuilder = new HistogramChartBuilder();
}
public void setGranularity(int granularity) {
lineChartBuilder.setGranularity(granularity);
barChartBuilder.setGranularity(granularity);
intervalChartBuilder.setGranularity(granularity);
histogramChartBuilder.setGranularity(granularity);
}
public void setInterval(Interval interval) {
lineChartBuilder.setInterval(interval);
barChartBuilder.setInterval(interval);
intervalChartBuilder.setInterval(interval);
histogramChartBuilder.setInterval(interval);
}
public void addPlugin(ChartBuilderPlugin plugin) {
lineChartBuilder.addPlugin(plugin);
barChartBuilder.addPlugin(plugin);
intervalChartBuilder.addPlugin(plugin);
histogramChartBuilder.addPlugin(plugin);
}
/**
* Create a chart given a definition and some data.
*
* @param definition the chart to create
* @param dataSets the data to use for the chart
* @return the chart
* @see LineChartBuilder
* @see BarChartBuilder
* @see IntervalChartBuilder
* @see HistogramChartBuilder
*/
public JFreeChart createChart(BaseChartDefinition definition, Iterable<? extends DataSet> dataSets) {
long startT = System.nanoTime();
JFreeChart chart = null;
if (definition.getClass().equals(LineChartDefinition.class)) {
LineChartDefinition lineDefinition = (LineChartDefinition) definition;
lineChartBuilder.initChart(lineDefinition);
for (DataSet data : dataSets) {
lineChartBuilder.addLine(data);
}
chart = lineChartBuilder.getChart();
}
else if (definition.getClass().equals(IntervalChartDefinition.class)) {
IntervalChartDefinition lineDefinition = (IntervalChartDefinition) definition;
intervalChartBuilder.initChart(lineDefinition);
for (DataSet data : dataSets) {
// TODO AnalysisRecord cache needed here?
List<AnalysisRecord> analysis = new java.util.ArrayList<AnalysisRecord>();
for (Interval i : app.getIntervalManager().getIntervals()) {
AnalysisRecord record = new AnalysisRecord(data);
record.setInterval(i);
record.setGranularity(intervalChartBuilder.getGranularity());
analysis.add(record);
}
intervalChartBuilder.addLine(lineDefinition, analysis);
}
chart = intervalChartBuilder.getChart();
}
else if (definition.getClass().equals(BarChartDefinition.class)) {
BarChartDefinition barDefinition = (BarChartDefinition) definition;
barChartBuilder.initChart(barDefinition);
for (DataSet data : dataSets) {
AnalysisRecord record = app.getAnalysis(data);
// this check is really a hack for event interactions between the tree and the
// ReportPanel when removing data with selected charts
if (record != null) {
barChartBuilder.addBar(record);
}
}
chart = barChartBuilder.getChart();
}
else if (definition.getClass().equals(HistogramChartDefinition.class)) {
HistogramChartDefinition histogramDefinition = (HistogramChartDefinition) definition;
histogramChartBuilder.initChart(histogramDefinition);
for (DataSet data : dataSets) {
AnalysisRecord record = app.getAnalysis(data);
// this check is really a hack for event interactions between the tree and the
// ReportPanel when removing data with selected charts
if (record != null) {
histogramChartBuilder.addHistogram(record);
}
}
chart = histogramChartBuilder.getChart();
}
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("{}: {} chart created in {}ms",
new Object[] { dataSets, definition.getShortName(), (System.nanoTime() - startT) / 1000000.0d });
}
return chart;
}
}