package eu.stratosphere.util;
import java.util.AbstractMap;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* A map implementation that returns a default value instead of <code>null</code>.
*
* @author Arvid Heise
* @param <K>
* the key
* @param <V>
* the value
*/
public class DefaultMap<K, V> extends AbstractMap<K, V> {
private V defaultValue;
private Map<K, V> backing;
public DefaultMap(final V defaultValue) {
this(defaultValue, new HashMap<K, V>());
}
public DefaultMap(final V defaultValue, final Map<K, V> backing) {
this.defaultValue = defaultValue;
this.backing = backing;
}
@Override
public void clear() {
this.backing.clear();
}
@Override
public boolean containsKey(final Object key) {
return this.backing.containsKey(key);
}
@Override
public boolean containsValue(final Object value) {
return this.backing.containsValue(value);
}
@Override
public Set<Entry<K, V>> entrySet() {
return this.backing.entrySet();
}
@Override
public boolean equals(final Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (this.getClass() != obj.getClass())
return false;
@SuppressWarnings("unchecked")
final DefaultMap<K, V> other = (DefaultMap<K, V>) obj;
return this.defaultValue.equals(other.defaultValue) && this.backing.equals(other.backing);
}
/**
* Returns the default value if the given key is not in the map.<br>
* Otherwise the original semantics of {@link Map#get(Object)} is maintained.
*
* @return the value to which the specified key is mapped, or
* the default value if this map contains no mapping for the key
*/
@Override
public V get(final Object key) {
final V value = this.backing.get(key);
return value == null ? this.defaultValue : value;
}
public V getDefaultValue() {
return this.defaultValue;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + this.backing.hashCode();
result = prime * result + this.defaultValue.hashCode();
return result;
}
@Override
public boolean isEmpty() {
return this.backing.isEmpty();
}
@Override
public Set<K> keySet() {
return this.backing.keySet();
}
@Override
public V put(final K key, final V value) {
return this.backing.put(key, value);
}
@Override
public void putAll(final Map<? extends K, ? extends V> m) {
this.backing.putAll(m);
}
@Override
public V remove(final Object key) {
return this.backing.remove(key);
}
public void setDefaultValue(final V defaultValue) {
if (defaultValue == null)
throw new NullPointerException("defaultValue must not be null");
this.defaultValue = defaultValue;
}
@Override
public int size() {
return this.backing.size();
}
@Override
public Collection<V> values() {
return this.backing.values();
}
}