package com.ibm.nmon.gui.chart.data; import java.util.List; import org.jfree.data.statistics.HistogramDataset; import org.jfree.data.statistics.HistogramType; import com.ibm.nmon.data.DataTuple; public final class DataTupleHistogramDataset extends HistogramDataset implements DataTupleDataset { private static final long serialVersionUID = -5932939796158641508L; private final List<DataTuple> tuples; private GraphData[] graphData; private final DatasetCallback callback = new DatasetCallback() { @Override public int getDataCount() { return DataTupleHistogramDataset.this.getSeriesCount(); } @Override public int getItemCount(int dataIdx) { return DataTupleHistogramDataset.this.getItemCount(dataIdx); } @Override public double getValue(int dataIdx, int itemIdx) { return DataTupleHistogramDataset.this.getYValue(dataIdx, itemIdx); } }; public DataTupleHistogramDataset() { super(); tuples = new java.util.ArrayList<DataTuple>(); } @Override public Number getY(int series, int item) { Number toReturn = super.getY(series, item); // default implementation uses a 0 to 1 scale; we want 0 to 100 if (getType() == HistogramType.RELATIVE_FREQUENCY) { return new Double((Double) toReturn * 100); } else { return toReturn; } } @Override @SuppressWarnings("rawtypes") public void associateTuple(Comparable rowKey, Comparable columnKey, DataTuple tuple) { int idx = indexOf(rowKey); if (idx != -1) { tuples.add(idx, tuple); graphData = null; } } @Override public DataTuple getTuple(int row, int column) { return tuples.get(row); } @Override public Iterable<DataTuple> getAllTuples() { return java.util.Collections.unmodifiableList(tuples); } @Override public double getAverage(int row) { calculateGraphData(); return graphData[row].average; } @Override public double getMinimum(int row) { calculateGraphData(); return graphData[row].minimum; } @Override public double getMaximum(int row) { calculateGraphData(); return graphData[row].maximum; } @Override public double getMedian(int row) { calculateGraphData(); return graphData[row].median; } @Override public double get95thPercentile(int row) { calculateGraphData(); return graphData[row].percentile95; } @Override public double get99thPercentile(int row) { calculateGraphData(); return graphData[row].percentile99; } @Override public double getStandardDeviation(int row) { calculateGraphData(); return graphData[row].standardDeviation; } @Override public double getSum(int row) { calculateGraphData(); return graphData[row].sum; } @Override public int getCount(int row) { calculateGraphData(); return graphData[row].count; } public boolean containsTuple(DataTuple tuple) { return tuples.contains(tuple); } public DataTupleHistogramDataset merge(DataTupleHistogramDataset other) { DataTupleHistogramDataset toReturn = new DataTupleHistogramDataset(); toReturn.tuples.addAll(this.tuples); toReturn.tuples.addAll(other.tuples); return toReturn; } private void calculateGraphData() { if (graphData != null) { return; } else { graphData = GraphData.calculate(callback); } } @Override public boolean equals(Object obj) { if (obj == null) { return false; } else if (obj.getClass() == this.getClass()) { return tuples.equals(((DataTupleHistogramDataset) obj).tuples); } else { return false; } } @Override public int hashCode() { return tuples.hashCode(); } }