package org.odata4j.core; import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; /** * A Map implementation whose structure is immutable after construction. * * <p>Useful for apis that assume a returned map remains unmodified.</p> * * <p>All mutation methods throw <code>UnsupportedOperationException</code></p> * * @param <K> the map key type * @param <V> the map value type */ public class ImmutableMap<K, V> implements Map<K, V> { /** Mutable builder for {@link ImmutableMap} objects. */ public static class Builder<K, V> { private final LinkedHashMap<K, V> map = new LinkedHashMap<K, V>(); public Builder<K, V> put(K key, V value) { map.put(key, value); return this; } public Builder<K, V> putAll(Map<? extends K, ? extends V> map) { this.map.putAll(map); return this; } public ImmutableMap<K, V> build() { return new ImmutableMap<K, V>(map); } } private final LinkedHashMap<K, V> map; private ImmutableMap(LinkedHashMap<K, V> map) { this.map = map; } public static <K, V> ImmutableMap<K, V> of() { return new Builder<K, V>() .build(); } public static <K, V> ImmutableMap<K, V> of(K key1, V value1) { return new Builder<K, V>() .put(key1, value1) .build(); } public static <K, V> ImmutableMap<K, V> of(K key1, V value1, K key2, V value2) { return new Builder<K, V>() .put(key1, value1) .put(key2, value2) .build(); } public static <K, V> ImmutableMap<K, V> of(K key1, V value1, K key2, V value2, K key3, V value3) { return new Builder<K, V>() .put(key1, value1) .put(key2, value2) .put(key3, value3) .build(); } public static <K, V> ImmutableMap<K, V> of(K key1, V value1, K key2, V value2, K key3, V value3, K key4, V value4) { return new Builder<K, V>() .put(key1, value1) .put(key2, value2) .put(key3, value3) .put(key4, value4) .build(); } public static <K, V> ImmutableMap<K, V> of(K key1, V value1, K key2, V value2, K key3, V value3, K key4, V value4, K key5, V value5) { return new Builder<K, V>() .put(key1, value1) .put(key2, value2) .put(key3, value3) .put(key4, value4) .put(key5, value5) .build(); } @Override public int size() { return map.size(); } @Override public boolean isEmpty() { return map.isEmpty(); } @Override public boolean containsKey(Object key) { return map.containsKey(key); } @Override public boolean containsValue(Object value) { return map.containsValue(value); } @Override public V get(Object key) { return map.get(key); } @Override public Set<K> keySet() { return map.keySet(); } @Override public Collection<V> values() { return map.values(); } @Override public Set<Map.Entry<K, V>> entrySet() { return map.entrySet(); } private static UnsupportedOperationException newModificationUnsupported() { return new UnsupportedOperationException(ImmutableMap.class.getSimpleName() + " cannot be modified"); } @Override public V put(K key, V value) { throw newModificationUnsupported(); } @Override public V remove(Object key) { throw newModificationUnsupported(); } @Override public void putAll(Map<? extends K, ? extends V> m) { throw newModificationUnsupported(); } @Override public void clear() { throw newModificationUnsupported(); } }