AbstractSyntheticObservationTableModel.java

package org.aavso.tools.vstar.ui.model.list;

import java.util.List;
import java.util.WeakHashMap;

import javax.swing.table.AbstractTableModel;

import org.aavso.tools.vstar.data.ValidObservation;

/**
 * This class is a base table model for synthetic observation data (e.g. mean,
 * model, residual).
 */
@SuppressWarnings("serial")
public abstract class AbstractSyntheticObservationTableModel extends
		AbstractTableModel {

	protected List<ValidObservation> obs;

	/**
	 * A weak reference hash map from observations to row indices. We only want
	 * this map's entries to exist if they (ValidObservation instances in
	 * particular) are in use elsewhere.
	 */
	protected final WeakHashMap<ValidObservation, Integer> observationToRowIndexMap;

	/**
	 * Constructor
	 * 
	 * @param obs
	 *            The initial observation data. The data can be updated later
	 *            by subclasses.
	 */
	public AbstractSyntheticObservationTableModel(List<ValidObservation> obs) {
		super();
		this.obs = obs;
		this.observationToRowIndexMap = new WeakHashMap<ValidObservation, Integer>();
		populateObsToRowMap();
	}

	/**
	 * Returns the row index (0..n-1) given an observation.
	 * 
	 * @param ob
	 *            a valid observation whose row index we want.
	 * @return The observation's row index.
	 */
	public Integer getRowIndexFromObservation(ValidObservation ob) {
		return observationToRowIndexMap.get(ob);
	}

	/**
	 * This method returns the underlying data for this table model.
	 * 
	 * @return the obs
	 */
	public List<ValidObservation> getObs() {
		return obs;
	}

	/**
	 * @see javax.swing.table.TableModel#getColumnCount()
	 */
	public abstract int getColumnCount();

	/**
	 * @see javax.swing.table.TableModel#getRowCount()
	 */
	public abstract int getRowCount();

	/**
	 * @see javax.swing.table.AbstractTableModel#getColumnName(int)
	 */
	public abstract String getColumnName(int column);

	/**
	 * @see javax.swing.table.TableModel#getValueAt(int, int)
	 */
	public abstract Object getValueAt(int rowIndex, int columnIndex);

	/**
	 * @see javax.swing.table.AbstractTableModel#getColumnClass(int)
	 */
	public abstract Class<?> getColumnClass(int columnIndex);

	protected void populateObsToRowMap() {
		this.observationToRowIndexMap.clear();

		for (int i = 0; i < obs.size(); i++) {
			this.observationToRowIndexMap.put(obs.get(i), i);
		}
	}

}