package fr.openwide.core.jpa.more.business.difference.differ.strategy; import java.util.Collection; import com.google.common.collect.ContiguousSet; import com.google.common.collect.DiscreteDomain; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.common.collect.Range; import de.danielbechler.diff.access.Accessor; import fr.openwide.core.jpa.more.business.difference.access.CollectionItemByIndexAccessor; public final class CollectionDifferIndexStrategy<T> extends AbstractCollectionDifferStrategy<T, Integer> { public CollectionDifferIndexStrategy(ItemContentComparisonStrategy itemContentComparisonStrategy) { super(itemContentComparisonStrategy); } @Override protected Accessor createItemAccessor(Integer key) { return new CollectionItemByIndexAccessor<T>(key); } @Override public Iterable<Integer> difference(Collection<T> source, Collection<T> filter) { int sourceSize = source == null ? 0 : Iterables.size(source); int filterSize = filter == null ? 0 : Iterables.size(filter); if (sourceSize > filterSize) { return ContiguousSet.create(Range.closedOpen(filterSize, sourceSize), DiscreteDomain.integers()); } else { return ImmutableList.of(); } } @Override public Iterable<Integer> intersection(Collection<T> source, Collection<T> filter) { int sourceSize = source == null ? 0 : Iterables.size(source); int filterSize = filter == null ? 0 : Iterables.size(filter); return ContiguousSet.create(Range.closedOpen(0, Math.min(sourceSize, filterSize)), DiscreteDomain.integers()); } }