package fr.openwide.core.jpa.more.business.difference.access; import java.util.Collection; import java.util.Map; import java.util.Map.Entry; import com.google.common.base.Equivalence; import com.google.common.collect.Multimap; import de.danielbechler.diff.access.Accessor; import de.danielbechler.diff.selector.ElementSelector; import fr.openwide.core.jpa.more.business.difference.selector.MultimapEntrySelector; public class MultimapEntryAccessor<K, V> implements Accessor, IKeyAwareAccessor<K> { private final Map.Entry<K, V> entry; private final Equivalence<? super Entry<K, V>> entryEquivalence; public MultimapEntryAccessor(Map.Entry<K, V> entry, Equivalence<? super Entry<K, V>> entryEquivalence) { super(); this.entry = entry; this.entryEquivalence = entryEquivalence; } @Override public K getKey() { return entry.getKey(); } @Override public ElementSelector getElementSelector() { return new MultimapEntrySelector<>(entry, entryEquivalence); } @SuppressWarnings("rawtypes") protected Multimap objectToMultimap(Object object) { if (object == null) { return null; } else if (object instanceof Multimap) { return (Multimap) object; } else { throw new IllegalArgumentException("Expecting a Multimap"); } } @SuppressWarnings("unchecked") @Override public Object get(final Object target) { final Multimap<K, V> targetMap = objectToMultimap(target); if (targetMap != null) { Collection<? extends Map.Entry<K, V>> entries = targetMap.entries(); for (final Map.Entry<K, V> item : entries) { if (item != null && entryEquivalence.equivalent(entry, item)) { return item; } } } return null; } @Override public void set(final Object target, final Object value) { throw new UnsupportedOperationException("Cannot set value on multimap entries."); } @Override public void unset(final Object target) { throw new UnsupportedOperationException("Cannot unset value on multimap entries."); } }