/******************************************************************************
* Copyright (c) 2006, 2010 VMware Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Apache License v2.0 which accompanies this distribution.
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0
* is available at http://www.opensource.org/licenses/apache2.0.php.
* You may elect to redistribute this code under either of these licenses.
*
* Contributors:
* VMware Inc.
*****************************************************************************/
package org.eclipse.gemini.blueprint.util.internal;
import java.util.Collection;
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import org.springframework.util.Assert;
/**
* Dictionary implementation backed by a map instance. While the JDK provides a
* Dictionary implementation through Hashtable, the class itself is always
* synchronized and does not maintain the internal order.
*
* <p/>
* This simple wrapper, accepts any type of Map as backing storage allowing more
* options in choosing the appropriate implementation. By default, a
* {@link java.util.LinkedHashMap} is used, if no Map is specified.
*
* <p/>
* This implementation will enforce the Dictionary behaviour over the map when
* it comes to handling null values. As opposed to a Map, the Dictionary always
* throws {@link NullPointerException} if a given argument is null.
*
* @see java.util.Map
* @see java.util.Dictionary
* @author Costin Leau
*/
public class MapBasedDictionary<K, V> extends Dictionary<K, V> implements Map<K, V> {
private Map<K, V> map;
/**
* Enumeration wrapper around an Iterator.
*
* @author Costin Leau
*
*/
private static class IteratorBasedEnumeration<E> implements Enumeration<E> {
private Iterator<E> it;
public IteratorBasedEnumeration(Iterator<E> it) {
Assert.notNull(it);
this.it = it;
}
public IteratorBasedEnumeration(Collection<E> col) {
this(col.iterator());
}
public boolean hasMoreElements() {
return it.hasNext();
}
public E nextElement() {
return it.next();
}
}
public MapBasedDictionary(Map<K, V> map) {
this.map = (map == null ? new LinkedHashMap<K, V>() : map);
}
/**
* Default constructor.
*
*/
public MapBasedDictionary() {
this.map = new LinkedHashMap<K, V>();
}
public MapBasedDictionary(int initialCapacity) {
this.map = new LinkedHashMap<K, V>(initialCapacity);
}
/**
* Constructor for dealing with existing Dictionary. Will copy the content
* into the inner Map.
*
* @param dictionary
*/
public MapBasedDictionary(Dictionary<? extends K, ? extends V> dictionary) {
this(new LinkedHashMap<K, V>(), dictionary);
}
public MapBasedDictionary(Map<K, V> map, Dictionary<? extends K, ? extends V> dictionary) {
this(map);
if (dictionary != null)
putAll(dictionary);
}
public void clear() {
map.clear();
}
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() {
return map.entrySet();
}
public V get(Object key) {
if (key == null)
throw new NullPointerException();
return map.get(key);
}
public boolean isEmpty() {
return map.isEmpty();
}
public Set<K> keySet() {
return map.keySet();
}
public V put(K key, V value) {
if (key == null || value == null)
throw new NullPointerException();
return map.put(key, value);
}
public void putAll(Map<? extends K, ? extends V> t) {
map.putAll(t);
}
public <T extends K> void putAll(Dictionary<T, ? extends V> dictionary) {
if (dictionary != null)
// copy the dictionary
for (Enumeration<T> enm = dictionary.keys(); enm.hasMoreElements();) {
T key = enm.nextElement();
map.put(key, dictionary.get(key));
}
}
public V remove(Object key) {
if (key == null)
throw new NullPointerException();
return map.remove(key);
}
public int size() {
return map.size();
}
public Collection<V> values() {
return map.values();
}
public Enumeration<V> elements() {
return new IteratorBasedEnumeration<V>(map.values());
}
public Enumeration<K> keys() {
return new IteratorBasedEnumeration<K>(map.keySet());
}
public String toString() {
return map.toString();
}
public boolean equals(Object obj) {
// this should work nicely since the Dictionary implementations inside
// the JDK are Maps also
return map.equals(obj);
}
public int hashCode() {
return map.hashCode();
}
}