package fr.openwide.core.jpa.more.business.difference.differ.strategy; import java.util.Collection; import com.google.common.base.Equivalence; import com.google.common.base.Function; import com.google.common.collect.Collections2; import de.danielbechler.diff.access.Accessor; import fr.openwide.core.jpa.more.business.difference.access.CollectionItemByKeyAccessor; import fr.openwide.core.commons.util.collections.CollectionUtils; public final class CollectionDifferKeyStrategy<T, K> extends AbstractCollectionDifferStrategy<T, K> { private final Function<? super T, ? extends K> keyFunction; private final Equivalence<? super K> keyEquivalence; private final Function<? super K, String> toStringFunction; public CollectionDifferKeyStrategy(ItemContentComparisonStrategy itemContentComparisonStrategy, Function<? super T, ? extends K> keyFunction, Equivalence<? super K> keyEquivalence, Function<? super K, String> toStringFunction) { super(itemContentComparisonStrategy); this.keyFunction = keyFunction; this.keyEquivalence = keyEquivalence; this.toStringFunction = toStringFunction; } @Override protected Accessor createItemAccessor(K key) { return new CollectionItemByKeyAccessor<T, K>(key, keyFunction, keyEquivalence, toStringFunction.apply(key)); } @Override public Iterable<K> difference(Collection<T> source, Collection<T> filter) { return CollectionUtils.difference( source == null ? null : Collections2.transform(source, keyFunction), filter == null ? null : Collections2.transform(filter, keyFunction), keyEquivalence ); } @Override public Iterable<K> intersection(Collection<T> source, Collection<T> filter) { return CollectionUtils.intersection( source == null ? null : Collections2.transform(source, keyFunction), filter == null ? null : Collections2.transform(filter, keyFunction), keyEquivalence ); } }