All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jadex.tools.comanalyzer.chart.KeyedListsTable Maven / Gradle / Ivy

Go to download

The Jadex tools comanalyzer package contains the ComAnalyzer JCC plugin for observing the communication between Jadex components.

The newest version!
package jadex.tools.comanalyzer.chart;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.jfree.data.KeyedValues2D;
import org.jfree.data.UnknownKeyException;


/**
 * A data structure that stores lists, where each list is associated with two
 * keys (a 'row' key and a 'column' key).
 */
public class KeyedListsTable implements KeyedValues2D, Cloneable, Serializable//, PublicCloneable
{

	// -------- attributes --------

	/** The row keys. */
	private List rowKeys;

	/** The column keys. */
	private List columnKeys;

	/** The row data. comparable (rowkey) -> comparable (columnkey), list */
	private Map rows;

	/** If the row keys should be sorted by their comparable order. */
	private boolean sortRowKeys;

	// -------- constructors --------

	/**
	 * Creates a new table.
	 */
	public KeyedListsTable()
	{
		this(false);
	}

	/**
	 * Creates a new table.
	 * 
	 * @param sortRowKeys if the row keys should be sorted.
	 */
	public KeyedListsTable(boolean sortRowKeys)
	{
		this.rowKeys = new ArrayList();
		this.columnKeys = new ArrayList();
		this.rows = new HashMap();
		this.sortRowKeys = sortRowKeys;

	}

	// -------- KeyedListsTable methods --------

	/**
	 * Returns the List for the given row and column keys.
	 * 
	 * @param rowKey the row key (null not permitted).
	 * @param columnKey the column key (null not permitted).
	 * 
	 * @return The List (possibly null).
	 */
	public List getList(Comparable rowKey, Comparable columnKey)
	{
		if(rowKey == null)
		{
			throw new IllegalArgumentException("Null 'rowKey' argument.");
		}
		if(columnKey == null)
		{
			throw new IllegalArgumentException("Null 'columnKey' argument.");
		}

		// check that the column key is defined in the 2D structure
		if(!(this.columnKeys.contains(columnKey)))
		{
			throw new UnknownKeyException("Unrecognised columnKey: " + columnKey);
		}

		// check that the column key is defined in the 2D structure
		if(!(this.rowKeys.contains(rowKey)))
		{
			throw new UnknownKeyException("Unrecognised rowKey: " + rowKey);
		}

		List element = null;

		// the row may not have an entry for this key, in which case the
		// return value is null
		if(rows.containsKey(rowKey) && ((Map)rows.get(rowKey)).containsKey(columnKey))
		{
			element = (List)((Map)rows.get(rowKey)).get(columnKey);
		}
		return element;
	}

	/**
	 * Adds or updates a list.
	 * 
	 * @param list the list (null permitted).
	 * @param rowKey the row key (null not permitted).
	 * @param columnKey the column key (null not permitted).
	 */
	public void setList(List list, Comparable rowKey, Comparable columnKey)
	{

		if(!rowKeys.contains(rowKey))
		{
			rowKeys.add(rowKey);
		}
		if(!columnKeys.contains(columnKey))
		{
			columnKeys.add(columnKey);
		}
		if(!rows.containsKey(rowKey))
		{
			rows.put(rowKey, new HashMap());
		}

		((Map)rows.get(rowKey)).put(columnKey, list);

	}

	/**
	 * Adds a element to a list.
	 * 
	 * @param element the element to add (null permitted).
	 * @param rowKey the row key (null not permitted).
	 * @param columnKey the column key (null not permitted).
	 */
	public void addToList(Object element, Comparable rowKey, Comparable columnKey)
	{

		if(!rowKeys.contains(rowKey))
		{
			rowKeys.add(rowKey);
		}
		if(!columnKeys.contains(columnKey))
		{
			columnKeys.add(columnKey);
		}
		if(!rows.containsKey(rowKey))
		{
			rows.put(rowKey, new HashMap());
		}
		if(!((Map)rows.get(rowKey)).containsKey(columnKey))
		{
			List list = new ArrayList();
			list.add(element);
			((Map)rows.get(rowKey)).put(columnKey, list);
		}
		else
		{
			List list = (List)((Map)rows.get(rowKey)).get(columnKey);
			list.add(element);
		}
	}

