package fr.openwide.core.jpa.more.business.difference.differ.strategy;
import java.util.Collection;
import java.util.Map.Entry;
import com.google.common.base.Equivalence;
import com.google.common.collect.Multimap;
import de.danielbechler.diff.access.Accessor;
import fr.openwide.core.jpa.more.business.difference.access.MultimapEntryAccessor;
import fr.openwide.core.commons.util.collections.CollectionUtils;
public class MultimapDifferEntriesStrategy<K, V> extends AbstractContainerDifferStrategy<Multimap<K, V>, Entry<K, V>> {
private final Equivalence<? super Entry<K, V>> entryEquivalence;
public MultimapDifferEntriesStrategy(Equivalence<? super Entry<K, V>> entryEquivalence) {
super(ItemContentComparisonStrategy.shallow());
this.entryEquivalence = entryEquivalence;
}
@Override
protected Accessor createItemAccessor(Entry<K, V> entry) {
return new MultimapEntryAccessor<>(entry, entryEquivalence);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public Multimap<K, V> toContainer(Object object) {
if (object == null) {
return null;
} else if (object instanceof Multimap) {
return (Multimap)object;
} else {
throw new IllegalArgumentException("This differ only supports Maps and Multimaps.");
}
}
@Override
public Collection<Entry<K, V>> difference(Multimap<K, V> source, Multimap<K, V> filter) {
Collection<Entry<K, V>> sourceEntries = null;
Collection<Entry<K, V>> filterEntries = null;
if (source != null) {
sourceEntries = source.entries();
}
if (filter != null) {
filterEntries = filter.entries();
}
return CollectionUtils.difference(sourceEntries, filterEntries, entryEquivalence);
}
@Override
public Collection<Entry<K, V>> intersection(Multimap<K, V> source, Multimap<K, V> filter) {
Collection<Entry<K, V>> sourceEntries = null;
Collection<Entry<K, V>> filterEntries = null;
if (source != null) {
sourceEntries = source.entries();
}
if (filter != null) {
filterEntries = filter.entries();
}
return CollectionUtils.intersection(sourceEntries, filterEntries, entryEquivalence);
}
}