Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 75362b5

Browse files
author
Gabor Nagy
committed
more elaborate patch
1 parent f925689 commit 75362b5

18 files changed

+555
-619
lines changed

‎src/integration-test/java/de/danielbechler/diff/identity/IdentityStrategyConfigIT.groovy‎

Lines changed: 5 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package de.danielbechler.diff.identity
1818

1919
import de.danielbechler.diff.ObjectDifferBuilder
20+
import de.danielbechler.diff.comparison.IdentityStrategy
2021
import de.danielbechler.diff.node.DiffNode
2122
import de.danielbechler.diff.node.Visit
2223
import de.danielbechler.diff.path.NodePath
@@ -127,7 +128,7 @@ class IdentityStrategyConfigIT extends Specification {
127128
when:
128129
def node = ObjectDifferBuilder
129130
.startBuilding()
130-
.identity().ofTypeAndProperty(Product.class, "productVersions").toUse(codeIdentity).and()
131+
.comparison().ofCollectionItems(Product, "productVersions").toUse(codeIdentity).and()
131132
.filtering().returnNodesWithState(DiffNode.State.UNTOUCHED).and()
132133
.build().compare(working, base);
133134
then: "High level nodes"
@@ -148,39 +149,11 @@ class IdentityStrategyConfigIT extends Specification {
148149
.getChild(PV1CodeSelector).getChild("code").untouched
149150
}
150151

151-
@Unroll("OfType configuration WITH IdentityStrategy #aClazz")
152-
def 'OfType configuration WITH IdentityStrategy'() {
153-
when:
154-
def node = ObjectDifferBuilder
155-
.startBuilding()
156-
.identity().ofType(aClazz).toUse(codeIdentity).and()
157-
.filtering().returnNodesWithState(DiffNode.State.UNTOUCHED).and()
158-
.build().compare(working, base);
159-
then: "High level nodes"
160-
// print(node, working, base)
161-
node.getChild("otherMap").untouched
162-
node.getChild("productMap").changed
163-
node.getChild("productMap").getChild(new MapKeyElementSelector("PROD1")).changed
164-
node.getChild("productMap").getChild(new MapKeyElementSelector("PROD1")).getChild("productVersions").changed
165-
and: "ID1 and ID2 are CHANGED"
166-
node.getChild("productMap").getChild(new MapKeyElementSelector("PROD1")).getChild("productVersions")
167-
.getChild(PV1CodeSelector).changed
168-
node.getChild("productMap").getChild(new MapKeyElementSelector("PROD1")).getChild("productVersions")
169-
.getChild(PV1CodeSelector).changed
170-
and: "id changed, code untouched"
171-
node.getChild("productMap").getChild(new MapKeyElementSelector("PROD1")).getChild("productVersions")
172-
.getChild(PV1CodeSelector).getChild("id").changed
173-
node.getChild("productMap").getChild(new MapKeyElementSelector("PROD1")).getChild("productVersions")
174-
.getChild(PV1CodeSelector).getChild("code").untouched
175-
where:
176-
aClazz << [ProductVersion, CodeId]
177-
}
178-
179152
def 'OfNode configuration WITH IdentityStrategy'() {
180153
when:
181154
def node = ObjectDifferBuilder
182155
.startBuilding()
183-
.identity().ofNode(
156+
.comparison().ofCollectionItems(
184157
// this is not very useful without wildcards on maps and collections...
185158
NodePath.startBuilding().propertyName("productMap").mapKey("PROD1")
186159
.propertyName("productVersions").build()
@@ -254,8 +227,8 @@ class IdentityStrategyConfigIT extends Specification {
254227

255228
def codeIdentity = new IdentityStrategy() {
256229
@Override
257-
boolean equals(final Object _this, final Object o) {
258-
return Objects.equals(((CodeId) _this).getCode(), ((CodeId) o).getCode());
230+
boolean equals(final Object working, final Object base) {
231+
return Objects.equals(((CodeId) working).getCode(), ((CodeId) base).getCode());
259232
}
260233
}
261234

‎src/integration-test/java/de/danielbechler/diff/identity/IdentityStrategyIT.groovy‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package de.danielbechler.diff.identity
1818

1919
import de.danielbechler.diff.ObjectDifferBuilder
20+
import de.danielbechler.diff.comparison.IdentityStrategy
2021
import de.danielbechler.diff.node.DiffNode
2122
import de.danielbechler.diff.node.Visit
2223
import de.danielbechler.diff.path.NodePath
@@ -96,7 +97,7 @@ class IdentityStrategyIT extends Specification {
9697
when:
9798
def codeStrategy = new CodeIdentity();
9899
def diffNode = ObjectDifferBuilder.startBuilding()
99-
.identity().ofType(ArrayList) // TODO configuration shouldn't be like this!
100+
.comparison().ofCollectionItems(NodePath.withRoot()) // TODO configuration shouldn't be like this!
100101
.toUse(codeStrategy).and()
101102
.build().compare(list3, list1)
102103
then:
@@ -146,8 +147,8 @@ class IdentityStrategyIT extends Specification {
146147

147148
public static class CodeIdentity implements IdentityStrategy {
148149
@Override
149-
boolean equals(final Object _this, final Object o) {
150-
return Objects.equals(((A) _this).getCode(), ((A) o).getCode());
150+
boolean equals(final Object working, final Object base) {
151+
return Objects.equals(((A) working).getCode(), ((A) base).getCode());
151152
}
152153
}
153154
}

‎src/main/java/de/danielbechler/diff/ObjectDifferBuilder.java‎

Lines changed: 81 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,6 @@
1616

1717
package de.danielbechler.diff;
1818

19-
import java.util.ArrayList;
20-
import java.util.Collection;
21-
import java.util.Set;
22-
2319
import de.danielbechler.diff.category.CategoryConfigurer;
2420
import de.danielbechler.diff.category.CategoryService;
2521
import de.danielbechler.diff.circular.CircularReferenceConfigurer;
@@ -38,160 +34,174 @@
3834
import de.danielbechler.diff.differ.PrimitiveDiffer;
3935
import de.danielbechler.diff.filtering.FilteringConfigurer;
4036
import de.danielbechler.diff.filtering.ReturnableNodeService;
41-
import de.danielbechler.diff.identity.IdentityConfigurer;
42-
import de.danielbechler.diff.identity.IdentityService;
4337
import de.danielbechler.diff.inclusion.InclusionConfigurer;
4438
import de.danielbechler.diff.inclusion.InclusionService;
4539
import de.danielbechler.diff.introspection.IntrospectionConfigurer;
4640
import de.danielbechler.diff.introspection.IntrospectionService;
4741
import de.danielbechler.diff.node.DiffNode;
4842

43+
import java.util.ArrayList;
44+
import java.util.Collection;
45+
import java.util.Set;
46+
4947
/**
5048
* This is the entry point of every diffing operation. It acts as a factory to
5149
* get hold of an actual {@link ObjectDiffer} instance and exposes a
5250
* configuration API to customize its behavior to suit your needs.
5351
*
5452
* @author Daniel Bechler
5553
*/
56-
public class ObjectDifferBuilder {
57-
privatefinalIntrospectionServiceintrospectionService = newIntrospectionService(
58-
this);
54+
public class ObjectDifferBuilder
55+
{
56+
privatefinalIntrospectionServiceintrospectionService = newIntrospectionService(this);
5957
private final CategoryService categoryService = new CategoryService(this);
60-
private final InclusionService inclusionService = new InclusionService(
61-
categoryService, this);
62-
private final ComparisonService comparisonService = new ComparisonService(
63-
this);
64-
private final IdentityService identityService = new IdentityService(this);
65-
private final ReturnableNodeService returnableNodeService = new ReturnableNodeService(
66-
this);
67-
private final CircularReferenceService circularReferenceService = new CircularReferenceService(
68-
this);
58+
private final InclusionService inclusionService = new InclusionService(categoryService, this);
59+
private final ComparisonService comparisonService = new ComparisonService(this);
60+
private final ReturnableNodeService returnableNodeService = new ReturnableNodeService(this);
61+
private final CircularReferenceService circularReferenceService = new CircularReferenceService(this);
6962
private final DifferConfigurer differConfigurer = new DifferConfigurerImpl();
7063
private final NodeQueryService nodeQueryService = new NodeQueryServiceImpl();
7164
private final Collection<DifferFactory> differFactories = new ArrayList<DifferFactory>();
7265

73-
private ObjectDifferBuilder() {
74-
}
75-
76-
public static ObjectDiffer buildDefault() {
77-
return startBuilding().build();
78-
}
79-
80-
public ObjectDiffer build() {
81-
final DifferProvider differProvider = new DifferProvider();
82-
final DifferDispatcher differDispatcher = new DifferDispatcher(
83-
differProvider, circularReferenceService,
84-
circularReferenceService, inclusionService,
85-
returnableNodeService, introspectionService);
86-
differProvider.push(new BeanDiffer(differDispatcher,
87-
introspectionService, returnableNodeService, comparisonService,
88-
introspectionService));
89-
differProvider.push(new CollectionDiffer(differDispatcher,
90-
comparisonService, identityService));
91-
differProvider.push(new MapDiffer(differDispatcher, comparisonService));
92-
differProvider.push(new PrimitiveDiffer(comparisonService));
93-
for (final DifferFactory differFactory : differFactories) {
94-
differProvider.push(differFactory.createDiffer(differDispatcher,
95-
nodeQueryService));
96-
}
97-
return new ObjectDiffer(differDispatcher);
98-
}
99-
100-
public static ObjectDifferBuilder startBuilding() {
101-
return new ObjectDifferBuilder();
66+
private ObjectDifferBuilder()
67+
{
10268
}
10369

10470
/**
10571
* Allows to exclude nodes from being added to the object graph based on
10672
* criteria that are only known after the diff for the affected node and all
10773
* its children has been determined.
10874
*/
109-
public FilteringConfigurer filtering() {
75+
public FilteringConfigurer filtering()
76+
{
11077
return returnableNodeService;
11178
}
11279

11380
/**
11481
* Allows to replace the default bean introspector with a custom
11582
* implementation.
11683
*/
117-
public IntrospectionConfigurer introspection() {
84+
public IntrospectionConfigurer introspection()
85+
{
11886
return introspectionService;
11987
}
12088

12189
/**
12290
* Allows to define how the circular reference detector compares object
12391
* instances.
12492
*/
125-
public CircularReferenceConfigurer circularReferenceHandling() {
93+
public CircularReferenceConfigurer circularReferenceHandling()
94+
{
12695
return circularReferenceService;
12796
}
12897

12998
/**
13099
* Allows to in- or exclude nodes based on property name, object type,
131100
* category or location in the object graph.
132101
*/
133-
public InclusionConfigurer inclusion() {
102+
public InclusionConfigurer inclusion()
103+
{
134104
return inclusionService;
135105
}
136106

137107
/**
138108
* Allows to configure the way objects are compared.
139109
*/
140-
public ComparisonConfigurer comparison() {
110+
public ComparisonConfigurer comparison()
111+
{
141112
return comparisonService;
142113
}
143114

144-
/**
145-
* Allows to configure the way objects identities are established when
146-
* comparing collections by CollectionDiffer.
147-
*/
148-
public IdentityConfigurer identity() {
149-
return identityService;
150-
}
151-
152115
/**
153116
* Allows to assign custom categories (or tags) to entire types or selected
154117
* elements and properties.
155118
*/
156-
public CategoryConfigurer categories() {
119+
public CategoryConfigurer categories()
120+
{
157121
return categoryService;
158122
}
159123

160-
public DifferConfigurer differs() {
124+
public DifferConfigurer differs()
125+
{
161126
return differConfigurer;
162127
}
163128

164-
public class DifferConfigurerImpl implements DifferConfigurer {
165-
public ObjectDifferBuilder register(final DifferFactory differFactory) {
129+
public static ObjectDiffer buildDefault()
130+
{
131+
return startBuilding().build();
132+
}
133+
134+
public ObjectDiffer build()
135+
{
136+
final DifferProvider differProvider = new DifferProvider();
137+
final DifferDispatcher differDispatcher = new DifferDispatcher(
138+
differProvider,
139+
circularReferenceService,
140+
circularReferenceService,
141+
inclusionService,
142+
returnableNodeService,
143+
introspectionService);
144+
differProvider.push(new BeanDiffer(
145+
differDispatcher,
146+
introspectionService,
147+
returnableNodeService,
148+
comparisonService,
149+
introspectionService));
150+
differProvider.push(new CollectionDiffer(differDispatcher, comparisonService, comparisonService));
151+
differProvider.push(new MapDiffer(differDispatcher, comparisonService));
152+
differProvider.push(new PrimitiveDiffer(comparisonService));
153+
for (final DifferFactory differFactory : differFactories)
154+
{
155+
differProvider.push(differFactory.createDiffer(differDispatcher, nodeQueryService));
156+
}
157+
return new ObjectDiffer(differDispatcher);
158+
}
159+
160+
public static ObjectDifferBuilder startBuilding()
161+
{
162+
return new ObjectDifferBuilder();
163+
}
164+
165+
public class DifferConfigurerImpl implements DifferConfigurer
166+
{
167+
public ObjectDifferBuilder register(final DifferFactory differFactory)
168+
{
166169
differFactories.add(differFactory);
167170
return ObjectDifferBuilder.this;
168171
}
169172

170173
}
171174

172-
private class NodeQueryServiceImpl implements NodeQueryService {
173-
public Set<String> resolveCategories(final DiffNode node) {
175+
private class NodeQueryServiceImpl implements NodeQueryService
176+
{
177+
public Set<String> resolveCategories(final DiffNode node)
178+
{
174179
return categoryService.resolveCategories(node);
175180
}
176181

177-
public boolean isIntrospectable(final DiffNode node) {
182+
public boolean isIntrospectable(final DiffNode node)
183+
{
178184
return introspectionService.isIntrospectable(node);
179185
}
180186

181-
public boolean isIgnored(final DiffNode node) {
187+
public boolean isIgnored(final DiffNode node)
188+
{
182189
return inclusionService.isIgnored(node);
183190
}
184191

185-
public boolean isReturnable(final DiffNode node) {
192+
public boolean isReturnable(final DiffNode node)
193+
{
186194
return returnableNodeService.isReturnable(node);
187195
}
188196

189-
public ComparisonStrategy resolveComparisonStrategy(final DiffNode node) {
197+
public ComparisonStrategy resolveComparisonStrategy(final DiffNode node)
198+
{
190199
return comparisonService.resolveComparisonStrategy(node);
191200
}
192201

193202
public PrimitiveDefaultValueMode resolvePrimitiveDefaultValueMode(
194-
final DiffNode node) {
203+
final DiffNode node)
204+
{
195205
return comparisonService.resolvePrimitiveDefaultValueMode(node);
196206
}
197207
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /