1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.github.tonywasher.joceanus.metis.field;
18
19 import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
20 import io.github.tonywasher.joceanus.metis.data.MetisDataDelta;
21 import io.github.tonywasher.joceanus.metis.data.MetisDataDifference;
22 import io.github.tonywasher.joceanus.metis.data.MetisDataResource;
23
24 import java.util.Iterator;
25
26
27
28
29 public class MetisFieldVersionDelta
30 implements MetisFieldItem {
31
32
33
34 private static final MetisFieldSet<MetisFieldVersionDelta> FIELD_SET = MetisFieldSet.newFieldSet(MetisFieldVersionDelta.class);
35
36
37
38
39 static {
40 FIELD_SET.declareLocalField(MetisDataResource.DATA_VERSION, MetisFieldVersionDelta::getVersion);
41 }
42
43
44
45
46 private final MetisFieldVersionValues theOldSet;
47
48
49
50
51 private final MetisFieldVersionValues theNewSet;
52
53
54
55
56 private MetisFieldSet<MetisFieldVersionDelta> theLocalFields;
57
58
59
60
61
62
63
64 protected MetisFieldVersionDelta(final MetisFieldVersionValues pNew,
65 final MetisFieldVersionValues pOld) {
66
67 theOldSet = pOld;
68 theNewSet = pNew;
69 }
70
71
72
73
74
75
76 public int getVersion() {
77 return theOldSet.getVersion();
78 }
79
80 @Override
81 public String formatObject(final OceanusDataFormatter pFormatter) {
82
83 int myNumDiffs = theOldSet.isDeletion() == theNewSet.isDeletion()
84 ? 0
85 : 1;
86
87
88 final Iterator<MetisFieldDef> myIterator = getDataFieldSet().fieldIterator();
89 while (myIterator.hasNext()) {
90
91 final MetisFieldDef myField = myIterator.next();
92
93
94 if (!(myField instanceof MetisFieldVersionedDef)) {
95 continue;
96 }
97
98
99 final Object myObject = theOldSet.getValue(myField);
100 final MetisDataDifference myDifference = MetisDataDifference.difference(myObject, theNewSet.getValue(myField));
101
102
103 if (!myDifference.isIdentical()) {
104
105 myNumDiffs++;
106 }
107 }
108
109
110 return MetisFieldVersionDelta.class.getSimpleName()
111 + "("
112 + myNumDiffs
113 + ")";
114 }
115
116 @Override
117 public MetisFieldSetDef getDataFieldSet() {
118 if (theLocalFields == null) {
119 theLocalFields = buildLocalFieldSet();
120 }
121 return theLocalFields;
122 }
123
124
125
126
127
128
129 private MetisFieldSet<MetisFieldVersionDelta> buildLocalFieldSet() {
130
131 final MetisFieldItem myItem = theOldSet.getItem();
132 final MetisFieldSetDef myFields = myItem.getDataFieldSet();
133
134
135 final MetisFieldSet<MetisFieldVersionDelta> myLocal = MetisFieldSet.newFieldSet(this);
136
137
138 if (theOldSet.isDeletion() != theNewSet.isDeletion()) {
139
140 myLocal.declareLocalField(MetisDataResource.DATA_DELETED.getValue(), f -> new MetisDataDelta(theOldSet.isDeletion(), MetisDataDifference.DIFFERENT));
141 }
142
143
144 final Iterator<MetisFieldDef> myIterator = myFields.fieldIterator();
145 while (myIterator.hasNext()) {
146
147 final MetisFieldDef myField = myIterator.next();
148
149
150 if (!(myField instanceof MetisFieldVersionedDef)) {
151 continue;
152 }
153
154
155 final Object myObject = theOldSet.getValue(myField);
156 final MetisDataDifference myDifference = MetisDataDifference.difference(myObject, theNewSet.getValue(myField));
157
158
159 if (!myDifference.isIdentical()) {
160
161 myLocal.declareLocalField(myField.getFieldId(), f -> new MetisDataDelta(myObject, myDifference));
162 }
163 }
164
165
166 return myLocal;
167 }
168 }