2222import de .danielbechler .diff .circular .CircularReferenceService ;
2323import de .danielbechler .diff .comparison .ComparisonConfigurer ;
2424import de .danielbechler .diff .comparison .ComparisonService ;
25+ import de .danielbechler .diff .comparison .ComparisonStrategy ;
26+ import de .danielbechler .diff .comparison .PrimitiveDefaultValueMode ;
2527import de .danielbechler .diff .differ .BeanDiffer ;
2628import de .danielbechler .diff .differ .CollectionDiffer ;
29+ import de .danielbechler .diff .differ .DifferConfigurer ;
2730import de .danielbechler .diff .differ .DifferDispatcher ;
31+ import de .danielbechler .diff .differ .DifferFactory ;
2832import de .danielbechler .diff .differ .DifferProvider ;
2933import de .danielbechler .diff .differ .MapDiffer ;
3034import de .danielbechler .diff .differ .PrimitiveDiffer ;
3438import de .danielbechler .diff .inclusion .InclusionService ;
3539import de .danielbechler .diff .introspection .IntrospectionConfigurer ;
3640import de .danielbechler .diff .introspection .IntrospectionService ;
41+ import de .danielbechler .diff .introspection .Introspector ;
42+ import de .danielbechler .diff .node .DiffNode ;
43+
44+ import java .util .ArrayList ;
45+ import java .util .Collection ;
46+ import java .util .Set ;
3747
3848/**
3949 * This is the entry point of every diffing operation. It acts as a factory to get hold of an actual {@link
@@ -50,6 +60,9 @@ public class ObjectDifferBuilder
5060 private final ComparisonService comparisonService = new ComparisonService (this );
5161 private final ReturnableNodeService returnableNodeService = new ReturnableNodeService (this );
5262 private final CircularReferenceService circularReferenceService = new CircularReferenceService (this );
63+ private final DifferConfigurer differConfigurer = new DifferConfigurerImpl ();
64+ private final NodeQueryService nodeQueryService = new NodeQueryServiceImpl ();
65+ private final Collection <DifferFactory > differFactories = new ArrayList <DifferFactory >();
5366
5467 private ObjectDifferBuilder ()
5568 {
@@ -63,11 +76,20 @@ public static ObjectDiffer buildDefault()
6376 public ObjectDiffer build ()
6477 {
6578 final DifferProvider differProvider = new DifferProvider ();
66- final DifferDispatcher differDispatcher = new DifferDispatcher (differProvider , circularReferenceService , circularReferenceService , inclusionService , returnableNodeService );
79+ final DifferDispatcher differDispatcher = new DifferDispatcher (
80+ differProvider ,
81+ circularReferenceService ,
82+ circularReferenceService ,
83+ inclusionService ,
84+ returnableNodeService );
6785 differProvider .push (new BeanDiffer (differDispatcher , introspectionService , returnableNodeService , comparisonService , introspectionService ));
6886 differProvider .push (new CollectionDiffer (differDispatcher , comparisonService ));
6987 differProvider .push (new MapDiffer (differDispatcher , comparisonService ));
7088 differProvider .push (new PrimitiveDiffer (comparisonService ));
89+ for (final DifferFactory differFactory : differFactories )
90+ {
91+ differProvider .push (differFactory .createDiffer (differDispatcher , nodeQueryService ));
92+ }
7193 return new ObjectDiffer (differDispatcher );
7294 }
7395
@@ -125,4 +147,57 @@ public CategoryConfigurer categories()
125147 {
126148 return categoryService ;
127149 }
150+
151+ public DifferConfigurer differs ()
152+ {
153+ return differConfigurer ;
154+ }
155+
156+ public class DifferConfigurerImpl implements DifferConfigurer
157+ {
158+ public ObjectDifferBuilder register (final DifferFactory differFactory )
159+ {
160+ differFactories .add (differFactory );
161+ return ObjectDifferBuilder .this ;
162+ }
163+
164+ }
165+
166+ private class NodeQueryServiceImpl implements NodeQueryService
167+ {
168+ public Set <String > resolveCategories (final DiffNode node )
169+ {
170+ return categoryService .resolveCategories (node );
171+ }
172+
173+ public Introspector introspectorForNode (final DiffNode node )
174+ {
175+ return introspectionService .introspectorForNode (node );
176+ }
177+
178+ public boolean isIntrospectable (final DiffNode node )
179+ {
180+ return introspectionService .isIntrospectable (node );
181+ }
182+
183+ public boolean isIgnored (final DiffNode node )
184+ {
185+ return inclusionService .isIgnored (node );
186+ }
187+
188+ public boolean isReturnable (final DiffNode node )
189+ {
190+ return returnableNodeService .isReturnable (node );
191+ }
192+
193+ public ComparisonStrategy resolveComparisonStrategy (final DiffNode node )
194+ {
195+ return comparisonService .resolveComparisonStrategy (node );
196+ }
197+
198+ public PrimitiveDefaultValueMode resolvePrimitiveDefaultValueMode (final DiffNode node )
199+ {
200+ return comparisonService .resolvePrimitiveDefaultValueMode (node );
201+ }
202+ }
128203}
0 commit comments