package com.revolsys.collection.map; import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import com.revolsys.util.JavaBeanUtil; public class DelegatingMap<K, V> implements Map<K, V>, Cloneable { public static <K2, V2> Map<K2, V2> newMap(final Map<K2, V2> map) { return new DelegatingMap<>(map); } private Map<K, V> map; public DelegatingMap() { this(new LinkedHashMap<K, V>()); } public DelegatingMap(final Map<K, V> map) { if (map == null) { throw new IllegalArgumentException("Map cannot be null"); } this.map = map; } @Override public void clear() { getMap().clear(); } @Override protected DelegatingMap<K, V> clone() { try { @SuppressWarnings("unchecked") final DelegatingMap<K, V> clone = (DelegatingMap<K, V>)super.clone(); clone.map = JavaBeanUtil.clone(getMap()); return clone; } catch (final CloneNotSupportedException e) { return this; } } @Override public boolean containsKey(final Object key) { return getMap().containsKey(key); } @Override public boolean containsValue(final Object value) { return getMap().containsValue(value); } @Override public Set<Entry<K, V>> entrySet() { return getMap().entrySet(); } @Override public boolean equals(final Object o) { return getMap().equals(o); } @Override public V get(final Object key) { return getMap().get(key); } public Map<K, V> getMap() { return this.map; } @Override public int hashCode() { return getMap().hashCode(); } @Override public boolean isEmpty() { return getMap().isEmpty(); } @Override public Set<K> keySet() { return getMap().keySet(); } @Override public V put(final K key, final V value) { return getMap().put(key, value); } @Override public void putAll(final Map<? extends K, ? extends V> m) { getMap().putAll(m); } @Override public V remove(final Object key) { return getMap().remove(key); } public void setMap(final Map<K, V> map) { if (map == null) { throw new IllegalArgumentException("Map cannot be null"); } this.map = map; } @Override public int size() { return getMap().size(); } @Override public String toString() { return getMap().toString(); } @Override public Collection<V> values() { return getMap().values(); } }