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;
import de.danielbechler.diff.node.DiffNode.State;
import de.danielbechler.util.Assert;
public abstract class ItemContentComparisonStrategy {
private static final ItemContentComparisonStrategy DEEP = new ItemContentComparisonStrategy() {
@Override
public DiffNode compareItem(DifferDispatcher differDispatcher, IsReturnableResolver isReturnableResolver,
DiffNode parentNode, Instances parentInstances, Accessor itemAccessor) {
return differDispatcher.dispatch(parentNode, parentInstances, itemAccessor);
}
};
public static ItemContentComparisonStrategy deep() {
return DEEP;
}
private static final ItemContentComparisonStrategy SHALLOW = new ItemContentComparisonStrategy() {
@Override
public DiffNode compareItem(DifferDispatcher differDispatcher, IsReturnableResolver isReturnableResolver, DiffNode parentNode,
Instances parentInstances, Accessor itemAccessor) {
Assert.notNull(parentInstances, "parentInstances");
Assert.notNull(itemAccessor, "accessor");
final DiffNode node = compare(parentNode, parentInstances, itemAccessor);
if (parentNode != null && isReturnableResolver.isReturnable(node)) {
parentNode.addChild(node);
}
return node;
}
private DiffNode compare(DiffNode parentNode, Instances parentInstances, Accessor itemAccessor) {
Instances instances = parentInstances.access(itemAccessor);
final DiffNode node = new DiffNode(parentNode, instances.getSourceAccessor(), instances.getType());
if (instances.hasBeenAdded()) {
node.setState(DiffNode.State.ADDED);
} else if (instances.hasBeenRemoved()) {
node.setState(DiffNode.State.REMOVED);
} else if (instances.areSame() || instances.areEqual()) {
node.setState(State.UNTOUCHED);
} else {
node.setState(State.CHANGED);
}
return node;
}
};
public static ItemContentComparisonStrategy shallow() {
return SHALLOW;
}
public abstract DiffNode compareItem(DifferDispatcher differDispatcher, IsReturnableResolver isReturnableResolver,
DiffNode parentNode, Instances parentInstances, Accessor itemAccessor);
}