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 ;
2725import de .danielbechler .diff .differ .BeanDiffer ;
2826import de .danielbechler .diff .differ .CollectionDiffer ;
27+ import de .danielbechler .diff .differ .Differ ;
2928import de .danielbechler .diff .differ .DifferConfigurer ;
3029import de .danielbechler .diff .differ .DifferDispatcher ;
3130import de .danielbechler .diff .differ .DifferFactory ;
3231import de .danielbechler .diff .differ .DifferProvider ;
32+ import de .danielbechler .diff .differ .DifferService ;
3333import de .danielbechler .diff .differ .MapDiffer ;
3434import de .danielbechler .diff .differ .PrimitiveDiffer ;
3535import de .danielbechler .diff .filtering .FilteringConfigurer ;
3939import de .danielbechler .diff .inclusion .InclusionService ;
4040import de .danielbechler .diff .introspection .IntrospectionConfigurer ;
4141import de .danielbechler .diff .introspection .IntrospectionService ;
42- import de .danielbechler .diff .node .DiffNode ;
4342
4443import java .util .ArrayList ;
4544import java .util .Collection ;
46- import java .util .Set ;
4745
4846/**
4947 * This is the entry point of every diffing operation. It acts as a factory to
@@ -61,12 +59,17 @@ public class ObjectDifferBuilder
6159 private final IdentityService identityService = new IdentityService (this );
6260 private final ReturnableNodeService returnableNodeService = new ReturnableNodeService (this );
6361 private final CircularReferenceService circularReferenceService = new CircularReferenceService (this );
64- private final DifferConfigurer differConfigurer = new DifferConfigurerImpl ();
65- private final NodeQueryService nodeQueryService = new NodeQueryServiceImpl ();
66- private final Collection <DifferFactory > differFactories = new ArrayList <DifferFactory >();
62+ private final DifferService differService = new DifferService (this );
63+ private final NodeQueryService nodeQueryService ;
6764
6865 private ObjectDifferBuilder ()
6966 {
67+ nodeQueryService = new DefaultNodeQueryService (categoryService ,
68+ introspectionService ,
69+ inclusionService ,
70+ returnableNodeService ,
71+ comparisonService ,
72+ comparisonService );
7073 }
7174
7275 /**
@@ -143,87 +146,76 @@ public CategoryConfigurer categories()
143146
144147 public DifferConfigurer differs ()
145148 {
146- return differConfigurer ;
149+ return differService ;
147150 }
148151
149152 public static ObjectDiffer buildDefault ()
150153 {
151154 return startBuilding ().build ();
152155 }
153156
157+ public static ObjectDifferBuilder startBuilding ()
158+ {
159+ return new ObjectDifferBuilder ();
160+ }
161+ 154162 public ObjectDiffer build ()
155163 {
156164 final DifferProvider differProvider = new DifferProvider ();
157- final DifferDispatcher differDispatcher = new DifferDispatcher (
165+ final DifferDispatcher differDispatcher = newDifferDispatcher (differProvider );
166+ differProvider .push (newBeanDiffer (differDispatcher ));
167+ differProvider .push (newCollectionDiffer (differDispatcher ));
168+ differProvider .push (newMapDiffer (differDispatcher ));
169+ differProvider .push (newPrimitiveDiffer ());
170+ differProvider .pushAll (createCustomDiffers (differDispatcher ));
171+ return new ObjectDiffer (differDispatcher );
172+ }
173+ 174+ private DifferDispatcher newDifferDispatcher (final DifferProvider differProvider )
175+ {
176+ return new DifferDispatcher (
158177 differProvider ,
159178 circularReferenceService ,
160179 circularReferenceService ,
161180 inclusionService ,
162181 returnableNodeService ,
163182 introspectionService ,
164183 categoryService );
165- differProvider .push (new BeanDiffer (
184+ }
185+ 186+ private Differ newBeanDiffer (final DifferDispatcher differDispatcher )
187+ {
188+ return new BeanDiffer (
166189 differDispatcher ,
167190 introspectionService ,
168191 returnableNodeService ,
169192 comparisonService ,
170- introspectionService ));
171- differProvider .push (new CollectionDiffer (differDispatcher , comparisonService , identityService ));
172- differProvider .push (new MapDiffer (differDispatcher , comparisonService ));
173- differProvider .push (new PrimitiveDiffer (comparisonService ));
174- for (final DifferFactory differFactory : differFactories )
175- {
176- differProvider .push (differFactory .createDiffer (differDispatcher , nodeQueryService ));
177- }
178- return new ObjectDiffer (differDispatcher );
193+ introspectionService );
179194 }
180195
181- public static ObjectDifferBuilder startBuilding ( )
196+ private Differ newCollectionDiffer ( final DifferDispatcher differDispatcher )
182197 {
183- return new ObjectDifferBuilder ( );
198+ return new CollectionDiffer ( differDispatcher , comparisonService , identityService );
184199 }
185200
186- public class DifferConfigurerImpl implements DifferConfigurer
201+ private Differ newMapDiffer ( final DifferDispatcher differDispatcher )
187202 {
188- public ObjectDifferBuilder register (final DifferFactory differFactory )
189- {
190- differFactories .add (differFactory );
191- return ObjectDifferBuilder .this ;
192- }
193- 203+ return new MapDiffer (differDispatcher , comparisonService );
194204 }
195205
196- private class NodeQueryServiceImpl implements NodeQueryService
206+ private Differ newPrimitiveDiffer ()
197207 {
198- public Set <String > resolveCategories (final DiffNode node )
199- {
200- return categoryService .resolveCategories (node );
201- }
202- 203- public boolean isIntrospectable (final DiffNode node )
204- {
205- return introspectionService .isIntrospectable (node );
206- }
207- 208- public boolean isIgnored (final DiffNode node )
209- {
210- return inclusionService .isIgnored (node );
211- }
212- 213- public boolean isReturnable (final DiffNode node )
214- {
215- return returnableNodeService .isReturnable (node );
216- }
217- 218- public ComparisonStrategy resolveComparisonStrategy (final DiffNode node )
219- {
220- return comparisonService .resolveComparisonStrategy (node );
221- }
208+ return new PrimitiveDiffer (comparisonService );
209+ }
222210
223- public PrimitiveDefaultValueMode resolvePrimitiveDefaultValueMode (
224- final DiffNode node )
211+ private Iterable <Differ > createCustomDiffers (final DifferDispatcher differDispatcher )
212+ {
213+ final Collection <DifferFactory > differFactories = differService .getDifferFactories ();
214+ final Collection <Differ > differs = new ArrayList <Differ >(differFactories .size ());
215+ for (final DifferFactory differFactory : differFactories )
225216 {
226- return comparisonService . resolvePrimitiveDefaultValueMode ( node );
217+ differs . add ( differFactory . createDiffer ( differDispatcher , nodeQueryService ) );
227218 }
219+ return differs ;
228220 }
229221}
0 commit comments