package fr.openwide.core.spring.property.model; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import com.google.common.base.Function; import com.google.common.collect.Iterators; public class MutablePropertyValueMap implements IMutablePropertyValueMap { private Map<MutablePropertyId<?>, Object> delegate = new LinkedHashMap<>(); @Override public Iterator<Entry<?>> iterator() { return Iterators.transform( delegate.entrySet().iterator(), new Function<Map.Entry<MutablePropertyId<?>, Object>, IMutablePropertyValueMap.Entry<?>>() { @Override public Entry<?> apply(Map.Entry<MutablePropertyId<?>, Object> input) { return new EntryImpl<>(input); } } ); } @SuppressWarnings("unchecked") @Override public <T> T get(MutablePropertyId<T> key) { return (T) delegate.get(key); } @SuppressWarnings("unchecked") @Override public <T> T put(MutablePropertyId<T> key, T value) { return (T) delegate.put(key, value); } @SuppressWarnings("unchecked") private static final class EntryImpl<T> implements Entry<T> { private final Map.Entry<MutablePropertyId<?>, Object> delegate; protected EntryImpl(Map.Entry<MutablePropertyId<?>, Object> delegate) { super(); this.delegate = delegate; } @Override public MutablePropertyId<T> getKey() { return (MutablePropertyId<T>) delegate.getKey(); } @Override public T getValue() { return (T) delegate.getValue(); } } }