package com.bergerkiller.bukkit.common.conversion.util; import java.util.Collection; import java.util.Map; import java.util.Set; import com.bergerkiller.bukkit.common.conversion.ConverterPair; /** * Wraps around another Map of unknown contents and performs key/value conversions automatically. * This can be used to interact with maps that require additional element conversion. * * @param <K> - key type * @param <V> - value type */ public class ConvertingMap<K, V> implements Map<K, V> { private final Map<Object, Object> base; protected final ConverterPair<Object, K> keyConverter; protected final ConverterPair<Object, V> valueConverter; @SuppressWarnings("unchecked") public ConvertingMap(Map<?, ?> map, ConverterPair<?, K> keyConverter, ConverterPair<?, V> valueConverter) { this.base = (Map<Object, Object>) map; this.keyConverter = (ConverterPair<Object, K>) keyConverter; this.valueConverter = (ConverterPair<Object, V>) valueConverter; } @Override public int size() { return base.size(); } @Override public boolean isEmpty() { return base.isEmpty(); } @Override public boolean containsKey(Object key) { return base.containsKey(keyConverter.convertA(key)); } @Override public boolean containsValue(Object value) { return base.containsValue(valueConverter.convertA(value)); } @Override public V get(Object key) { return valueConverter.convertB(base.get(keyConverter.convertA(key))); } @Override public V put(K key, V value) { return valueConverter.convertB(base.put(keyConverter.convertA(key), valueConverter.convertB(value))); } @Override public V remove(Object key) { return valueConverter.convertB(base.remove(keyConverter.convertA(key))); } @Override public void putAll(Map<? extends K, ? extends V> m) { for (Map.Entry<? extends K, ? extends V> entry : m.entrySet()) { put(entry.getKey(), entry.getValue()); } } @Override public void clear() { base.clear(); } @Override public Set<K> keySet() { return new ConvertingSet<K>(base.keySet(), keyConverter); } @Override public Collection<V> values() { return new ConvertingCollection<V>(base.values(), valueConverter); } @Override public Set<java.util.Map.Entry<K, V>> entrySet() { return new ConvertingEntrySet<K, V>(base.entrySet(), keyConverter, valueConverter); } }