1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package io.github.tonywasher.joceanus.themis.solver.proj;
19
20 import io.github.tonywasher.joceanus.metis.data.MetisDataItem.MetisDataMap;
21 import io.github.tonywasher.joceanus.metis.field.MetisFieldItem;
22 import io.github.tonywasher.joceanus.metis.field.MetisFieldSet;
23 import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
24 import io.github.tonywasher.joceanus.themis.parser.base.ThemisDataResource;
25 import io.github.tonywasher.joceanus.themis.solver.proj.ThemisSolverDef.ThemisSolverPackageDef;
26 import io.github.tonywasher.joceanus.themis.solver.proj.ThemisSolverReference.ThemisSolverRefPackage;
27
28 import java.util.ArrayList;
29 import java.util.HashMap;
30 import java.util.List;
31 import java.util.Map;
32
33
34
35
36 public class ThemisSolverReference
37 implements MetisDataMap<ThemisSolverPackageDef, ThemisSolverRefPackage> {
38
39
40
41
42 private final Map<ThemisSolverPackageDef, ThemisSolverRefPackage> theMap;
43
44
45
46
47 public ThemisSolverReference() {
48 theMap = new HashMap<>();
49 }
50
51
52
53
54
55
56
57 public ThemisSolverRefPackage getReferences(final ThemisSolverPackageDef pPackage) {
58 return theMap.get(pPackage);
59 }
60
61
62
63
64
65
66
67 public ThemisSolverRefPackage getReferredPackage(final ThemisSolverPackageDef pPackage) {
68 return theMap.get(pPackage);
69 }
70
71
72
73
74
75
76 public void addReferences(final ThemisSolverRefPackage pReferences) {
77 final ThemisSolverPackageDef myPackage = pReferences.getPackage();
78 theMap.put(myPackage, pReferences);
79 }
80
81
82
83
84
85
86
87 public boolean lackingReferences(final ThemisRefType pRefType) {
88 return getReferences(pRefType).isEmpty();
89 }
90
91
92
93
94
95
96
97 public List<ThemisSolverRefPackage> getReferences(final ThemisRefType pRefType) {
98 return theMap.values().stream().filter(p -> p.getReferenceType() == pRefType).toList();
99 }
100
101 @Override
102 public Map<ThemisSolverPackageDef, ThemisSolverRefPackage> getUnderlyingMap() {
103 return theMap;
104 }
105
106 @Override
107 public String formatObject(final OceanusDataFormatter pFormatter) {
108 return getClass().getSimpleName();
109 }
110
111
112
113
114 public static class ThemisSolverRefPackage
115 implements MetisFieldItem {
116
117
118
119 private static final MetisFieldSet<ThemisSolverRefPackage> FIELD_DEFS = MetisFieldSet.newFieldSet(ThemisSolverRefPackage.class);
120
121
122
123
124 static {
125 FIELD_DEFS.declareLocalField(ThemisDataResource.DATA_REFTYPE, ThemisSolverRefPackage::getReferenceType);
126 FIELD_DEFS.declareLocalField(ThemisDataResource.DATA_REFERENCES, ThemisSolverRefPackage::getReferences);
127 }
128
129
130
131
132 private final ThemisSolverPackageDef thePackage;
133
134
135
136
137 private final ThemisRefType theRefType;
138
139
140
141
142 private final List<ThemisSolverRefClass> theReferences;
143
144
145
146
147
148
149
150 public ThemisSolverRefPackage(final ThemisSolverPackageDef pPackage,
151 final ThemisRefType pRefType) {
152 thePackage = pPackage;
153 theRefType = pRefType;
154 theReferences = new ArrayList<>();
155 }
156
157 @Override
158 public MetisFieldSet<ThemisSolverRefPackage> getDataFieldSet() {
159 return FIELD_DEFS;
160 }
161
162 @Override
163 public String formatObject(final OceanusDataFormatter pFormatter) {
164 return toString();
165 }
166
167
168
169
170
171
172 public ThemisSolverPackageDef getPackage() {
173 return thePackage;
174 }
175
176
177
178
179
180
181 public ThemisRefType getReferenceType() {
182 return theRefType;
183 }
184
185
186
187
188
189
190 public List<ThemisSolverRefClass> getReferences() {
191 return theReferences;
192 }
193
194
195
196
197
198
199 public void addReferences(final ThemisSolverRefClass pReferences) {
200 theReferences.add(pReferences);
201 }
202
203 @Override
204 public String toString() {
205 return thePackage.toString();
206 }
207 }
208
209
210
211
212 public static class ThemisSolverRefClass
213 implements MetisFieldItem {
214
215
216
217 private static final MetisFieldSet<ThemisSolverRefClass> FIELD_DEFS = MetisFieldSet.newFieldSet(ThemisSolverRefClass.class);
218
219
220
221
222 static {
223 FIELD_DEFS.declareLocalField(ThemisDataResource.DATA_CLASS, ThemisSolverRefClass::getSubject);
224 FIELD_DEFS.declareLocalField(ThemisDataResource.DATA_REFERENCES, ThemisSolverRefClass::getReferences);
225 }
226
227
228
229
230 private final ThemisSolverClass theClass;
231
232
233
234
235 private final List<ThemisSolverClass> theReferences;
236
237
238
239
240
241
242
243 public ThemisSolverRefClass(final ThemisSolverClass pClass,
244 final List<ThemisSolverClass> pReferences) {
245 theClass = pClass;
246 theReferences = pReferences;
247 }
248
249 @Override
250 public MetisFieldSet<ThemisSolverRefClass> getDataFieldSet() {
251 return FIELD_DEFS;
252 }
253
254 @Override
255 public String formatObject(final OceanusDataFormatter pFormatter) {
256 return toString();
257 }
258
259
260
261
262
263
264 public ThemisSolverClass getSubject() {
265 return theClass;
266 }
267
268
269
270
271
272
273 public List<ThemisSolverClass> getReferences() {
274 return theReferences;
275 }
276
277 @Override
278 public String toString() {
279 return theClass.getFullName();
280 }
281 }
282
283
284
285
286 public enum ThemisRefType {
287
288
289
290 SIBLING,
291
292
293
294
295 CHILD,
296
297
298
299
300 PARENT;
301 }
302 }