Refactor + implement SortedSet/Map; they were throwing UnsupportedOperationException. TODO: make serializable Review by: jat (TBR) git-svn-id: https://google-web-toolkit.googlecode.com/svn/releases/1.5@3384 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/super/com/google/gwt/emul/java/util/Collections.java b/user/super/com/google/gwt/emul/java/util/Collections.java index e0e5ef4..7ad66e8 100644 --- a/user/super/com/google/gwt/emul/java/util/Collections.java +++ b/user/super/com/google/gwt/emul/java/util/Collections.java
@@ -15,63 +15,423 @@ */ package java.util; +import java.io.Serializable; + /** * Utility methods that operate on collections. <a * href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/Collections.html">[Sun * docs]</a> */ public class Collections { - - /** - * Used to implement iterators on unmodifiable lists. - * - * @param <E> element type. + /* + * TODO: make the unmodifiable collections serializable. */ - private static class UnmodifiableListIterator<E> implements ListIterator<E> { - final ListIterator<? extends E> it; + static class UnmodifiableCollection<T> implements Collection<T> { + protected final Collection<? extends T> coll; - public UnmodifiableListIterator(ListIterator<? extends E> it) { - this.it = it; + public UnmodifiableCollection(Collection<? extends T> coll) { + this.coll = coll; } - public void add(E o) { - throw new UnsupportedOperationException( - "UnmodifiableListIterator: add not permitted"); + public boolean add(T o) { + throw new UnsupportedOperationException(); + } + + public boolean addAll(Collection<? extends T> c) { + throw new UnsupportedOperationException(); + } + + public void clear() { + throw new UnsupportedOperationException(); + } + + public boolean contains(Object o) { + return coll.contains(o); + } + + public boolean containsAll(Collection<?> c) { + return coll.containsAll(c); + } + + public boolean isEmpty() { + return coll.isEmpty(); + } + + public Iterator<T> iterator() { + return new UnmodifiableCollectionIterator<T>(coll.iterator()); + } + + public boolean remove(Object o) { + throw new UnsupportedOperationException(); + } + + public boolean removeAll(Collection<?> c) { + throw new UnsupportedOperationException(); + } + + public boolean retainAll(Collection<?> c) { + throw new UnsupportedOperationException(); + } + + public int size() { + return coll.size(); + } + + public Object[] toArray() { + return coll.toArray(); + } + + public <E> E[] toArray(E[] a) { + return coll.toArray(a); + } + } + + static class UnmodifiableList<T> extends UnmodifiableCollection<T> implements + List<T> { + private final List<? extends T> list; + + public UnmodifiableList(List<? extends T> list) { + super(list); + this.list = list; + } + + public void add(int index, T element) { + throw new UnsupportedOperationException(); + } + + public boolean addAll(int index, Collection<? extends T> c) { + throw new UnsupportedOperationException(); + } + + public T get(int index) { + return list.get(index); + } + + public int indexOf(Object o) { + return list.indexOf(o); + } + + public boolean isEmpty() { + return list.isEmpty(); + } + + public int lastIndexOf(Object o) { + return list.lastIndexOf(o); + } + + public ListIterator<T> listIterator() { + return listIterator(0); + } + + public ListIterator<T> listIterator(int from) { + return new UnmodifiableListIterator<T>(list.listIterator(from)); + } + + public T remove(int index) { + throw new UnsupportedOperationException(); + } + + public T set(int index, T element) { + throw new UnsupportedOperationException(); + } + } + + static class UnmodifiableMap<K, V> implements Map<K, V> { + + static class UnmodifiableEntrySet<K, V> extends + UnmodifiableSet<Map.Entry<K, V>> { + + private static class UnmodifiableEntry<K, V> implements Map.Entry<K, V> { + private Map.Entry<? extends K, ? extends V> entry; + + public UnmodifiableEntry(Map.Entry<? extends K, ? extends V> entry) { + this.entry = entry; + } + + public boolean equals(Object o) { + return entry.equals(o); + } + + public K getKey() { + return entry.getKey(); + } + + public V getValue() { + return entry.getValue(); + } + + public int hashCode() { + return entry.hashCode(); + } + + public V setValue(V value) { + throw new UnsupportedOperationException(); + } + + public String toString() { + return entry.toString(); + } + } + + @SuppressWarnings("unchecked") + public UnmodifiableEntrySet( + Set<? extends Map.Entry<? extends K, ? extends V>> s) { + super((Set<? extends Entry<K, V>>) s); + } + + public boolean contains(Object o) { + return coll.contains(o); + } + + public boolean containsAll(Collection<?> o) { + return coll.containsAll(o); + } + + @SuppressWarnings("unchecked") + public Iterator<Map.Entry<K, V>> iterator() { + final Iterator<Map.Entry<K, V>> it = (Iterator<Entry<K, V>>) coll.iterator(); + return new Iterator<Map.Entry<K, V>>() { + public boolean hasNext() { + return it.hasNext(); + } + + public Map.Entry<K, V> next() { + return new UnmodifiableEntry<K, V>(it.next()); + } + + public void remove() { + throw new UnsupportedOperationException(); + } + }; + } + + @SuppressWarnings("unchecked") + public Object[] toArray() { + return toArray(super.toArray()); + } + + @SuppressWarnings("unchecked") + public <T> T[] toArray(T[] a) { + Object[] result = super.toArray(a); + for (int i = 0, c = result.length; i < c; ++i) { + result[i] = new UnmodifiableEntry<K, V>((Map.Entry<K, V>) result[i]); + } + return (T[]) result; + } + } + + private final Map<? extends K, ? extends V> map; + + public UnmodifiableMap(Map<? extends K, ? extends V> map) { + this.map = map; + } + + public void clear() { + throw new UnsupportedOperationException(); + } + + public boolean containsKey(Object key) { + return map.containsKey(key); + } + + public boolean containsValue(Object val) { + return map.containsValue(val); + } + + public Set<Map.Entry<K, V>> entrySet() { + return new UnmodifiableEntrySet<K, V>(map.entrySet()); + } + + public boolean equals(Object o) { + return map.equals(o); + } + + public V get(Object key) { + return map.get(key); + } + + public int hashCode() { + return map.hashCode(); + } + + public boolean isEmpty() { + return map.isEmpty(); + } + + public Set<K> keySet() { + return unmodifiableSet(map.keySet()); + } + + public V put(K key, V value) { + throw new UnsupportedOperationException(); + } + + public void putAll(Map<? extends K, ? extends V> t) { + throw new UnsupportedOperationException(); + } + + public V remove(Object key) { + throw new UnsupportedOperationException(); + } + + public int size() { + return map.size(); + } + + public String toString() { + return map.toString(); + } + + public Collection<V> values() { + return unmodifiableCollection(map.values()); + } + } + + static class UnmodifiableRandomAccessList<T> extends UnmodifiableList<T> + implements RandomAccess { + public UnmodifiableRandomAccessList(List<? extends T> list) { + super(list); + } + } + + static class UnmodifiableSet<T> extends UnmodifiableCollection<T> implements + Set<T> { + public UnmodifiableSet(Set<? extends T> set) { + super(set); + } + + public boolean equals(Object o) { + return coll.equals(o); + } + + public int hashCode() { + return coll.hashCode(); + } + } + + static class UnmodifiableSortedMap<K, V> extends UnmodifiableMap<K, V> + implements SortedMap<K, V> { + + private SortedMap<K, ? extends V> sortedMap; + + public UnmodifiableSortedMap(SortedMap<K, ? extends V> sortedMap) { + super(sortedMap); + this.sortedMap = sortedMap; + } + + public Comparator<? super K> comparator() { + return sortedMap.comparator(); + } + + public K firstKey() { + return sortedMap.firstKey(); + } + + public SortedMap<K, V> headMap(K toKey) { + return new UnmodifiableSortedMap<K, V>(sortedMap.headMap(toKey)); + } + + public K lastKey() { + return sortedMap.lastKey(); + } + + public SortedMap<K, V> subMap(K fromKey, K toKey) { + return new UnmodifiableSortedMap<K, V>(sortedMap.subMap(fromKey, toKey)); + } + + public SortedMap<K, V> tailMap(K fromKey) { + return new UnmodifiableSortedMap<K, V>(sortedMap.tailMap(fromKey)); + } + } + + static class UnmodifiableSortedSet<E> extends UnmodifiableSet<E> implements + SortedSet<E> { + private SortedSet<E> sortedSet; + + @SuppressWarnings("unchecked") + public UnmodifiableSortedSet(SortedSet<? extends E> sortedSet) { + super(sortedSet); + this.sortedSet = (SortedSet<E>) sortedSet; + } + + public Comparator<? super E> comparator() { + return sortedSet.comparator(); + } + + public E first() { + return sortedSet.first(); + } + + public SortedSet<E> headSet(E toElement) { + return new UnmodifiableSortedSet<E>(sortedSet.headSet(toElement)); + } + + public E last() { + return sortedSet.last(); + } + + public SortedSet<E> subSet(E fromElement, E toElement) { + return new UnmodifiableSortedSet<E>(sortedSet.subSet(fromElement, + toElement)); + } + + public SortedSet<E> tailSet(E fromElement) { + return new UnmodifiableSortedSet<E>(sortedSet.tailSet(fromElement)); + } + } + + private static class UnmodifiableCollectionIterator<T> implements Iterator<T> { + private final Iterator<? extends T> it; + + private UnmodifiableCollectionIterator(Iterator<? extends T> it) { + this.it = it; } public boolean hasNext() { return it.hasNext(); } - public boolean hasPrevious() { - return it.hasPrevious(); - } - - public E next() { + public T next() { return it.next(); } - public int nextIndex() { - return it.nextIndex(); + public void remove() { + throw new UnsupportedOperationException(); + } + } + + private static class UnmodifiableListIterator<T> extends + UnmodifiableCollectionIterator<T> implements ListIterator<T> { + private final ListIterator<? extends T> lit; + + private UnmodifiableListIterator(ListIterator<? extends T> lit) { + super(lit); + this.lit = lit; } - public E previous() { - return it.previous(); + public void add(T o) { + throw new UnsupportedOperationException(); + } + + public boolean hasPrevious() { + return lit.hasPrevious(); + } + + public int nextIndex() { + return lit.nextIndex(); + } + + public T previous() { + return lit.previous(); } public int previousIndex() { - return it.previousIndex(); + return lit.previousIndex(); } - public void remove() { - throw new UnsupportedOperationException( - "UnmodifiableListIterator: remove not permitted"); - } - - public void set(E o) { - throw new UnsupportedOperationException( - "UnmodifiableListIterator: set not permitted"); + public void set(T o) { + throw new UnsupportedOperationException(); } } @@ -235,17 +595,17 @@ return true; } - @SuppressWarnings({"unchecked", "cast"}) + @SuppressWarnings(value = {"unchecked", "cast"}) public static <T> List<T> emptyList() { return (List<T>) EMPTY_LIST; } - @SuppressWarnings({"unchecked", "cast"}) + @SuppressWarnings(value = {"unchecked", "cast"}) public static <K, V> Map<K, V> emptyMap() { return (Map<K, V>) EMPTY_MAP; } - @SuppressWarnings({"unchecked", "cast"}) + @SuppressWarnings(value = {"unchecked", "cast"}) public static <T> Set<T> emptySet() { return (Set<T>) EMPTY_SET; } @@ -378,15 +738,15 @@ }; } - // TODO(tobyr) Is it worth creating custom singleton sets, lists, and maps? - // More efficient at runtime, but more code bloat to download - public static <T> Set<T> singleton(T o) { HashSet<T> set = new HashSet<T>(1); set.add(o); return unmodifiableSet(set); } + // TODO(tobyr) Is it worth creating custom singleton sets, lists, and maps? + // More efficient at runtime, but more code bloat to download + public static <T> List<T> singletonList(T o) { List<T> list = new ArrayList<T>(1); list.add(o); @@ -405,6 +765,7 @@ replaceContents(target, x); } + @SuppressWarnings("unchecked") public static <T> void sort(List<T> target, Comparator<? super T> c) { Object[] x = target.toArray(); Arrays.sort(x, (Comparator<Object>) c); @@ -417,338 +778,30 @@ public static <T> Collection<T> unmodifiableCollection( final Collection<? extends T> coll) { - return new Collection<T>() { - - public boolean add(T o) { - throw new UnsupportedOperationException( - "unmodifiableCollection: add not permitted"); - } - - public boolean addAll(Collection<? extends T> c) { - throw new UnsupportedOperationException( - "unmodifiableCollection: addAll not permitted"); - } - - public void clear() { - throw new UnsupportedOperationException( - "unmodifiableCollection: clear not permitted"); - } - - public boolean contains(Object o) { - return coll.contains(o); - } - - public boolean containsAll(Collection<?> c) { - return coll.containsAll(c); - } - - public boolean isEmpty() { - return coll.isEmpty(); - } - - public Iterator<T> iterator() { - final Iterator<? extends T> it = coll.iterator(); - return new Iterator<T>() { - - public boolean hasNext() { - return it.hasNext(); - } - - public T next() { - return it.next(); - } - - public void remove() { - throw new UnsupportedOperationException( - "unmodifiableCollection.iterator: remove not permitted"); - } - }; - } - - public boolean remove(Object o) { - throw new UnsupportedOperationException( - "unmodifiableCollection: remove not permitted"); - } - - public boolean removeAll(Collection<?> c) { - throw new UnsupportedOperationException( - "unmodifiableCollection: removeAll not permitted"); - } - - public boolean retainAll(Collection<?> c) { - throw new UnsupportedOperationException( - "unmodifiableCollection: retainAll not permitted"); - } - - public int size() { - return coll.size(); - } - - public Object[] toArray() { - return coll.toArray(); - } - - public <OT> OT[] toArray(OT[] a) { - return coll.toArray(a); - } - }; + return new UnmodifiableCollection<T>(coll); } public static <T> List<T> unmodifiableList(final List<? extends T> list) { - return new List<T>() { - public void add(int index, T element) { - throw new UnsupportedOperationException( - "unmodifiableList: add not permitted"); - } - - public boolean add(T o) { - throw new UnsupportedOperationException( - "unmodifiableList: add not permitted"); - } - - public boolean addAll(Collection<? extends T> c) { - throw new UnsupportedOperationException( - "unmodifiableList: addAll not permitted"); - } - - public boolean addAll(int index, Collection<? extends T> c) { - throw new UnsupportedOperationException( - "unmodifiableList: addAll not permitted"); - } - - public void clear() { - throw new UnsupportedOperationException( - "unmodifiableList: clear not permitted"); - } - - public boolean contains(Object o) { - return list.contains(o); - } - - public boolean containsAll(Collection<?> c) { - return list.containsAll(c); - } - - public T get(int index) { - return list.get(index); - } - - public int indexOf(Object o) { - return list.indexOf(o); - } - - public boolean isEmpty() { - return list.isEmpty(); - } - - public Iterator<T> iterator() { - return listIterator(); - } - - public int lastIndexOf(Object o) { - return list.lastIndexOf(o); - } - - public ListIterator<T> listIterator() { - return new UnmodifiableListIterator<T>(list.listIterator()); - } - - public ListIterator<T> listIterator(int from) { - return new UnmodifiableListIterator<T>(list.listIterator(from)); - } - - public T remove(int index) { - throw new UnsupportedOperationException( - "unmodifiableList: remove not permitted"); - } - - public boolean remove(Object o) { - throw new UnsupportedOperationException( - "unmodifiableList: remove not permitted"); - } - - public boolean removeAll(Collection<?> c) { - throw new UnsupportedOperationException( - "unmodifiableList: removeAll not permitted"); - } - - public boolean retainAll(Collection<?> c) { - throw new UnsupportedOperationException( - "unmodifiableList: retainAll not permitted"); - } - - public T set(int index, T element) { - throw new UnsupportedOperationException( - "unmodifiableList: set not permitted"); - } - - public int size() { - return list.size(); - } - - // TODO(jat): implement -// public List<T> subList(int fromIndex, int toIndex) { -// } - - public Object[] toArray() { - return list.toArray(); - } - - public <OT> OT[] toArray(OT[] array) { - return list.toArray(array); - } - }; + return new UnmodifiableList<T>(list); } public static <K, V> Map<K, V> unmodifiableMap( final Map<? extends K, ? extends V> map) { - return new Map<K, V>() { - - public void clear() { - throw new UnsupportedOperationException( - "unmodifiableMap: clear not permitted"); - } - - public boolean containsKey(Object key) { - return map.containsKey(key); - } - - public boolean containsValue(Object value) { - return map.containsValue(value); - } - - public Set<Map.Entry<K, V>> entrySet() { - Set<? extends Map.Entry<? extends K, ? extends V>> entrySet = map.entrySet(); - return (Set<Map.Entry<K, V>>) entrySet; - } - - public V get(Object key) { - return map.get(key); - } - - public boolean isEmpty() { - return map.isEmpty(); - } - - public Set<K> keySet() { - return (Set<K>) map.keySet(); - } - - public V put(K key, V value) { - throw new UnsupportedOperationException( - "unmodifiableMap: put not permitted"); - } - - public void putAll(Map<? extends K, ? extends V> t) { - throw new UnsupportedOperationException( - "unmodifiableMap: putAll not permitted"); - } - - public V remove(Object key) { - throw new UnsupportedOperationException( - "unmodifiableMap: remove not permitted"); - } - - public int size() { - return map.size(); - } - - public Collection<V> values() { - return (Collection<V>) map.values(); - } - - }; + return new UnmodifiableMap<K, V>(map); } public static <T> Set<T> unmodifiableSet(final Set<? extends T> set) { - return new Set<T>() { - - public boolean add(T o) { - throw new UnsupportedOperationException( - "unmodifiableSet: add not permitted"); - } - - public boolean addAll(Collection<? extends T> c) { - throw new UnsupportedOperationException( - "unmodifiableSet: addAll not permitted"); - } - - public void clear() { - throw new UnsupportedOperationException( - "unmodifiableSet: clear not permitted"); - } - - public boolean contains(Object o) { - return set.contains(o); - } - - public boolean containsAll(Collection<?> c) { - return set.containsAll(c); - } - - public boolean isEmpty() { - return set.isEmpty(); - } - - public Iterator<T> iterator() { - final Iterator<? extends T> it = set.iterator(); - return new Iterator<T>() { - - public boolean hasNext() { - return it.hasNext(); - } - - public T next() { - return it.next(); - } - - public void remove() { - throw new UnsupportedOperationException( - "unmodifiableCollection.iterator: remove not permitted"); - } - }; - } - - public boolean remove(Object o) { - throw new UnsupportedOperationException( - "unmodifiableSet: remove not permitted"); - } - - public boolean removeAll(Collection<?> c) { - throw new UnsupportedOperationException( - "unmodifiableSet: removeAll not permitted"); - } - - public boolean retainAll(Collection<?> c) { - throw new UnsupportedOperationException( - "unmodifiableSet: retainAll not permitted"); - } - - public int size() { - return set.size(); - } - - public Object[] toArray() { - return set.toArray(); - } - - public <OT> OT[] toArray(OT[] a) { - return set.toArray(a); - } - - }; + return new UnmodifiableSet<T>(set); } public static <K, V> SortedMap<K, V> unmodifiableSortedMap( - SortedMap<? extends K, ? extends V> map) { - throw new UnsupportedOperationException( - "unmodifiableSortedMap not implemented"); + SortedMap<K, ? extends V> map) { + return new UnmodifiableSortedMap<K, V>(map); } public static <T> SortedSet<T> unmodifiableSortedSet( SortedSet<? extends T> set) { - throw new UnsupportedOperationException( - "unmodifiableSortedSet not implemented"); + return new UnmodifiableSortedSet<T>(set); } /**