package com.ibm.nmon.gui.analysis;
import java.util.BitSet;
import java.util.List;
import com.ibm.nmon.analysis.AnalysisSet;
import com.ibm.nmon.analysis.Statistic;
import com.ibm.nmon.data.DataSet;
import com.ibm.nmon.gui.main.NMONVisualizerGui;
/**
* Table model that displays a selectable metric for each measurement in an AnalysisSet. Data for
* all data sets is displayed; each data set is a separate column.
*/
public final class ByDataSetTableModel extends AnalysisSetTableModel {
private static final long serialVersionUID = 8726311839297203648L;
private Statistic stat;
private final List<String> columns;
public ByDataSetTableModel(NMONVisualizerGui gui, AnalysisSet analysisSet) {
super(gui, analysisSet);
columns = new java.util.ArrayList<String>(2 + gui.getDataSetCount());
rebuildColumns();
buildColumnNameMap();
stat = Statistic.AVERAGE;
// alert the owning table that it has columns so it can be sized in the column model
fireTableStructureChanged();
}
@Override
public String[] getAllColumns() {
return columns.toArray(new String[columns.size()]);
}
@Override
public boolean getDefaultColumnState(int column) {
return true;
}
@Override
public boolean canDisableColumn(int column) {
if (column < 2) {
return false;
}
else {
return true;
}
}
@Override
protected Class<?> getEnabledColumnClass(int columnIndex) {
if (columnIndex < 2) {
return String.class;
}
else {
if (Statistic.COUNT == stat) {
return Integer.class;
}
else {
return Double.class;
}
}
}
@Override
protected String getEnabledColumnName(int column) {
return columns.get(column);
}
@Override
protected Object getEnabledValueAt(int rowIndex, int columnIndex) {
String key = keys.get(rowIndex);
if (key == null) {
throw new ArrayIndexOutOfBoundsException(rowIndex);
}
if (columnIndex == 0) {
return analysisSet.getType(key);
}
else if (columnIndex == 1) {
return analysisSet.getField(key);
}
else {
int n = 2;
DataSet data = null;
for (DataSet toTest : gui.getDataSets()) {
if (n++ == columnIndex) {
data = toTest;
break;
}
}
if (data == null) {
throw new ArrayIndexOutOfBoundsException(columnIndex);
}
return stat.getValue(gui.getAnalysis(data), analysisSet.getType(key), analysisSet.getField(key));
}
}
public void setStatistic(Statistic stat) {
this.stat = stat;
fireTableDataChanged();
}
@Override
public void dataAdded(DataSet data) {
// adding columns => structure change
rebuildColumns();
}
@Override
public void dataRemoved(DataSet data) {
rebuildColumns();
}
@Override
public void dataCleared() {
super.dataCleared();
rebuildColumns();
}
private void rebuildColumns() {
columns.clear();
columns.add("Data Type");
columns.add("Metric");
for (DataSet data : gui.getDataSets()) {
columns.add(data.getHostname());
}
BitSet oldEnabled = enabledColumns;
enabledColumns = new BitSet(columns.size());
if (oldEnabled != null) {
int stop = Math.min(oldEnabled.length(), columns.size());
for (int i = 0; i < stop; i++) {
enabledColumns.set(i, oldEnabled.get(i));
}
// show just added data, if any
enabledColumns.set(columns.size() - 1, true);
}
else {
// null => just created, show everything
enabledColumns.set(0, columns.size(), true);
}
buildColumnNameMap();
fireTableStructureChanged();
}
}