/* * Copyright The National Archives 2005-2006. All rights reserved. * See Licence.txt for full licence details. * * Developed by: * Tessella Support Services plc * 3 Vineyard Chambers * Abingdon, OX14 3PX * United Kingdom * http://www.tessella.com * * Tessella/NPD/4305 * PRONOM 4 */ package uk.gov.nationalarchives.droid; import java.util.Enumeration; import java.util.HashSet; import java.util.Hashtable; /** * A data structure to store unique values indexed by a given key. * If an item added is found to duplicate an existing object, the * object is not added and no index is assigned. * * @author zeip */ public class IndexedHashSet<K, V> extends HashSet<V> { /* Pointers to values in HashSet */ private Hashtable<K, V> indexedTable; /** * Create with given capacity * * @param initialCapacity */ public IndexedHashSet(int initialCapacity) { super(initialCapacity); indexedTable = new Hashtable<K, V>(initialCapacity); } /** * Create with default size */ public IndexedHashSet() { super(); indexedTable = new Hashtable<K, V>(); } /** * Add object * * @param key the index to retrieve the object by * @param value the object to store * @return true if the set did not already contain o */ public synchronized boolean add(K key, V value) { if (super.add(value)) { // Object did not already exist indexedTable.put(key, value); return true; } else { // Object already existed // indexedTable.put(key, value); return false; } } /** * Remove an item from both tables by index * * @param index index of item to remove */ public void removeByIndex(K index) { if (indexedTable.containsKey(index)) { V item = indexedTable.get(index); super.remove(item); indexedTable.remove(index); } } public boolean containsKey(K index) { return indexedTable.containsKey(index); } /** * Clear all data */ public void clear() { indexedTable.clear(); super.clear(); } /** * Get object by original key * * @param key * @return */ public synchronized Object get(K key) { return indexedTable.get(key); } public Enumeration getIndexKeys() { return indexedTable.keys(); } }