package de.invesdwin.util.collections; import java.util.Collection; import java.util.Map; import java.util.Set; import javax.annotation.concurrent.NotThreadSafe; @NotThreadSafe public abstract class ADelegateMap<K, V> implements Map<K, V> { private final Map<K, V> delegate = newDelegate(); protected abstract Map<K, V> newDelegate(); protected Map<K, V> getDelegate() { return delegate; } @Override public int size() { return getDelegate().size(); } @Override public boolean isEmpty() { return getDelegate().isEmpty(); } @Override public boolean containsKey(final Object key) { return getDelegate().containsKey(key); } @Override public boolean containsValue(final Object value) { return getDelegate().containsValue(value); } @Override public V get(final Object key) { return getDelegate().get(key); } @Override public V put(final K key, final V value) { if (isPutAllowed(key, value)) { return getDelegate().put(key, value); } else { throw new IllegalArgumentException("isPutAllowed returned false! Check this before using put!"); } } @Override public V remove(final Object key) { return getDelegate().remove(key); } @Override public void putAll(final Map<? extends K, ? extends V> m) { for (final Entry<? extends K, ? extends V> e : m.entrySet()) { put(e.getKey(), e.getValue()); } } @Override public void clear() { getDelegate().clear(); } @Override public Set<K> keySet() { return getDelegate().keySet(); } @Override public Collection<V> values() { return getDelegate().values(); } @Override public Set<java.util.Map.Entry<K, V>> entrySet() { return getDelegate().entrySet(); } public boolean isPutAllowed(final K key, final V value) { return true; } public static <K, V> Map<K, V> maybeUnwrapToRoot(final Map<K, V> map) { Map<K, V> cur = map; while (cur instanceof ADelegateMap) { final ADelegateMap<K, V> c = (ADelegateMap<K, V>) map; cur = c.getDelegate(); } return cur; } }