/*
*-------------------
* The StackedChart.java is part of ASH Viewer
*-------------------
*
* ASH Viewer is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* ASH Viewer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ASH Viewer. If not, see <http://www.gnu.org/licenses/>.
*
* Copyright (c) 2009, Alex Kardapolov, All rights reserved.
*
*/
package org.ash.gui;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.ash.database.ASHDatabase;
import org.ash.util.Options;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.block.BlockBorder;
import org.jfree.chart.block.BlockContainer;
import org.jfree.chart.block.BorderArrangement;
import org.jfree.chart.labels.StandardXYToolTipGenerator;
import org.jfree.chart.plot.Marker;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.ValueMarker;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StackedXYAreaRenderer3;
import org.jfree.chart.title.LegendTitle;
import org.jfree.data.xy.CategoryTableXYDataset;
import org.jfree.ui.HorizontalAlignment;
import org.jfree.ui.LengthAdjustmentType;
import org.jfree.ui.RectangleAnchor;
import org.jfree.ui.RectangleEdge;
import org.jfree.ui.TextAnchor;
import com.sleepycat.je.DatabaseException;
/**
* The Class StackedXYAreaChart.
*
*/
public class StackedChart {
/** The database. */
private ASHDatabase database;
/** The dataset. */
private CategoryTableXYDataset dataset;
/** The chart. */
private JFreeChart chart;
/** The chart panel. */
private ChartPanel chartPanel;
/** The date format. */
private DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
/** The current date. */
private Date currentDate;
/** The x axis. */
private DateAxis xAxis;
/** The threshold max cpu. */
private ValueMarker thresholdMaxCpu;
/** The max cpu. */
private double maxCpu;
/** The plot. */
private XYPlot plot;
/** The current end. */
private Marker currentEnd;
/** The flag threshold begin time auto selection. */
private boolean flagThresholdBeginTimeAutoSelection = false;
/**
* Instantiates a new stacked xy area chart.
*
* @param database0 the database0
*/
public StackedChart(ASHDatabase database0) {
this.database = database0;
}
/**
* Creates the chart panel.
*
* @return the chart panel
*
* @throws DatabaseException the database exception
*/
public ChartPanel createChartPanel() throws DatabaseException {
createDataset();
JFreeChart chart = createChart();
chartPanel = new ChartPanel(chart);
chartPanel.setRangeZoomable(false);
return chartPanel;
}
/**
* Update xaxis label.
*
* @param time the time
*/
public void updatexAxisLabel(double time){
if (!xAxis.getLabel().equalsIgnoreCase(dateFormat.format(time))){
xAxis.setLabel(dateFormat.format(time));
}
}
/**
* Sets the threshold max cpu.
*
* @param maxCpu the new threshold max cpu
*/
public void setThresholdMaxCpu(double maxCpu){
this.maxCpu = maxCpu;
}
/**
* Sets the flag threshold begin time auto selection.
*
* @param flag0 the new flag threshold begin time auto selection
*/
public void setFlagThresholdBeginTimeAutoSelection(boolean flag0){
this.flagThresholdBeginTimeAutoSelection = flag0;
}
/**
* Checks if is flag threshold begin time auto selection.
*
* @return true, if is flag threshold begin time auto selection
*/
public boolean isFlagThresholdBeginTimeAutoSelection(){
return this.flagThresholdBeginTimeAutoSelection;
}
/**
* Sets the threshold begin time auto selection.
*
* @param beginTime the begin time
* @param range the range
*/
public synchronized void setThresholdBeginTimeAutoSelection(double beginTime, int range){
plot.removeDomainMarker(currentEnd);
currentEnd = new ValueMarker(beginTime);
currentEnd.setPaint(Color.red);
currentEnd.setLabel(range+" min");
currentEnd.setStroke(new BasicStroke(1.0f));
currentEnd.setLabelAnchor(RectangleAnchor.TOP_RIGHT);
currentEnd.setLabelTextAnchor(TextAnchor.TOP_LEFT);
plot.addDomainMarker(currentEnd);
}
/**
* Removes the threshold begin time auto selection.
*/
public void removeThresholdBeginTimeAutoSelection(){
plot.removeDomainMarker(currentEnd);
}
/**
* Adds the listener chart panel.
*
* @param l the l
*/
public void addListenerChartPanel(Object l){
chartPanel.addListenerReleaseMouse(l);
}
/**
* Removes the listener chart panel.
*
* @param l the l
*/
public void removeListenerChartPanel(Object l){
chartPanel.removeListenerReleaseMouse(l);
}
/**
* Sets the selection chart.
*
* @param flag the new selection chart
*/
public void setSelectionChart(boolean flag){
chartPanel.setDomainZoomable(flag);
}
/**
* Checks if is mouse dragged.
*
* @return true, if is mouse dragged
*/
public boolean isMouseDragged(){
return chartPanel.isMouseDragged();
}
/**
*
*/
public void setMinimalistic(boolean flag){
if (flag){
xAxis.setVisible(false);
chart.setTitle("");
plot.getRangeAxis().setVisible(false);
} else {
xAxis.setVisible(true);
chart.setTitle("Top activity");
plot.getRangeAxis().setVisible(true);
}
}
/**
* Set upper bound of range axis
*
* @param bound
*/
public void setUpperBoundOfRangeAxis(double bound){
if (bound == 0.0){
plot.getRangeAxis().setAutoRange(true);
}
else {
plot.getRangeAxis().setAutoRange(false);
plot.getRangeAxis().setUpperBound(bound*this.maxCpu);
}
}
/**
* Creates the chart.
*
* @return the j free chart
*/
private JFreeChart createChart() {
xAxis = new DateAxis("time");
xAxis.setDateFormatOverride(new SimpleDateFormat("HH:mm"));
currentDate = new Date();
updatexAxisLabel(new Long(currentDate.getTime()).doubleValue());
chart = ChartFactory.createStackedXYAreaChart(
"Top activity", // chart title
"X Value", // domain axis label
"Active Sessions", // range axis label
dataset, // data
PlotOrientation.VERTICAL, // the plot orientation
xAxis,
false, // legend
true, // tooltips
false // urls
);
plot = (XYPlot) chart.getPlot();
StackedXYAreaRenderer3 renderer = new StackedXYAreaRenderer3();
renderer.setRoundXCoordinates(true);
renderer.setBaseToolTipGenerator(new StandardXYToolTipGenerator
("{0} ({1}, {2})",
new SimpleDateFormat("HH:mm"),
new DecimalFormat("0.0")));
plot.setRenderer(0, renderer);
plot.getRangeAxis().setLowerBound(0.0);
plot.getRangeAxis().setAutoRange(true);
// add a labelled marker for the cpu_count
thresholdMaxCpu = new ValueMarker(this.maxCpu);
thresholdMaxCpu.setLabelOffsetType(LengthAdjustmentType.EXPAND);
thresholdMaxCpu.setPaint(Color.red);
thresholdMaxCpu.setStroke(new BasicStroke(1.0f));
thresholdMaxCpu.setLabel("Maximum CPU");
thresholdMaxCpu.setLabelFont(new Font("SansSerif", Font.PLAIN, 11));
thresholdMaxCpu.setLabelPaint(Color.red);
thresholdMaxCpu.setLabelAnchor(RectangleAnchor.TOP_LEFT);
thresholdMaxCpu.setLabelTextAnchor(TextAnchor.BOTTOM_LEFT);
plot.addRangeMarker(thresholdMaxCpu);
renderer.setSeriesPaint(0, Options.getInstance().getColor(
Options.getInstance().getResource("cpuLabel.text")),true);
renderer.setSeriesPaint(1, Options.getInstance().getColor(
Options.getInstance().getResource("schedulerLabel.text")), true);
renderer.setSeriesPaint(2,Options.getInstance().getColor(
Options.getInstance().getResource("userIOLabel.text")), true);
renderer.setSeriesPaint(3, Options.getInstance().getColor(
Options.getInstance().getResource("systemIOLabel.text")), true);
renderer.setSeriesPaint(4, Options.getInstance().getColor(
Options.getInstance().getResource("concurrencyLabel.text")), true);
renderer.setSeriesPaint(5, Options.getInstance().getColor(
Options.getInstance().getResource("applicationsLabel.text")), true);
renderer.setSeriesPaint(6, Options.getInstance().getColor(
Options.getInstance().getResource("commitLabel.text")), true);
renderer.setSeriesPaint(7, Options.getInstance().getColor(
Options.getInstance().getResource("configurationLabel.text")), true);
renderer.setSeriesPaint(8, Options.getInstance().getColor(
Options.getInstance().getResource("administrativeLabel.text")), true);
renderer.setSeriesPaint(9, Options.getInstance().getColor(
Options.getInstance().getResource("networkLabel.text")), true);
renderer.setSeriesPaint(11, Options.getInstance().getColor(
Options.getInstance().getResource("queueningLabel.text")), true);//que
renderer.setSeriesPaint(10, Options.getInstance().getColor(
Options.getInstance().getResource("clusterLabel.text")), true);//cluster
renderer.setSeriesPaint(12, Options.getInstance().getColor(
Options.getInstance().getResource("otherLabel.text")), true);
// Set format for x axis
DateAxis axis = (DateAxis) plot.getDomainAxis();
axis.setDateFormatOverride(new SimpleDateFormat("HH:mm"));
// Add legend to right
LegendTitle legend = new LegendTitle(chart.getPlot());
BlockContainer wrapper = new BlockContainer(new BorderArrangement());
wrapper.setFrame(new BlockBorder(1.0, 1.0, 1.0, 1.0));
BlockContainer itemss = legend.getItemContainer();
itemss.setPadding(2, 10, 5, 2);
wrapper.add(itemss);
legend.setWrapper(wrapper);
legend.setPosition(RectangleEdge.RIGHT);
legend.setHorizontalAlignment(HorizontalAlignment.LEFT);
chart.addSubtitle(legend);
return chart;
}
/**
* Creates the dataset.
*
* @throws DatabaseException the database exception
*/
private void createDataset() throws DatabaseException {
dataset = new CategoryTableXYDataset();
this.database.loadDataToChartPanelDataSet(dataset);
}
}