From 30681261f39988bb5fa28ded714bf52c21a60731 Mon Sep 17 00:00:00 2001 From: Jason van Zyl Date: Mon, 16 Apr 2001 22:42:04 +0000 Subject: [PATCH] - adding some utilities from struts into the collections packages along with some (admittedly weak for now) tests. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/commons/proper/collections/trunk@130442 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/collections/FastArrayList.java | 749 ++++++++++++++++++ .../commons/collections/FastHashMap.java | 422 ++++++++++ .../commons/collections/FastTreeMap.java | 532 +++++++++++++ .../apache/commons/collections/TestAll.java | 11 +- .../collections/TestFastArrayList.java | 120 +++ .../commons/collections/TestFastHashMap.java | 110 +++ .../commons/collections/TestFastTreeMap.java | 110 +++ 7 files changed, 2050 insertions(+), 4 deletions(-) create mode 100644 src/java/org/apache/commons/collections/FastArrayList.java create mode 100644 src/java/org/apache/commons/collections/FastHashMap.java create mode 100644 src/java/org/apache/commons/collections/FastTreeMap.java create mode 100644 src/test/org/apache/commons/collections/TestFastArrayList.java create mode 100644 src/test/org/apache/commons/collections/TestFastHashMap.java create mode 100644 src/test/org/apache/commons/collections/TestFastTreeMap.java diff --git a/src/java/org/apache/commons/collections/FastArrayList.java b/src/java/org/apache/commons/collections/FastArrayList.java new file mode 100644 index 000000000..82ed2abc6 --- /dev/null +++ b/src/java/org/apache/commons/collections/FastArrayList.java @@ -0,0 +1,749 @@ +/* + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/java/org/apache/commons/collections/FastArrayList.java,v 1.1 2001/04/16 22:42:04 jvanzyl Exp $ + * $Revision: 1.1 $ + * $Date: 2001/04/16 22:42:04 $ + * + * ==================================================================== + * + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999-2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Commons", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + * + */ + + +package org.apache.commons.collections; + + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; + + +/** + *

A customized implementation of java.util.ArrayList designed + * to operate in a multithreaded environment where the large majority of + * method calls are read-only, instead of structural changes. When operating + * in "fast" mode, read calls are non-synchronized and write calls perform the + * following steps:

+ * + *

When first created, objects of this class default to "slow" mode, where + * all accesses of any type are synchronized but no cloning takes place. This + * is appropriate for initially populating the collection, followed by a switch + * to "fast" mode (by calling setFast(true)) after initialization + * is complete.

+ * + *

NOTE: If you are creating and accessing an + * ArrayList only within a single thread, you should use + * java.util.ArrayList directly (with no synchronization), for + * maximum performance.

+ * + *

NOTE: The following methods are NOT + * overridden: clone(), equals(Object), hashCode().

+ * + * @author Craig R. McClanahan + * @version $Revision: 1.1 $ $Date: 2001/04/16 22:42:04 $ + */ + +public class FastArrayList implements List, Cloneable, Serializable { + + + // ----------------------------------------------------------- Constructors + + + /** + * Construct a an empty list. + */ + public FastArrayList() { + + super(); + this.list = new ArrayList(); + + } + + + /** + * Construct an empty list with the specified capacity. + * + * @param capacity The initial capacity of the empty list + */ + public FastArrayList(int capacity) { + + super(); + this.list = new ArrayList(capacity); + + } + + + /** + * Construct a list containing the elements of the specified collection, + * in the order they are returned by the collection's iterator. + * + * @param collection The collection whose elements initialize the contents + * of this list + */ + public FastArrayList(Collection collection) { + + super(); + this.list = new ArrayList(collection); + + } + + + // ----------------------------------------------------- Instance Variables + + + /** + * The underlying list we are managing. + */ + protected ArrayList list = null; + + + // ------------------------------------------------------------- Properties + + + /** + * Are we operating in "fast" mode? + */ + protected boolean fast = false; + + public boolean getFast() { + return (this.fast); + } + + public void setFast(boolean fast) { + this.fast = fast; + } + + + // --------------------------------------------------------- Public Methods + + + /** + * Appends the specified element to the end of this list. + * + * @param element The element to be appended + */ + public boolean add(Object element) { + + if (fast) { + synchronized (this) { + ArrayList temp = (ArrayList) list.clone(); + boolean result = temp.add(element); + list = temp; + return (result); + } + } else { + synchronized (list) { + return (list.add(element)); + } + } + + } + + + /** + * Insert the specified element at the specified position in this list, + * and shift all remaining elements up one position. + * + * @param index Index at which to insert this element + * @param element The element to be inserted + * + * @exception IndexOutOfBoundsException if the index is out of range + */ + public void add(int index, Object element) { + + if (fast) { + synchronized (this) { + ArrayList temp = (ArrayList) list.clone(); + temp.add(index, element); + list = temp; + } + } else { + synchronized (list) { + list.add(index, element); + } + } + + } + + + /** + * Append all of the elements in the specified Collection to the end + * of this list, in the order that they are returned by the specified + * Collection's Iterator. + * + * @param collection The collection to be appended + */ + public boolean addAll(Collection collection) { + + if (fast) { + synchronized (this) { + ArrayList temp = (ArrayList) list.clone(); + boolean result = temp.addAll(collection); + list = temp; + return (result); + } + } else { + synchronized (list) { + return (list.addAll(collection)); + } + } + + } + + + /** + * Insert all of the elements in the specified Collection at the specified + * position in this list, and shift any previous elements upwards as + * needed. + * + * @param index Index at which insertion takes place + * @param collection The collection to be added + * + * @exception IndexOutOfBoundsException if the index is out of range + */ + public boolean addAll(int index, Collection collection) { + + if (fast) { + synchronized (this) { + ArrayList temp = (ArrayList) list.clone(); + boolean result = temp.addAll(index, collection); + list = temp; + return (result); + } + } else { + synchronized (list) { + return (list.addAll(index, collection)); + } + } + + } + + + /** + * Remove all of the elements from this list. The list will be empty + * after this call returns. + * + * @exception UnsupportedOperationException if clear() + * is not supported by this list + */ + public void clear() { + + if (fast) { + synchronized (this) { + ArrayList temp = (ArrayList) list.clone(); + temp.clear(); + list = temp; + } + } else { + synchronized (list) { + list.clear(); + } + } + + } + + + /** + * Return true if this list contains the specified element. + * + * @param element The element to test for + */ + public boolean contains(Object element) { + + if (fast) { + return (list.contains(element)); + } else { + synchronized (list) { + return (list.contains(element)); + } + } + + } + + + /** + * Return true if this list contains all of the elements + * in the specified Collection. + * + * @param collection Collection whose elements are to be checked + */ + public boolean containsAll(Collection collection) { + + if (fast) { + return (list.containsAll(collection)); + } else { + synchronized (list) { + return (list.containsAll(collection)); + } + } + + } + + + /** + * Increase the capacity of this ArrayList instance, if + * necessary, to ensure that it can hold at least the number of elements + * specified by the minimum capacity argument. + * + * @param capacity The new minimum capacity + */ + public void ensureCapacity(int capacity) { + + if (fast) { + synchronized (this) { + ArrayList temp = (ArrayList) list.clone(); + temp.ensureCapacity(capacity); + list = temp; + } + } else { + synchronized (list) { + list.ensureCapacity(capacity); + } + } + + } + + + /** + * Return the element at the specified position in the list. + * + * @param index The index of the element to return + * + * @exception IndexOutOfBoundsException if the index is out of range + */ + public Object get(int index) { + + if (fast) { + return (list.get(index)); + } else { + synchronized (list) { + return (list.get(index)); + } + } + + } + + + /** + * Search for the first occurrence of the given argument, testing + * for equality using the equals() method, and return + * the corresponding index, or -1 if the object is not found. + * + * @param element The element to search for + */ + public int indexOf(Object element) { + + if (fast) { + return (list.indexOf(element)); + } else { + synchronized (list) { + return (list.indexOf(element)); + } + } + + } + + + /** + * Test if this list has no elements. + */ + public boolean isEmpty() { + + if (fast) { + return (list.isEmpty()); + } else { + synchronized (list) { + return (list.isEmpty()); + } + } + + } + + + /** + * Return an iterator over the elements in this list in proper sequence. + *

+ * IMPLEMENTATION NOTE - If the list is operating in fast + * mode, an Iterator is returned, and a structural modification to the + * list is made, then the Iterator will continue over the previous contents + * of the list (at the time that the Iterator was created), rather than + * failing due to concurrent modifications. + */ + public Iterator iterator() { + + if (fast) { + return (list.iterator()); + } else { + synchronized (list) { + return (list.iterator()); + } + } + + } + + + /** + * Search for the last occurrence of the given argument, testing + * for equality using the equals() method, and return + * the corresponding index, or -1 if the object is not found. + * + * @param element The element to search for + */ + public int lastIndexOf(Object element) { + + if (fast) { + return (list.lastIndexOf(element)); + } else { + synchronized (list) { + return (list.lastIndexOf(element)); + } + } + + } + + + /** + * Return an iterator of the elements of this list, in proper sequence. + * See the implementation note on iterator(). + */ + public ListIterator listIterator() { + + if (fast) { + return (list.listIterator()); + } else { + synchronized (list) { + return (list.listIterator()); + } + } + + } + + + /** + * Return an iterator of the elements of this list, in proper sequence, + * starting at the specified position. + * See the implementation note on iterator(). + * + * @param index The starting position of the iterator to return + * + * @exception IndexOutOfBoundsException if the index is out of range + */ + public ListIterator listIterator(int index) { + + if (fast) { + return (list.listIterator(index)); + } else { + synchronized (list) { + return (list.listIterator(index)); + } + } + + } + + + /** + * Remove the element at the specified position in the list, and shift + * any subsequent elements down one position. + * + * @param index Index of the element to be removed + * + * @exception IndexOutOfBoundsException if the index is out of range + */ + public Object remove(int index) { + + if (fast) { + synchronized (this) { + ArrayList temp = (ArrayList) list.clone(); + Object result = temp.remove(index); + list = temp; + return (result); + } + } else { + synchronized (list) { + return (list.remove(index)); + } + } + + } + + + /** + * Remove the first occurrence of the specified element from the list, + * and shift any subsequent elements down one position. + * + * @param element Element to be removed + */ + public boolean remove(Object element) { + + if (fast) { + synchronized (this) { + ArrayList temp = (ArrayList) list.clone(); + boolean result = temp.remove(element); + list = temp; + return (result); + } + } else { + synchronized (list) { + return (list.remove(element)); + } + } + + } + + + /** + * Remove from this collection all of its elements that are contained + * in the specified collection. + * + * @param collection Collection containing elements to be removed + * + * @exception UnsupportedOperationException if this optional operation + * is not supported by this list + */ + public boolean removeAll(Collection collection) { + + if (fast) { + synchronized (this) { + ArrayList temp = (ArrayList) list.clone(); + boolean result = temp.removeAll(collection); + list = temp; + return (result); + } + } else { + synchronized (list) { + return (list.removeAll(collection)); + } + } + + } + + + /** + * Remove from this collection all of its elements except those that are + * contained in the specified collection. + * + * @param collection Collection containing elements to be retained + * + * @exception UnsupportedOperationException if this optional operation + * is not supported by this list + */ + public boolean retainAll(Collection collection) { + + if (fast) { + synchronized (this) { + ArrayList temp = (ArrayList) list.clone(); + boolean result = temp.retainAll(collection); + list = temp; + return (result); + } + } else { + synchronized (list) { + return (list.retainAll(collection)); + } + } + + } + + + /** + * Replace the element at the specified position in this list with + * the specified element. Returns the previous object at that position. + *

+ * IMPLEMENTATION NOTE - This operation is specifically + * documented to not be a structural change, so it is safe to be performed + * without cloning. + * + * @param index Index of the element to replace + * @param element The new element to be stored + * + * @exception IndexOutOfBoundsException if the index is out of range + */ + public Object set(int index, Object element) { + + if (fast) { + return (list.set(index, element)); + } else { + synchronized (list) { + return (list.set(index, element)); + } + } + + } + + + /** + * Return the number of elements in this list. + */ + public int size() { + + if (fast) { + return (list.size()); + } else { + synchronized (list) { + return (list.size()); + } + } + + } + + + /** + * Return a view of the portion of this list between fromIndex + * (inclusive) and toIndex (exclusive). The returned list is backed + * by this list, so non-structural changes in the returned list are + * reflected in this list. The returned list supports + * all of the optional list operations supported by this list. + * + * @param fromIndex The starting index of the sublist view + * @param toIndex The index after the end of the sublist view + * + * @exception IndexOutOfBoundsException if an index is out of range + */ + public List subList(int fromIndex, int toIndex) { + + if (fast) { + return (list.subList(fromIndex, toIndex)); + } else { + synchronized (list) { + return (list.subList(fromIndex, toIndex)); + } + } + + } + + + /** + * Return an array containing all of the elements in this list in the + * correct order. + */ + public Object[] toArray() { + + if (fast) { + return (list.toArray()); + } else { + synchronized (list) { + return (list.toArray()); + } + } + + } + + + /** + * Return an array containing all of the elements in this list in the + * correct order. The runtime type of the returned array is that of + * the specified array. If the list fits in the specified array, it is + * returned therein. Otherwise, a new array is allocated with the + * runtime type of the specified array, and the size of this list. + * + * @param array Array defining the element type of the returned list + * + * @exception ArrayStoreException if the runtime type of array + * is not a supertype of the runtime type of every element in this list + */ + public Object[] toArray(Object array[]) { + + if (fast) { + return (list.toArray(array)); + } else { + synchronized (list) { + return (list.toArray(array)); + } + } + + } + + + /** + * Return a String representation of this object. + */ + public String toString() { + + StringBuffer sb = new StringBuffer("FastArrayList["); + sb.append(list.toString()); + sb.append("]"); + return (sb.toString()); + + } + + + /** + * Trim the capacity of this ArrayList instance to be the + * list's current size. An application can use this operation to minimize + * the storage of an ArrayList instance. + */ + public void trimToSize() { + + if (fast) { + synchronized (this) { + ArrayList temp = (ArrayList) list.clone(); + temp.trimToSize(); + list = temp; + } + } else { + synchronized (list) { + list.trimToSize(); + } + } + + } + + +} diff --git a/src/java/org/apache/commons/collections/FastHashMap.java b/src/java/org/apache/commons/collections/FastHashMap.java new file mode 100644 index 000000000..222051e33 --- /dev/null +++ b/src/java/org/apache/commons/collections/FastHashMap.java @@ -0,0 +1,422 @@ +/* + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/java/org/apache/commons/collections/FastHashMap.java,v 1.1 2001/04/16 22:42:04 jvanzyl Exp $ + * $Revision: 1.1 $ + * $Date: 2001/04/16 22:42:04 $ + * + * ==================================================================== + * + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999-2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Commons", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + * + */ + + +package org.apache.commons.collections; + + +import java.io.Serializable; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + + +/** + *

A customized implementation of java.util.HashMap designed + * to operate in a multithreaded environment where the large majority of + * method calls are read-only, instead of structural changes. When operating + * in "fast" mode, read calls are non-synchronized and write calls perform the + * following steps:

+ *
    + *
  • Clone the existing collection + *
  • Perform the modification on the clone + *
  • Replace the existing collection with the (modified) clone + *
+ *

When first created, objects of this class default to "slow" mode, where + * all accesses of any type are synchronized but no cloning takes place. This + * is appropriate for initially populating the collection, followed by a switch + * to "fast" mode (by calling setFast(true)) after initialization + * is complete.

+ * + *

NOTE: If you are creating and accessing a + * HashMap only within a single thread, you should use + * java.util.HashMap directly (with no synchronization), for + * maximum performance.

+ * + *

NOTE: The following methods are NOT + * overridden: clone(), equals(Object), hashCode().

+ * + * @author Craig R. McClanahan + * @version $Revision: 1.1 $ $Date: 2001/04/16 22:42:04 $ + */ + +public class FastHashMap implements Map, Cloneable, Serializable { + + + // ----------------------------------------------------------- Constructors + + + /** + * Construct a an empty map. + */ + public FastHashMap() { + + super(); + this.map = new HashMap(); + + } + + + /** + * Construct an empty map with the specified capacity. + * + * @param capacity The initial capacity of the empty map + */ + public FastHashMap(int capacity) { + + super(); + this.map = new HashMap(capacity); + + } + + + /** + * Construct an empty map with the specified capacity and load factor. + * + * @param capacity The initial capacity of the empty map + * @param factor The load factor of the new map + */ + public FastHashMap(int capacity, float factor) { + + super(); + this.map = new HashMap(capacity, factor); + + } + + + /** + * Construct a new map with the same mappings as the specified map. + * + * @param map The map whose mappings are to be copied + */ + public FastHashMap(Map map) { + + super(); + this.map = new HashMap(map); + + } + + + // ----------------------------------------------------- Instance Variables + + + /** + * The underlying map we are managing. + */ + protected HashMap map = null; + + + // ------------------------------------------------------------- Properties + + + /** + * Are we operating in "fast" mode? + */ + protected boolean fast = false; + + public boolean getFast() { + return (this.fast); + } + + public void setFast(boolean fast) { + this.fast = fast; + } + + + // --------------------------------------------------------- Public Methods + + + /** + * Remove all mappings from this map. + */ + public void clear() { + + if (fast) { + synchronized (this) { + HashMap temp = (HashMap) map.clone(); + temp.clear(); + map = temp; + } + } else { + synchronized (map) { + map.clear(); + } + } + + } + + + /** + * Return true if this map contains a mapping for the + * specified key. + * + * @param key Key to be searched for + */ + public boolean containsKey(Object key) { + + if (fast) { + return (map.containsKey(key)); + } else { + synchronized (map) { + return (map.containsKey(key)); + } + } + + } + + + /** + * Return true if this map contains one or more keys mapping + * to the specified value. + * + * @param value Value to be searched for + */ + public boolean containsValue(Object value) { + + if (fast) { + return (map.containsValue(value)); + } else { + synchronized (map) { + return (map.containsValue(value)); + } + } + + } + + + /** + * Return a collection view of the mappings contained in this map. Each + * element in the returned collection is a Map.Entry. + */ + public Set entrySet() { + + if (fast) { + return (map.entrySet()); + } else { + synchronized (map) { + return (map.entrySet()); + } + } + + } + + + /** + * Return the value to which this map maps the specified key. Returns + * null if the map contains no mapping for this key, or if + * there is a mapping with a value of null. Use the + * containsKey() method to disambiguate these cases. + * + * @param key Key whose value is to be returned + */ + public Object get(Object key) { + + if (fast) { + return (map.get(key)); + } else { + synchronized (map) { + return (map.get(key)); + } + } + + } + + + /** + * Return true if this map contains no mappings. + */ + public boolean isEmpty() { + + if (fast) { + return (map.isEmpty()); + } else { + synchronized (map) { + return (map.isEmpty()); + } + } + + } + + + /** + * Return a set view of the keys contained in this map. + */ + public Set keySet() { + + if (fast) { + return (map.keySet()); + } else { + synchronized (map) { + return (map.keySet()); + } + } + + } + + + /** + * Associate the specified value with the specified key in this map. + * If the map previously contained a mapping for this key, the old + * value is replaced and returned. + * + * @param key The key with which the value is to be associated + * @param value The value to be associated with this key + */ + public Object put(Object key, Object value) { + + if (fast) { + synchronized (this) { + HashMap temp = (HashMap) map.clone(); + Object result = temp.put(key, value); + map = temp; + return (result); + } + } else { + synchronized (map) { + return (map.put(key, value)); + } + } + + } + + + /** + * Copy all of the mappings from the specified map to this one, replacing + * any mappings with the same keys. + * + * @param in Map whose mappings are to be copied + */ + public void putAll(Map in) { + + if (fast) { + synchronized (this) { + HashMap temp = (HashMap) map.clone(); + temp.putAll(in); + map = temp; + } + } else { + synchronized (map) { + map.putAll(in); + } + } + + } + + + /** + * Remove any mapping for this key, and return any previously + * mapped value. + * + * @param key Key whose mapping is to be removed + */ + public Object remove(Object key) { + + if (fast) { + synchronized (this) { + HashMap temp = (HashMap) map.clone(); + Object result = temp.remove(key); + map = temp; + return (result); + } + } else { + synchronized (map) { + return (map.remove(key)); + } + } + + } + + + /** + * Return the number of key-value mappings in this map. + */ + public int size() { + + if (fast) { + return (map.size()); + } else { + synchronized (map) { + return (map.size()); + } + } + + } + + + /** + * Return a collection view of the values contained in this map. + */ + public Collection values() { + + if (fast) { + return (map.values()); + } else { + synchronized (map) { + return (map.values()); + } + } + + } + + +} diff --git a/src/java/org/apache/commons/collections/FastTreeMap.java b/src/java/org/apache/commons/collections/FastTreeMap.java new file mode 100644 index 000000000..986313989 --- /dev/null +++ b/src/java/org/apache/commons/collections/FastTreeMap.java @@ -0,0 +1,532 @@ +/* + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/java/org/apache/commons/collections/FastTreeMap.java,v 1.1 2001/04/16 22:42:04 jvanzyl Exp $ + * $Revision: 1.1 $ + * $Date: 2001/04/16 22:42:04 $ + * + * ==================================================================== + * + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999-2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Commons", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + * + */ + + +package org.apache.commons.collections; + + +import java.io.Serializable; +import java.util.Collection; +import java.util.Comparator; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.SortedMap; +import java.util.TreeMap; + + +/** + *

A customized implementation of java.util.TreeMap designed + * to operate in a multithreaded environment where the large majority of + * method calls are read-only, instead of structural changes. When operating + * in "fast" mode, read calls are non-synchronized and write calls perform the + * following steps:

+ *
    + *
  • Clone the existing collection + *
  • Perform the modification on the clone + *
  • Replace the existing collection with the (modified) clone + *
+ *

When first created, objects of this class default to "slow" mode, where + * all accesses of any type are synchronized but no cloning takes place. This + * is appropriate for initially populating the collection, followed by a switch + * to "fast" mode (by calling setFast(true)) after initialization + * is complete.

+ * + *

NOTE: If you are creating and accessing a + * TreeMap only within a single thread, you should use + * java.util.TreeMap directly (with no synchronization), for + * maximum performance.

+ * + *

NOTE: The following methods are NOT + * overridden: clone(), equals(Object), hashCode().

+ * + * @author Craig R. McClanahan + * @version $Revision: 1.1 $ $Date: 2001/04/16 22:42:04 $ + */ + +public class FastTreeMap implements Map, Cloneable, Serializable { + + + // ----------------------------------------------------------- Constructors + + + /** + * Construct a an empty map. + */ + public FastTreeMap() { + + super(); + this.map = new TreeMap(); + + } + + + /** + * Construct an empty map with the specified comparator. + * + * @param comparator The comparator to use for ordering tree elements + */ + public FastTreeMap(Comparator comparator) { + + super(); + this.map = new TreeMap(comparator); + + } + + + /** + * Construct a new map with the same mappings as the specified map, + * sorted according to the keys's natural order + * + * @param map The map whose mappings are to be copied + */ + public FastTreeMap(Map map) { + + super(); + this.map = new TreeMap(map); + + } + + + /** + * Construct a new map with the same mappings as the specified map, + * sorted according to the same ordering + * + * @param map The map whose mappings are to be copied + */ + public FastTreeMap(SortedMap map) { + + super(); + this.map = new TreeMap(map); + + } + + + // ----------------------------------------------------- Instance Variables + + + /** + * The underlying map we are managing. + */ + protected TreeMap map = null; + + + // ------------------------------------------------------------- Properties + + + /** + * Are we operating in "fast" mode? + */ + protected boolean fast = false; + + public boolean getFast() { + return (this.fast); + } + + public void setFast(boolean fast) { + this.fast = fast; + } + + + // --------------------------------------------------------- Public Methods + + + /** + * Remove all mappings from this map. + */ + public void clear() { + + if (fast) { + synchronized (this) { + TreeMap temp = (TreeMap) map.clone(); + temp.clear(); + map = temp; + } + } else { + synchronized (map) { + map.clear(); + } + } + + } + + + /** + * Return the comparator used to order this map, or null + * if this map uses its keys' natural order. + */ + public Comparator comparator() { + + if (fast) { + return (map.comparator()); + } else { + synchronized (map) { + return (map.comparator()); + } + } + + } + + + /** + * Return true if this map contains a mapping for the + * specified key. + * + * @param key Key to be searched for + */ + public boolean containsKey(Object key) { + + if (fast) { + return (map.containsKey(key)); + } else { + synchronized (map) { + return (map.containsKey(key)); + } + } + + } + + + /** + * Return true if this map contains one or more keys mapping + * to the specified value. + * + * @param value Value to be searched for + */ + public boolean containsValue(Object value) { + + if (fast) { + return (map.containsValue(value)); + } else { + synchronized (map) { + return (map.containsValue(value)); + } + } + + } + + + /** + * Return a collection view of the mappings contained in this map. Each + * element in the returned collection is a Map.Entry. + */ + public Set entrySet() { + + if (fast) { + return (map.entrySet()); + } else { + synchronized (map) { + return (map.entrySet()); + } + } + + } + + + /** + * Return the first (lowest) key currently in this sorted map. + */ + public Object firstKey() { + + if (fast) { + return (map.firstKey()); + } else { + synchronized (map) { + return (map.firstKey()); + } + } + + } + + + /** + * Return the value to which this map maps the specified key. Returns + * null if the map contains no mapping for this key, or if + * there is a mapping with a value of null. Use the + * containsKey() method to disambiguate these cases. + * + * @param key Key whose value is to be returned + */ + public Object get(Object key) { + + if (fast) { + return (map.get(key)); + } else { + synchronized (map) { + return (map.get(key)); + } + } + + } + + + /** + * Return a view of the portion of this map whose keys are strictly + * less than the specified key. + * + * @param key Key higher than any in the returned map + */ + public SortedMap headMap(Object key) { + + if (fast) { + return (map.headMap(key)); + } else { + synchronized (map) { + return (map.headMap(key)); + } + } + + } + + + /** + * Test if this list has no elements. + */ + public boolean isEmpty() { + + if (fast) { + return (map.isEmpty()); + } else { + synchronized (map) { + return (map.isEmpty()); + } + } + + } + + + /** + * Return a set view of the keys contained in this map. + */ + public Set keySet() { + + if (fast) { + return (map.keySet()); + } else { + synchronized (map) { + return (map.keySet()); + } + } + + } + + + /** + * Return the last (highest) key currently in this sorted map. + */ + public Object lastKey() { + + if (fast) { + return (map.lastKey()); + } else { + synchronized (map) { + return (map.lastKey()); + } + } + + } + + + /** + * Associate the specified value with the specified key in this map. + * If the map previously contained a mapping for this key, the old + * value is replaced and returned. + * + * @param key The key with which the value is to be associated + * @param value The value to be associated with this key + */ + public Object put(Object key, Object value) { + + if (fast) { + synchronized (this) { + TreeMap temp = (TreeMap) map.clone(); + Object result = temp.put(key, value); + map = temp; + return (result); + } + } else { + synchronized (map) { + return (map.put(key, value)); + } + } + + } + + + /** + * Copy all of the mappings from the specified map to this one, replacing + * any mappings with the same keys. + * + * @param in Map whose mappings are to be copied + */ + public void putAll(Map in) { + + if (fast) { + synchronized (this) { + TreeMap temp = (TreeMap) map.clone(); + temp.putAll(in); + map = temp; + } + } else { + synchronized (map) { + map.putAll(in); + } + } + + } + + + /** + * Remove any mapping for this key, and return any previously + * mapped value. + * + * @param key Key whose mapping is to be removed + */ + public Object remove(Object key) { + + if (fast) { + synchronized (this) { + TreeMap temp = (TreeMap) map.clone(); + Object result = temp.remove(key); + map = temp; + return (result); + } + } else { + synchronized (map) { + return (map.remove(key)); + } + } + + } + + + /** + * Return the number of key-value mappings in this map. + */ + public int size() { + + if (fast) { + return (map.size()); + } else { + synchronized (map) { + return (map.size()); + } + } + + } + + + /** + * Return a view of the portion of this map whose keys are in the + * range fromKey (inclusive) to toKey (exclusive). + * + * @param fromKey Lower limit of keys for the returned map + * @param toKey Upper limit of keys for the returned map + */ + public SortedMap subMap(Object fromKey, Object toKey) { + + if (fast) { + return (map.subMap(fromKey, toKey)); + } else { + synchronized (map) { + return (map.subMap(fromKey, toKey)); + } + } + + } + + + /** + * Return a view of the portion of this map whose keys are greater than + * or equal to the specified key. + * + * @param key Key less than or equal to any in the returned map + */ + public SortedMap tailMap(Object key) { + + if (fast) { + return (map.tailMap(key)); + } else { + synchronized (map) { + return (map.tailMap(key)); + } + } + + } + + + /** + * Return a collection view of the values contained in this map. + */ + public Collection values() { + + if (fast) { + return (map.values()); + } else { + synchronized (map) { + return (map.values()); + } + } + + } + + +} diff --git a/src/test/org/apache/commons/collections/TestAll.java b/src/test/org/apache/commons/collections/TestAll.java index 6a6666fec..fab9e3948 100644 --- a/src/test/org/apache/commons/collections/TestAll.java +++ b/src/test/org/apache/commons/collections/TestAll.java @@ -1,7 +1,7 @@ /* - * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/test/org/apache/commons/collections/TestAll.java,v 1.2 2001/04/14 19:32:38 craigmcc Exp $ - * $Revision: 1.2 $ - * $Date: 2001/04/14 19:32:38 $ + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/test/org/apache/commons/collections/TestAll.java,v 1.3 2001/04/16 22:42:04 jvanzyl Exp $ + * $Revision: 1.3 $ + * $Date: 2001/04/16 22:42:04 $ * * ==================================================================== * @@ -65,7 +65,7 @@ import junit.framework.*; /** * @author Rodney Waldhoff - * @version $Id: TestAll.java,v 1.2 2001/04/14 19:32:38 craigmcc Exp $ + * @version $Id: TestAll.java,v 1.3 2001/04/16 22:42:04 jvanzyl Exp $ */ public class TestAll extends TestCase { public TestAll(String testName) { @@ -76,6 +76,9 @@ public class TestAll extends TestCase { TestSuite suite = new TestSuite(); suite.addTest(TestArrayStack.suite()); suite.addTest(TestCursorableLinkedList.suite()); + suite.addTest(TestFastArrayList.suite()); + suite.addTest(TestFastHashMap.suite()); + suite.addTest(TestFastTreeMap.suite()); return suite; } diff --git a/src/test/org/apache/commons/collections/TestFastArrayList.java b/src/test/org/apache/commons/collections/TestFastArrayList.java new file mode 100644 index 000000000..ba9029488 --- /dev/null +++ b/src/test/org/apache/commons/collections/TestFastArrayList.java @@ -0,0 +1,120 @@ +/* + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/test/org/apache/commons/collections/TestFastArrayList.java,v 1.1 2001/04/16 22:42:04 jvanzyl Exp $ + * $Revision: 1.1 $ + * $Date: 2001/04/16 22:42:04 $ + * + * ==================================================================== + * + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999-2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Commons", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + * + */ + +package org.apache.commons.collections; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * @author Jason van Zyl + * @version $Id: TestFastArrayList.java,v 1.1 2001/04/16 22:42:04 jvanzyl Exp $ + */ +public class TestFastArrayList extends TestCase +{ + public TestFastArrayList(String testName) + { + super(testName); + } + + public static Test suite() + { + return new TestSuite(TestFastArrayList.class); + } + + public static void main(String args[]) + { + String[] testCaseName = { TestFastArrayList.class.getName() }; + junit.textui.TestRunner.main(testCaseName); + } + + private FastArrayList list = null; + + public void setUp() + { + list = new FastArrayList(); + } + + public void testNewFastArrayList() + { + assert("New list is empty", list.isEmpty()); + assertEquals("New list has size zero", list.size(), 0); + + try + { + list.get(1); + fail("get(int i) should have thrown IndexOutOfBoundsException"); + } + catch (IndexOutOfBoundsException e) + { + ; // Expected result + } + } + + public void testSearch() + { + list.add("First Item"); + list.add("Last Item"); + assertEquals("First item is 'First Item'", list.get(0), "First Item"); + assertEquals("Last Item is 'Last Item'", list.get(1), "Last Item"); + } +} diff --git a/src/test/org/apache/commons/collections/TestFastHashMap.java b/src/test/org/apache/commons/collections/TestFastHashMap.java new file mode 100644 index 000000000..4f34bea4c --- /dev/null +++ b/src/test/org/apache/commons/collections/TestFastHashMap.java @@ -0,0 +1,110 @@ +/* + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/test/org/apache/commons/collections/TestFastHashMap.java,v 1.1 2001/04/16 22:42:04 jvanzyl Exp $ + * $Revision: 1.1 $ + * $Date: 2001/04/16 22:42:04 $ + * + * ==================================================================== + * + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999-2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Commons", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + * + */ + +package org.apache.commons.collections; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * @author Jason van Zyl + * @version $Id: TestFastHashMap.java,v 1.1 2001/04/16 22:42:04 jvanzyl Exp $ + */ +public class TestFastHashMap extends TestCase +{ + public TestFastHashMap(String testName) + { + super(testName); + } + + public static Test suite() + { + return new TestSuite(TestFastHashMap.class); + } + + public static void main(String args[]) + { + String[] testCaseName = { TestFastHashMap.class.getName() }; + junit.textui.TestRunner.main(testCaseName); + } + + private FastHashMap map = null; + + public void setUp() + { + map = new FastHashMap(); + } + + public void testNewMap() + { + assert("New map is empty", map.isEmpty()); + assertEquals("New map has size zero", map.size(), 0); + } + + public void testSearch() + { + map.put("first", "First Item"); + map.put("second", "Second Item"); + assertEquals("Top item is 'Second Item'", map.get("first"), "First Item"); + assertEquals("Next Item is 'First Item'", map.get("second"), "Second Item"); + } +} diff --git a/src/test/org/apache/commons/collections/TestFastTreeMap.java b/src/test/org/apache/commons/collections/TestFastTreeMap.java new file mode 100644 index 000000000..203c84743 --- /dev/null +++ b/src/test/org/apache/commons/collections/TestFastTreeMap.java @@ -0,0 +1,110 @@ +/* + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/test/org/apache/commons/collections/TestFastTreeMap.java,v 1.1 2001/04/16 22:42:04 jvanzyl Exp $ + * $Revision: 1.1 $ + * $Date: 2001/04/16 22:42:04 $ + * + * ==================================================================== + * + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999-2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Commons", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + * + */ + +package org.apache.commons.collections; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * @author Jason van Zyl + * @version $Id: TestFastTreeMap.java,v 1.1 2001/04/16 22:42:04 jvanzyl Exp $ + */ +public class TestFastTreeMap extends TestCase +{ + public TestFastTreeMap(String testName) + { + super(testName); + } + + public static Test suite() + { + return new TestSuite(TestFastTreeMap.class); + } + + public static void main(String args[]) + { + String[] testCaseName = { TestFastTreeMap.class.getName() }; + junit.textui.TestRunner.main(testCaseName); + } + + private FastTreeMap map = null; + + public void setUp() + { + map = new FastTreeMap(); + } + + public void testNewMap() + { + assert("New map is empty", map.isEmpty()); + assertEquals("New map has size zero", map.size(), 0); + } + + public void testSearch() + { + map.put("first", "First Item"); + map.put("second", "Second Item"); + assertEquals("Top item is 'Second Item'", map.get("first"), "First Item"); + assertEquals("Next Item is 'First Item'", map.get("second"), "Second Item"); + } +}