	/**
	 * Removes a value from the table by setting it to null. If
	 * all the values in the specified row and/or column are now
	 * null, the row and/or column is removed from the table.
	 * 
	 * @param rowKey the row key (null not permitted).
	 * @param columnKey the column key (null not permitted).
	 */
	public void removeList(Comparable rowKey, Comparable columnKey)
	{
		if(rows.containsKey(rowKey))
		{
			((Map)rows.get(rowKey)).remove(columnKey);
		}

		// check whether the row is now empty.
		if(((Map)rows.get(rowKey)).isEmpty())
		{
			rowKeys.remove(rowKey);
			rows.remove(rowKey);
		}

		// check whether the column is now empty.
		boolean allNull = true;
		for(Iterator iter = rows.keySet().iterator(); iter.hasNext();)
		{
			Comparable key = (Comparable)iter.next();
			if(((Map)rows.get(key)).containsKey(columnKey))
			{
				allNull = false;
				break;
			}
		}
		if(allNull)
		{
			columnKeys.remove(columnKey);
		}

		// check if there are no rows at all
		if(rows.isEmpty())
		{
			columnKeys.clear();
		}
	}

	/**
	 * Removes an element from the table. If the list is empty, it is set to
	 * null. If all the values in the specified row and/or
	 * column are now null, the row and/or column is removed
	 * from the table.
	 * 
	 * @param rowKey the row key (null not permitted).
	 * @param columnKey the column key (null not permitted).
	 */
	public void removeFromList(Object element, Comparable rowKey, Comparable columnKey)
	{
		if(rows.containsKey(rowKey))
		{
			List list = (List)((Map)rows.get(rowKey)).get(columnKey);
			if(list != null)
			{
				list.remove(element);
				if(list.isEmpty())
				{
					removeList(rowKey, columnKey);
				}
			}
		}

	}

	/**
	 * Removes a row.
	 * 
	 * @param rowIndex the row index.
	 */
	public void removeRow(int rowIndex)
	{
		Comparable rowKey = getRowKey(rowIndex);
		removeRow(rowKey);
	}

	/**
	 * Removes a row. If all values of any column are null, the
	 * column(s) is/are removed.
	 * 
	 * @param rowKey the row key (null not permitted).
	 */
	public void removeRow(Comparable rowKey)
	{
		rowKeys.remove(rowKey);
		rows.remove(rowKey);

		// check whether any column is now empty.
		boolean allNull;
		Comparable cKey = null;
		for(Iterator iterRow = rows.keySet().iterator(); iterRow.hasNext();)
		{
			Comparable rKey = (Comparable)iterRow.next();
			allNull = true;
			for(Iterator iterCol = columnKeys.iterator(); iterCol.hasNext();)
			{
				cKey = (Comparable)iterCol.next();
				if(((Map)rows.get(rKey)).containsKey(cKey))
				{
					allNull = false;
					break;
				}
			}
			if(allNull)
			{
				columnKeys.remove(cKey);
			}
		}

		// clear columns if there is no row left
		if(rowKeys.isEmpty())
		{
			columnKeys.clear();
		}
	}

	/**
	 * Removes a column.
	 * 
	 * @param columnIndex the column index.
	 */
	public void removeColumn(int columnIndex)
	{
		Comparable columnKey = getColumnKey(columnIndex);
		removeColumn(columnKey);
	}

	/**
	 * Removes a column.
	 * 
	 * @param columnKey the column key (null not permitted).
	 */
	public void removeColumn(Comparable columnKey)
	{
		for(Iterator iter = rows.keySet().iterator(); iter.hasNext();)
		{
			Comparable rowKey = (Comparable)iter.next();
			((Map)rows.get(rowKey)).remove(columnKey);
			// check if row is empty
			if(((Map)rows.get(rowKey)).isEmpty())
			{
				rows.remove(rowKey);
				rowKeys.remove(rowKey);
			}

		}
		this.columnKeys.remove(columnKey);

	}

	/**
	 * Clears all the data and associated keys.
	 */
	public void clear()
	{
		this.rowKeys.clear();
		this.columnKeys.clear();
		this.rows.clear();
	}

	// -------- KeyedValues2D interface --------

	/**
	 * Returns the row count.
	 * 
	 * @return The row count.
	 */
	public int getRowCount()
	{
		return this.rowKeys.size();
	}

	/**
	 * Returns the column count.
	 * 
	 * @return The column count.
	 */
	public int getColumnCount()
	{
		return this.columnKeys.size();
	}

