package fr.openwide.core.jpa.more.business.difference.differ.strategy; import java.util.Collection; import java.util.Map; import java.util.Set; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; import de.danielbechler.diff.access.Accessor; import fr.openwide.core.jpa.more.business.difference.access.MultimapValueByKeyAccessor; public class MultimapDifferAsMapStrategy<K, V> extends AbstractContainerDifferStrategy<Map<K, Collection<V>>, K> { public MultimapDifferAsMapStrategy(ItemContentComparisonStrategy itemContentComparisonStrategy) { super(itemContentComparisonStrategy); } @Override protected Accessor createItemAccessor(K key) { return new MultimapValueByKeyAccessor<K>(key); } @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public Map<K, Collection<V>> toContainer(Object object) { if (object == null) { return null; } else if (object instanceof Multimap) { return ((Multimap)object).asMap(); } else { throw new IllegalArgumentException("This differ only supports Maps and Multimaps."); } } @Override public Set<K> difference(Map<K, Collection<V>> source, Map<K, Collection<V>> filter) { final Set<K> copy = Sets.newLinkedHashSet(); if (source != null) { if (filter != null) { copy.addAll(Sets.difference(source.keySet(), filter.keySet())); } else { copy.addAll(source.keySet()); } } return copy; } @Override public Set<K> intersection(Map<K, Collection<V>> source, Map<K, Collection<V>> filter) { final Set<K> copy = Sets.newLinkedHashSet(); if (source != null && filter != null) { copy.addAll(Sets.intersection(source.keySet(), filter.keySet())); } return copy; } }