1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.lang3.builder;
18
19 import java.util.ArrayList;
20 import java.util.Arrays;
21 import java.util.List;
22 import java.util.Objects;
23
24 import org.apache.commons.lang3.ArrayUtils;
25 import org.apache.commons.lang3.ObjectUtils;
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 public class DiffBuilder<T> implements Builder<DiffResult<T>> {
72
73 private final List<Diff<?>> diffs;
74 private final boolean objectsTriviallyEqual;
75 private final T left;
76 private final T right;
77 private final ToStringStyle style;
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103 public DiffBuilder(final T lhs, final T rhs,
104 final ToStringStyle style) {
105
106 this(lhs, rhs, style, true);
107 }
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135 public DiffBuilder(final T lhs, final T rhs,
136 final ToStringStyle style, final boolean testTriviallyEqual) {
137
138 Objects.requireNonNull(lhs, "lhs");
139 Objects.requireNonNull(rhs, "rhs");
140
141 this.diffs = new ArrayList<>();
142 this.left = lhs;
143 this.right = rhs;
144 this.style = style;
145
146
147 this.objectsTriviallyEqual = testTriviallyEqual && Objects.equals(lhs, rhs);
148 }
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163 public DiffBuilder<T> append(final String fieldName, final boolean lhs,
164 final boolean rhs) {
165 validateFieldNameNotNull(fieldName);
166
167 if (objectsTriviallyEqual) {
168 return this;
169 }
170 if (lhs != rhs) {
171 diffs.add(new Diff<Boolean>(fieldName) {
172 private static final long serialVersionUID = 1L;
173
174 @Override
175 public Boolean getLeft() {
176 return Boolean.valueOf(lhs);
177 }
178
179 @Override
180 public Boolean getRight() {
181 return Boolean.valueOf(rhs);
182 }
183 });
184 }
185 return this;
186 }
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201 public DiffBuilder<T> append(final String fieldName, final boolean[] lhs,
202 final boolean[] rhs) {
203 validateFieldNameNotNull(fieldName);
204 if (objectsTriviallyEqual) {
205 return this;
206 }
207 if (!Arrays.equals(lhs, rhs)) {
208 diffs.add(new Diff<Boolean[]>(fieldName) {
209 private static final long serialVersionUID = 1L;
210
211 @Override
212 public Boolean[] getLeft() {
213 return ArrayUtils.toObject(lhs);
214 }
215
216 @Override
217 public Boolean[] getRight() {
218 return ArrayUtils.toObject(rhs);
219 }
220 });
221 }
222 return this;
223 }
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238 public DiffBuilder<T> append(final String fieldName, final byte lhs,
239 final byte rhs) {
240 validateFieldNameNotNull(fieldName);
241 if (objectsTriviallyEqual) {
242 return this;
243 }
244 if (lhs != rhs) {
245 diffs.add(new Diff<Byte>(fieldName) {
246 private static final long serialVersionUID = 1L;
247
248 @Override
249 public Byte getLeft() {
250 return Byte.valueOf(lhs);
251 }
252
253 @Override
254 public Byte getRight() {
255 return Byte.valueOf(rhs);
256 }
257 });
258 }
259 return this;
260 }
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275 public DiffBuilder<T> append(final String fieldName, final byte[] lhs,
276 final byte[] rhs) {
277 validateFieldNameNotNull(fieldName);
278
279 if (objectsTriviallyEqual) {
280 return this;
281 }
282 if (!Arrays.equals(lhs, rhs)) {
283 diffs.add(new Diff<Byte[]>(fieldName) {
284 private static final long serialVersionUID = 1L;
285
286 @Override
287 public Byte[] getLeft() {
288 return ArrayUtils.toObject(lhs);
289 }
290
291 @Override
292 public Byte[] getRight() {
293 return ArrayUtils.toObject(rhs);
294 }
295 });
296 }
297 return this;
298 }
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313 public DiffBuilder<T> append(final String fieldName, final char lhs,
314 final char rhs) {
315 validateFieldNameNotNull(fieldName);
316
317 if (objectsTriviallyEqual) {
318 return this;
319 }
320 if (lhs != rhs) {
321 diffs.add(new Diff<Character>(fieldName) {
322 private static final long serialVersionUID = 1L;
323
324 @Override
325 public Character getLeft() {
326 return Character.valueOf(lhs);
327 }
328
329 @Override
330 public Character getRight() {
331 return Character.valueOf(rhs);
332 }
333 });
334 }
335 return this;
336 }
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351 public DiffBuilder<T> append(final String fieldName, final char[] lhs,
352 final char[] rhs) {
353 validateFieldNameNotNull(fieldName);
354
355 if (objectsTriviallyEqual) {
356 return this;
357 }
358 if (!Arrays.equals(lhs, rhs)) {
359 diffs.add(new Diff<Character[]>(fieldName) {
360 private static final long serialVersionUID = 1L;
361
362 @Override
363 public Character[] getLeft() {
364 return ArrayUtils.toObject(lhs);
365 }
366
367 @Override
368 public Character[] getRight() {
369 return ArrayUtils.toObject(rhs);
370 }
371 });
372 }
373 return this;
374 }
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409 public DiffBuilder<T> append(final String fieldName, final DiffResult<T> diffResult) {
410 validateFieldNameNotNull(fieldName);
411 Objects.requireNonNull(diffResult, "diffResult");
412 if (objectsTriviallyEqual) {
413 return this;
414 }
415 diffResult.getDiffs().forEach(diff -> append(fieldName + "." + diff.getFieldName(), diff.getLeft(), diff.getRight()));
416 return this;
417 }
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432 public DiffBuilder<T> append(final String fieldName, final double lhs,
433 final double rhs) {
434 validateFieldNameNotNull(fieldName);
435
436 if (objectsTriviallyEqual) {
437 return this;
438 }
439 if (Double.doubleToLongBits(lhs) != Double.doubleToLongBits(rhs)) {
440 diffs.add(new Diff<Double>(fieldName) {
441 private static final long serialVersionUID = 1L;
442
443 @Override
444 public Double getLeft() {
445 return Double.valueOf(lhs);
446 }
447
448 @Override
449 public Double getRight() {
450 return Double.valueOf(rhs);
451 }
452 });
453 }
454 return this;
455 }
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470 public DiffBuilder<T> append(final String fieldName, final double[] lhs,
471 final double[] rhs) {
472 validateFieldNameNotNull(fieldName);
473
474 if (objectsTriviallyEqual) {
475 return this;
476 }
477 if (!Arrays.equals(lhs, rhs)) {
478 diffs.add(new Diff<Double[]>(fieldName) {
479 private static final long serialVersionUID = 1L;
480
481 @Override
482 public Double[] getLeft() {
483 return ArrayUtils.toObject(lhs);
484 }
485
486 @Override
487 public Double[] getRight() {
488 return ArrayUtils.toObject(rhs);
489 }
490 });
491 }
492 return this;
493 }
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508 public DiffBuilder<T> append(final String fieldName, final float lhs,
509 final float rhs) {
510 validateFieldNameNotNull(fieldName);
511
512 if (objectsTriviallyEqual) {
513 return this;
514 }
515 if (Float.floatToIntBits(lhs) != Float.floatToIntBits(rhs)) {
516 diffs.add(new Diff<Float>(fieldName) {
517 private static final long serialVersionUID = 1L;
518
519 @Override
520 public Float getLeft() {
521 return Float.valueOf(lhs);
522 }
523
524 @Override
525 public Float getRight() {
526 return Float.valueOf(rhs);
527 }
528 });
529 }
530 return this;
531 }
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546 public DiffBuilder<T> append(final String fieldName, final float[] lhs,
547 final float[] rhs) {
548 validateFieldNameNotNull(fieldName);
549
550 if (objectsTriviallyEqual) {
551 return this;
552 }
553 if (!Arrays.equals(lhs, rhs)) {
554 diffs.add(new Diff<Float[]>(fieldName) {
555 private static final long serialVersionUID = 1L;
556
557 @Override
558 public Float[] getLeft() {
559 return ArrayUtils.toObject(lhs);
560 }
561
562 @Override
563 public Float[] getRight() {
564 return ArrayUtils.toObject(rhs);
565 }
566 });
567 }
568 return this;
569 }
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584 public DiffBuilder<T> append(final String fieldName, final int lhs,
585 final int rhs) {
586 validateFieldNameNotNull(fieldName);
587
588 if (objectsTriviallyEqual) {
589 return this;
590 }
591 if (lhs != rhs) {
592 diffs.add(new Diff<Integer>(fieldName) {
593 private static final long serialVersionUID = 1L;
594
595 @Override
596 public Integer getLeft() {
597 return Integer.valueOf(lhs);
598 }
599
600 @Override
601 public Integer getRight() {
602 return Integer.valueOf(rhs);
603 }
604 });
605 }
606 return this;
607 }
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622 public DiffBuilder<T> append(final String fieldName, final int[] lhs,
623 final int[] rhs) {
624 validateFieldNameNotNull(fieldName);
625
626 if (objectsTriviallyEqual) {
627 return this;
628 }
629 if (!Arrays.equals(lhs, rhs)) {
630 diffs.add(new Diff<Integer[]>(fieldName) {
631 private static final long serialVersionUID = 1L;
632
633 @Override
634 public Integer[] getLeft() {
635 return ArrayUtils.toObject(lhs);
636 }
637
638 @Override
639 public Integer[] getRight() {
640 return ArrayUtils.toObject(rhs);
641 }
642 });
643 }
644 return this;
645 }
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660 public DiffBuilder<T> append(final String fieldName, final long lhs,
661 final long rhs) {
662 validateFieldNameNotNull(fieldName);
663
664 if (objectsTriviallyEqual) {
665 return this;
666 }
667 if (lhs != rhs) {
668 diffs.add(new Diff<Long>(fieldName) {
669 private static final long serialVersionUID = 1L;
670
671 @Override
672 public Long getLeft() {
673 return Long.valueOf(lhs);
674 }
675
676 @Override
677 public Long getRight() {
678 return Long.valueOf(rhs);
679 }
680 });
681 }
682 return this;
683 }
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698 public DiffBuilder<T> append(final String fieldName, final long[] lhs,
699 final long[] rhs) {
700 validateFieldNameNotNull(fieldName);
701
702 if (objectsTriviallyEqual) {
703 return this;
704 }
705 if (!Arrays.equals(lhs, rhs)) {
706 diffs.add(new Diff<Long[]>(fieldName) {
707 private static final long serialVersionUID = 1L;
708
709 @Override
710 public Long[] getLeft() {
711 return ArrayUtils.toObject(lhs);
712 }
713
714 @Override
715 public Long[] getRight() {
716 return ArrayUtils.toObject(rhs);
717 }
718 });
719 }
720 return this;
721 }
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736 public DiffBuilder<T> append(final String fieldName, final Object lhs,
737 final Object rhs) {
738 validateFieldNameNotNull(fieldName);
739 if (objectsTriviallyEqual) {
740 return this;
741 }
742 if (lhs == rhs) {
743 return this;
744 }
745
746 final Object objectToTest;
747 if (lhs != null) {
748 objectToTest = lhs;
749 } else {
750
751 objectToTest = rhs;
752 }
753
754 if (ObjectUtils.isArray(objectToTest)) {
755 if (objectToTest instanceof boolean[]) {
756 return append(fieldName, (boolean[]) lhs, (boolean[]) rhs);
757 }
758 if (objectToTest instanceof byte[]) {
759 return append(fieldName, (byte[]) lhs, (byte[]) rhs);
760 }
761 if (objectToTest instanceof char[]) {
762 return append(fieldName, (char[]) lhs, (char[]) rhs);
763 }
764 if (objectToTest instanceof double[]) {
765 return append(fieldName, (double[]) lhs, (double[]) rhs);
766 }
767 if (objectToTest instanceof float[]) {
768 return append(fieldName, (float[]) lhs, (float[]) rhs);
769 }
770 if (objectToTest instanceof int[]) {
771 return append(fieldName, (int[]) lhs, (int[]) rhs);
772 }
773 if (objectToTest instanceof long[]) {
774 return append(fieldName, (long[]) lhs, (long[]) rhs);
775 }
776 if (objectToTest instanceof short[]) {
777 return append(fieldName, (short[]) lhs, (short[]) rhs);
778 }
779
780 return append(fieldName, (Object[]) lhs, (Object[]) rhs);
781 }
782
783
784 if (Objects.equals(lhs, rhs)) {
785 return this;
786 }
787
788 diffs.add(new Diff<Object>(fieldName) {
789 private static final long serialVersionUID = 1L;
790
791 @Override
792 public Object getLeft() {
793 return lhs;
794 }
795
796 @Override
797 public Object getRight() {
798 return rhs;
799 }
800 });
801
802 return this;
803 }
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818 public DiffBuilder<T> append(final String fieldName, final Object[] lhs,
819 final Object[] rhs) {
820 validateFieldNameNotNull(fieldName);
821 if (objectsTriviallyEqual) {
822 return this;
823 }
824
825 if (!Arrays.equals(lhs, rhs)) {
826 diffs.add(new Diff<Object[]>(fieldName) {
827 private static final long serialVersionUID = 1L;
828
829 @Override
830 public Object[] getLeft() {
831 return lhs;
832 }
833
834 @Override
835 public Object[] getRight() {
836 return rhs;
837 }
838 });
839 }
840
841 return this;
842 }
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857 public DiffBuilder<T> append(final String fieldName, final short lhs,
858 final short rhs) {
859 validateFieldNameNotNull(fieldName);
860
861 if (objectsTriviallyEqual) {
862 return this;
863 }
864 if (lhs != rhs) {
865 diffs.add(new Diff<Short>(fieldName) {
866 private static final long serialVersionUID = 1L;
867
868 @Override
869 public Short getLeft() {
870 return Short.valueOf(lhs);
871 }
872
873 @Override
874 public Short getRight() {
875 return Short.valueOf(rhs);
876 }
877 });
878 }
879 return this;
880 }
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895 public DiffBuilder<T> append(final String fieldName, final short[] lhs,
896 final short[] rhs) {
897 validateFieldNameNotNull(fieldName);
898
899 if (objectsTriviallyEqual) {
900 return this;
901 }
902 if (!Arrays.equals(lhs, rhs)) {
903 diffs.add(new Diff<Short[]>(fieldName) {
904 private static final long serialVersionUID = 1L;
905
906 @Override
907 public Short[] getLeft() {
908 return ArrayUtils.toObject(lhs);
909 }
910
911 @Override
912 public Short[] getRight() {
913 return ArrayUtils.toObject(rhs);
914 }
915 });
916 }
917 return this;
918 }
919
920
921
922
923
924
925
926
927 @Override
928 public DiffResult<T> build() {
929 return new DiffResult<>(left, right, diffs, style);
930 }
931
932 private void validateFieldNameNotNull(final String fieldName) {
933 Objects.requireNonNull(fieldName, "fieldName");
934 }
935
936 }