	/**
	 * Returns the value for a given row and column.
	 * 
	 * @param row the row index.
	 * @param column the column index.
	 * 
	 * @return The value.
	 */
	public Number getValue(int row, int column)
	{
		if(columnKeys.isEmpty() || rowKeys.isEmpty())
		{
			System.err.println(columnKeys + " " + rowKeys + " " + row + " " + column);
			return null;
		}

		Number result = null;
		Comparable columnKey = (Comparable)this.columnKeys.get(column);
		Comparable rowKey = (Comparable)this.rowKeys.get(row);

		// if (rowKey != null && columnKey != null ) {
		// the row may not have an entry for this key, in which case the
		// return value is null
		if(rows.containsKey(rowKey) && ((Map)rows.get(rowKey)).containsKey(columnKey))
		{
			result = Integer.valueOf(((Collection)((Map)rows.get(rowKey)).get(columnKey)).size());
		}
		// }
		return result;
	}

	/**
	 * Returns the value for the given row and column keys.
	 * 
	 * @param rowKey the row key (null not permitted).
	 * @param columnKey the column key (null not permitted).
	 * 
	 * @return The value (possibly null).
	 */
	public Number getValue(Comparable rowKey, Comparable columnKey)
	{
		if(rowKey == null)
		{
			throw new IllegalArgumentException("Null 'rowKey' argument.");
		}
		if(columnKey == null)
		{
			throw new IllegalArgumentException("Null 'columnKey' argument.");
		}

		// check that the column key is defined in the 2D structure
		if(!(this.columnKeys.contains(columnKey)))
		{
			throw new UnknownKeyException("Unrecognised columnKey: " + columnKey);
		}

		// check that the column key is defined in the 2D structure
		if(!(this.rowKeys.contains(rowKey)))
		{
			throw new UnknownKeyException("Unrecognised rowKey: " + rowKey);
		}

		Number result = null;
		// the row may not have an entry for this key, in which case the
		// return value is null
		if(rows.containsKey(rowKey) && ((Map)rows.get(rowKey)).containsKey(columnKey))
		{
			result = Integer.valueOf(((Collection)((Map)rows.get(rowKey)).get(columnKey)).size());
		}
		return result;
	}

	/**
	 * Returns the key for a given row.
	 * 
	 * @param row the row index (in the range 0 to {@link #getRowCount()} - 1).
	 * 
	 * @return The row key.
	 */
	public Comparable getRowKey(int row)
	{
		return (Comparable)this.rowKeys.get(row);
	}

	/**
	 * Returns the row index for a given key.
	 * 
	 * @param key the key (null not permitted).
	 * 
	 * @return The row index.
	 */
	public int getRowIndex(Comparable key)
	{
		if(key == null)
		{
			throw new IllegalArgumentException("Null 'key' argument.");
		}
		if(this.sortRowKeys)
		{
			return Collections.binarySearch(this.rowKeys, key);
		}
		else
		{
			return this.rowKeys.indexOf(key);
		}
	}

	/**
	 * Returns the row keys in an unmodifiable list.
	 * 
	 * @return The row keys.
	 */
	public List getRowKeys()
	{
		return Collections.unmodifiableList(this.rowKeys);
	}

	/**
	 * Returns the key for a given column.
	 * 
	 * @param column the column (in the range 0 to {@link #getColumnCount()} -
	 * 1).
	 * 
	 * @return The key.
	 */
	public Comparable getColumnKey(int column)
	{
		return (Comparable)this.columnKeys.get(column);
	}

	/**
	 * Returns the column index for a given key.
	 * 
	 * @param key the key (null not permitted).
	 * 
	 * @return The column index.
	 */
	public int getColumnIndex(Comparable key)
	{
		if(key == null)
		{
			throw new IllegalArgumentException("Null 'key' argument.");
		}
		return this.columnKeys.indexOf(key);
	}

	/**
	 * Returns the column keys in an unmodifiable list.
	 * 
	 * @return The column keys.
	 */
	public List getColumnKeys()
	{
		return Collections.unmodifiableList(this.columnKeys);
	}

	// -------- PublicCloneable interface --------

	/**
	 * Returns a clone.
	 * 
	 * @return A clone.
	 * /
	public Object clone() throws CloneNotSupportedException
	{
		KeyedListsTable clone = (KeyedListsTable) super.clone();
		// for the keys, a shallow copy should be fine because keys
		// should be immutable...
		clone.columnKeys = new java.util.ArrayList(this.columnKeys);
		clone.rowKeys = new java.util.ArrayList(this.rowKeys);

		// but the row data requires a deep copy
		clone.rows = (Map)ObjectUtilities.deepClone((Collection)this.rows);
		return clone;
	}*/
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy