package com.ibm.nmon.gui.time;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import com.ibm.nmon.gui.main.NMONVisualizerGui;
import com.ibm.nmon.interval.Interval;
import com.ibm.nmon.data.DataSet;
import com.ibm.nmon.data.DataSetListener;
/**
* Displays a list of start and end times for all DataSets in the UI.
*/
public final class SystemTimeTableModel extends AbstractTableModel implements DataSetListener {
private static final long serialVersionUID = -8130932048768878945L;
private final NMONVisualizerGui gui;
private Interval countInterval;
private List<Integer> counts;
public SystemTimeTableModel(NMONVisualizerGui gui) {
this.gui = gui;
countInterval = gui.getIntervalManager().getCurrentInterval();
updateCounts();
}
@Override
public int getColumnCount() {
return 4;
}
@Override
public Class<?> getColumnClass(int columnIndex) {
switch (columnIndex) {
case 0:
return String.class;
case 1:
return Long.class;
case 2:
return Long.class;
case 3:
return Integer.class;
default:
throw new ArrayIndexOutOfBoundsException(columnIndex);
}
}
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "System";
case 1:
return "Data Start";
case 2:
return "Data End";
case 3:
return "Record Count";
default:
throw new ArrayIndexOutOfBoundsException(column);
}
}
@Override
public int getRowCount() {
return gui.getDataSetCount();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
DataSet data = null;
int n = 0;
for (DataSet toSearch : gui.getDataSets()) {
if (n++ == rowIndex) {
data = toSearch;
break;
}
}
if (data == null) {
throw new ArrayIndexOutOfBoundsException(rowIndex);
}
switch (columnIndex) {
case 0:
return data.getHostname();
case 1:
return data.getStartTime();
case 2:
return data.getEndTime();
case 3: {
return counts.get(rowIndex);
}
default:
throw new ArrayIndexOutOfBoundsException(columnIndex);
}
}
public DataSet getValueAt(int rowIndex) {
int n = 0;
for (DataSet toSearch : gui.getDataSets()) {
if (n++ == rowIndex) {
return toSearch;
}
}
throw new ArrayIndexOutOfBoundsException(rowIndex);
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
public void dataAdded(DataSet data) {
updateCounts();
fireTableDataChanged();
}
public void dataRemoved(DataSet data) {
updateCounts();
fireTableDataChanged();
}
@Override
public void dataChanged(DataSet data) {
updateCounts();
fireTableDataChanged();
}
public void dataCleared() {
updateCounts();
fireTableDataChanged();
}
public Interval getCountInterval() {
return countInterval;
}
public void setCountInterval(Interval countInterval) {
if (!this.countInterval.equals(countInterval)) {
this.countInterval = countInterval;
updateCounts();
fireTableDataChanged();
}
}
// update dataset record counts when the interval changes
// these are not cached under the assumption that this is a fast operation and datasets are
// relatively small
private void updateCounts() {
counts = new java.util.ArrayList<Integer>(gui.getDataSetCount());
for (DataSet data : gui.getDataSets()) {
if (Interval.DEFAULT.equals(countInterval)) {
counts.add(data.getRecordCount());
}
else {
counts.add(data.getRecordCount(countInterval));
}
}
}
}