/** *######################################################################### * * A component of the Gatherer application, part of the Greenstone digital * library suite from the New Zealand Digital Library Project at the * University of Waikato, New Zealand. * * Author: John Thompson, Greenstone Digital Library, University of Waikato * * Copyright (C) 1999 New Zealand Digital Library Project * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *######################################################################## */ package org.greenstone.gatherer.util; /************************************************************************************** * Written: 20/08/02 * Revised: **************************************************************************************/ import java.util.HashMap; import java.util.Iterator; /** Provides a HashMap implementation that indexes by two keys. Perfect for the storage of metadata references based on their metadata element and assigned value. * @author John Thompson, Greenstone Digital Library, University of Waikato * @version 2.3 */ public class HashMap3D extends HashMap { private int capacity = 4; private int size = 0; private Object last_key_one = null; private Object last_key_two = null; private Object last_value = null; /** Default constructor. */ public HashMap3D() { super(); } /** Constructor with a specific initial capacity. * @param capacity The initial capacity as an int. */ public HashMap3D(int capacity) { super(capacity); this.capacity = capacity; } /** Completely remove the contents of this HashMap and its child HashMaps. */ public void clear() { size = 0; Iterator iterator = values().iterator(); while(iterator.hasNext()) { HashMap inner_mapping = (HashMap) iterator.next(); inner_mapping.clear(); inner_mapping = null; } iterator = null; super.clear(); } /** Determine if this hash map contains an entry for the given keys. Also cache this entry because theres a good chance the next get call will ask for this entry. * @param key_one The first key as an Object. * @param key_two The second key as an Object. * @return true if such an entry exists, false otherwise. */ public boolean contains(Object key_one, Object key_two) { boolean result = false; // Retrieve the hash mapping at key_one. HashMap map = (HashMap) get(key_one); // If there is such a map then retrieve the value at key_two. if(map != null) { last_value = map.get(key_two); if(last_value != null) { last_key_one = key_one; last_key_two = key_two; result = true; } } return result; } /** Retrieve an entry from this three dimensional hash mapping. * @param key_one The first key as an Object. * @param key_two The second key as an Object. * @return The value Object located at (key_one, key_two), or null if no such value. */ public Object get(Object key_one, Object key_two) { Object result = null; if(key_one.equals(last_key_one) && key_two.equals(last_key_two)) { result = last_value; } else { // Retrieve the hash mapping at key_one. HashMap map = (HashMap) get(key_one); // If there is such a map then retrieve the value at key_two. if(map != null) { result = map.get(key_two); if(result != null) { last_key_one = key_one; last_key_two = key_two; last_value = result; } } } return result; } /** Put an entry into this three dimensional hash mapping. * @param key_one The first key, to store this value under, as an Object. * @param key_two The second key, to store this value under, as an Object. * @param value The value Object itself. */ public void put(Object key_one, Object key_two, Object value) { // Retrieve the hash mapping at key_one, or if none exists create one. HashMap map = (HashMap) get(key_one); if(map == null) { map = new HashMap(capacity); put(key_one, map); } // Now add the value to this mapping. map.put(key_two, value); size++; } }