diff --git a/src/integration-test/java/de/danielbechler/diff/identity/IdentityStrategyAT.groovy b/src/integration-test/java/de/danielbechler/diff/identity/IdentityStrategyAT.groovy index dd2cb23c..dd07456e 100644 --- a/src/integration-test/java/de/danielbechler/diff/identity/IdentityStrategyAT.groovy +++ b/src/integration-test/java/de/danielbechler/diff/identity/IdentityStrategyAT.groovy @@ -65,4 +65,23 @@ class IdentityStrategyAT extends Specification { then: node.untouched } + + def 'configure custom IdentityStrategyResolver'() { + given: + def strategy = new IdentityStrategy() { + + boolean equals(Object working, Object base) { + return working.getAt('id') == base.getAt('id') + } + } + def objectDiffer = ObjectDifferBuilder.startBuilding() + .identity() + .setDefaultCollectionItemIdentityStrategy(strategy) + .and() + .build() + when: + def node = objectDiffer.compare([[id: '1', value: 'original']], [[id: '1', value: 'changed']]) + then: + node.getChild(NodePath.startBuilding().collectionItem([id:'1']).build()).changed + } } diff --git a/src/main/java/de/danielbechler/diff/identity/CollectionItemIdentityService.java b/src/main/java/de/danielbechler/diff/identity/CollectionItemIdentityService.java index 8db8320d..75484b4f 100644 --- a/src/main/java/de/danielbechler/diff/identity/CollectionItemIdentityService.java +++ b/src/main/java/de/danielbechler/diff/identity/CollectionItemIdentityService.java @@ -19,14 +19,16 @@ import de.danielbechler.diff.inclusion.ValueNode; import de.danielbechler.diff.node.DiffNode; import de.danielbechler.diff.path.NodePath; +import de.danielbechler.util.Assert; class CollectionItemIdentityService implements IdentityStrategyResolver { private final ValueNode nodePathIdentityStrategies; private final TypePropertyIdentityStrategyResolver typePropertyIdentityStrategyResolver; private final IdentityConfigurer identityConfigurer; + private IdentityStrategy defaultIdentityStrategy = EqualsIdentityStrategy.getInstance(); - public CollectionItemIdentityService(final IdentityConfigurer identityConfigurer) + CollectionItemIdentityService(final IdentityConfigurer identityConfigurer) { this.identityConfigurer = identityConfigurer; this.nodePathIdentityStrategies = new ValueNode(); @@ -45,24 +47,31 @@ public IdentityStrategy resolveIdentityStrategy(final DiffNode node) { return identityStrategy; } - return EqualsIdentityStrategy.getInstance(); + return defaultIdentityStrategy; } - public IdentityConfigurer.OfCollectionItems ofCollectionItems(final NodePath nodePath) + IdentityConfigurer.OfCollectionItems ofCollectionItems(final NodePath nodePath) { return new OfCollectionItemsByNodePath(nodePath); } - public IdentityConfigurer.OfCollectionItems ofCollectionItems(final Class type, final String propertyName) + IdentityConfigurer.OfCollectionItems ofCollectionItems(final Class type, final String propertyName) { return new OfCollectionItemsByTypeProperty(type, propertyName); } + IdentityConfigurer setDefaultIdentityStrategy(final IdentityStrategy identityStrategy) + { + Assert.notNull(identityStrategy, "identityStrategy"); + this.defaultIdentityStrategy = identityStrategy; + return identityConfigurer; + } + private class OfCollectionItemsByNodePath implements IdentityConfigurer.OfCollectionItems { private final NodePath nodePath; - public OfCollectionItemsByNodePath(final NodePath nodePath) + OfCollectionItemsByNodePath(final NodePath nodePath) { this.nodePath = nodePath; } @@ -79,7 +88,7 @@ private class OfCollectionItemsByTypeProperty implements IdentityConfigurer.OfCo private final Class type; private final String propertyName; - public OfCollectionItemsByTypeProperty(final Class type, final String propertyName) + OfCollectionItemsByTypeProperty(final Class type, final String propertyName) { this.type = type; this.propertyName = propertyName; diff --git a/src/main/java/de/danielbechler/diff/identity/IdentityConfigurer.java b/src/main/java/de/danielbechler/diff/identity/IdentityConfigurer.java index 4b4e8dea..bd92d203 100644 --- a/src/main/java/de/danielbechler/diff/identity/IdentityConfigurer.java +++ b/src/main/java/de/danielbechler/diff/identity/IdentityConfigurer.java @@ -31,6 +31,8 @@ public interface IdentityConfigurer */ OfCollectionItems ofCollectionItems(Class type, String propertyName); + IdentityConfigurer setDefaultCollectionItemIdentityStrategy(IdentityStrategy identityStrategy); + ObjectDifferBuilder and(); interface OfCollectionItems diff --git a/src/main/java/de/danielbechler/diff/identity/IdentityService.java b/src/main/java/de/danielbechler/diff/identity/IdentityService.java index 875673c9..cc0f7bc6 100644 --- a/src/main/java/de/danielbechler/diff/identity/IdentityService.java +++ b/src/main/java/de/danielbechler/diff/identity/IdentityService.java @@ -40,6 +40,11 @@ public OfCollectionItems ofCollectionItems(final Class type, final String pro return collectionItemIdentityService.ofCollectionItems(type, propertyName); } + public IdentityConfigurer setDefaultCollectionItemIdentityStrategy(final IdentityStrategy identityStrategy) + { + return collectionItemIdentityService.setDefaultIdentityStrategy(identityStrategy); + } + public IdentityStrategy resolveIdentityStrategy(final DiffNode node) { return collectionItemIdentityService.resolveIdentityStrategy(node);