package fr.openwide.core.jpa.more.business.difference.differ.strategy; import de.danielbechler.diff.access.Accessor; import de.danielbechler.diff.access.Instances; import de.danielbechler.diff.differ.DifferDispatcher; import de.danielbechler.diff.filtering.IsReturnableResolver; import de.danielbechler.diff.node.DiffNode; public abstract class AbstractContainerDifferStrategy<TContainer, K> { private final ItemContentComparisonStrategy itemContentComparisonStrategy; public AbstractContainerDifferStrategy(ItemContentComparisonStrategy itemContentComparisonStrategy) { super(); this.itemContentComparisonStrategy = itemContentComparisonStrategy; } protected abstract Accessor createItemAccessor(K key); public abstract TContainer toContainer(Object object); public void compareKeys(DifferDispatcher differDispatcher, IsReturnableResolver isReturnableResolver, final DiffNode parentNode, final Instances parentInstances, final Iterable<K> keys) { for (final K key : keys) { final Accessor itemAccessor = createItemAccessor(key); doCompareItems(differDispatcher, isReturnableResolver, parentNode, parentInstances, itemAccessor); } } public void compareItems(DifferDispatcher differDispatcher, IsReturnableResolver isReturnableResolver, final DiffNode parentNode, final Instances parentInstances, final TContainer elements) { for (final K key : difference(elements, null)) { final Accessor itemAccessor = createItemAccessor(key); doCompareItems(differDispatcher, isReturnableResolver, parentNode, parentInstances, itemAccessor); } } private void doCompareItems(DifferDispatcher differDispatcher, IsReturnableResolver isReturnableResolver, DiffNode parentNode, Instances parentInstances, Accessor itemAccessor) { itemContentComparisonStrategy.compareItem(differDispatcher, isReturnableResolver, parentNode, parentInstances, itemAccessor); } public abstract Iterable<K> difference(TContainer source, TContainer filter); public abstract Iterable<K> intersection(TContainer source, TContainer filter); }