package tc.oc.commons.core.collection; import java.util.Map; import java.util.Objects; import java.util.Set; import javax.annotation.Nullable; import com.google.common.collect.ForwardingMap; /** * A {@link ForwardingMap} that delegates all insertion operations to {@link #putInternal}, * even those that are done through a collection view. */ public abstract class FilteredMap<K, V> extends ForwardingMap<K, V> { private @Nullable EntrySet entrySet; protected abstract V putInternal(K key, V value); @Override public V put(K key, V value) { return putInternal(key, value); } @Override public void putAll(Map<? extends K, ? extends V> map) { standardPutAll(map); } @Override public Set<Entry<K, V>> entrySet() { return (entrySet == null ? entrySet = createEntrySet() : entrySet); } protected EntrySet createEntrySet() { return new EntrySet(); } protected class EntrySet extends FilteredSet<Entry<K, V>> { @Override protected Set<Entry<K, V>> delegate() { return FilteredMap.this.delegate().entrySet(); } @Override protected boolean addInternal(Entry<K, V> entry) { final V value = entry.getValue(); return !Objects.equals(value, put(entry.getKey(), value)); } } }