1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.github.tonywasher.joceanus.prometheus.data;
18
19 import io.github.tonywasher.joceanus.oceanus.base.OceanusException;
20 import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
21 import io.github.tonywasher.joceanus.metis.data.MetisDataDifference;
22 import io.github.tonywasher.joceanus.metis.data.MetisDataItem.MetisDataFieldId;
23 import io.github.tonywasher.joceanus.metis.field.MetisFieldSet;
24 import io.github.tonywasher.joceanus.metis.field.MetisFieldVersionedSet;
25 import io.github.tonywasher.joceanus.metis.list.MetisListKey;
26 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataKeySet.PrometheusDataKeySetList;
27 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataSet.PrometheusCryptographyDataType;
28 import io.github.tonywasher.joceanus.tethys.api.thread.TethysUIThreadStatusReport;
29
30 import java.util.Iterator;
31
32
33
34
35
36
37 public abstract class PrometheusEncryptedDataItem
38 extends PrometheusDataItem {
39
40
41
42 private static final PrometheusEncryptor NULL_ENCRYPTOR = new PrometheusEncryptor(new OceanusDataFormatter(), null);
43
44
45
46
47 private static final MetisFieldVersionedSet<PrometheusEncryptedDataItem> FIELD_DEFS = MetisFieldVersionedSet.newVersionedFieldSet(PrometheusEncryptedDataItem.class);
48
49
50
51
52 static {
53 FIELD_DEFS.declareLinkField(PrometheusCryptographyDataType.DATAKEYSET);
54 }
55
56
57
58
59
60
61
62
63 protected PrometheusEncryptedDataItem(final PrometheusEncryptedList<?> pList,
64 final Integer pId) {
65 super(pList, pId);
66 }
67
68
69
70
71
72
73
74 protected PrometheusEncryptedDataItem(final PrometheusEncryptedList<?> pList,
75 final PrometheusEncryptedDataItem pSource) {
76 super(pList, pSource);
77 }
78
79
80
81
82
83
84
85
86
87 protected PrometheusEncryptedDataItem(final PrometheusEncryptedList<?> pList,
88 final PrometheusDataValues pValues) throws OceanusException {
89 super(pList, pValues);
90
91
92 final Integer myId = pValues.getValue(PrometheusCryptographyDataType.DATAKEYSET, Integer.class);
93 if (myId != null) {
94 setDataKeySet(myId);
95 }
96 }
97
98 @Override
99 protected PrometheusEncryptedValues newVersionValues() {
100 return new PrometheusEncryptedValues(this);
101 }
102
103 @Override
104 public PrometheusEncryptedValues getValues() {
105 return (PrometheusEncryptedValues) super.getValues();
106 }
107
108 @Override
109 public PrometheusEncryptedValues getOriginalValues() {
110 return (PrometheusEncryptedValues) super.getOriginalValues();
111 }
112
113
114
115
116
117
118 public final PrometheusDataKeySet getDataKeySet() {
119 return getValues().getValue(PrometheusCryptographyDataType.DATAKEYSET, PrometheusDataKeySet.class);
120 }
121
122
123
124
125
126
127 public final Integer getDataKeySetId() {
128 final PrometheusDataKeySet mySet = getDataKeySet();
129 return (mySet == null)
130 ? null
131 : mySet.getIndexedId();
132 }
133
134
135
136
137
138
139 private void setValueDataKeySet(final PrometheusDataKeySet pSet) {
140 getValues().setUncheckedValue(PrometheusCryptographyDataType.DATAKEYSET, pSet);
141 }
142
143
144
145
146
147
148 private void setValueDataKeySet(final Integer pId) {
149 getValues().setUncheckedValue(PrometheusCryptographyDataType.DATAKEYSET, pId);
150 }
151
152
153
154
155
156
157 public PrometheusEncryptor getEncryptor() {
158 final PrometheusDataKeySet myKeySet = getDataKeySet();
159 return myKeySet == null ? NULL_ENCRYPTOR : myKeySet.getEncryptor();
160 }
161
162 @Override
163 public PrometheusEncryptedList<?> getList() {
164 return (PrometheusEncryptedList<?>) super.getList();
165 }
166
167
168
169
170
171
172 protected final void setDataKeySet(final PrometheusDataKeySet pKeySet) {
173 setValueDataKeySet(pKeySet);
174 }
175
176
177
178
179 protected final void setNextDataKeySet() {
180 setDataKeySet(getList().getNextDataKeySet());
181 }
182
183
184
185
186
187
188
189 protected final void setDataKeySet(final Integer pKeySetId) throws OceanusException {
190
191 setValueDataKeySet(pKeySetId);
192
193
194 final PrometheusDataSet myData = getDataSet();
195 resolveDataLink(PrometheusCryptographyDataType.DATAKEYSET, myData.getDataKeySets());
196 }
197
198
199
200
201
202
203
204
205 protected final void setEncryptedValue(final MetisDataFieldId pFieldId,
206 final Object pValue) throws OceanusException {
207
208 final MetisFieldDef myFieldDef = getDataFieldSet().getField(pFieldId);
209 final PrometheusEncryptedValues myValueSet = getValues();
210 Object myCurrent = myValueSet.getValue(myFieldDef);
211
212
213 if (myCurrent != null && !(myCurrent instanceof PrometheusEncryptedPair)) {
214 myCurrent = null;
215 }
216
217
218 final PrometheusEncryptedPair myCurr = (PrometheusEncryptedPair) myCurrent;
219 final PrometheusEncryptedPair myField = getEncryptor().encryptValue(myCurr, pValue);
220
221
222 myValueSet.setUncheckedValue(myFieldDef, myField);
223 }
224
225
226
227
228
229
230
231
232 protected final void setEncryptedValue(final MetisDataFieldId pFieldId,
233 final byte[] pEncrypted) throws OceanusException {
234
235 final MetisFieldDef myFieldDef = getDataFieldSet().getField(pFieldId);
236 final PrometheusEncryptedPair myField = getEncryptor().decryptValue(pEncrypted, myFieldDef);
237
238
239 getValues().setValue(myFieldDef, myField);
240 }
241
242
243
244
245
246
247
248
249
250 protected final void setEncryptedValue(final MetisDataFieldId pFieldId,
251 final byte[] pEncrypted,
252 final Class<?> pClazz) throws OceanusException {
253
254 final MetisFieldDef myFieldDef = getDataFieldSet().getField(pFieldId);
255 final PrometheusEncryptedPair myField = getEncryptor().decryptValue(pEncrypted, pClazz);
256
257
258 getValues().setUncheckedValue(myFieldDef, myField);
259 }
260
261
262
263
264
265
266
267
268 public static MetisDataDifference getDifference(final PrometheusEncryptedPair pCurr,
269 final PrometheusEncryptedPair pNew) {
270
271 if (pCurr == null) {
272 return (pNew != null)
273 ? MetisDataDifference.DIFFERENT
274 : MetisDataDifference.IDENTICAL;
275 }
276
277
278 if (pNew == null) {
279 return MetisDataDifference.DIFFERENT;
280 }
281
282
283 return pCurr.differs(pNew);
284 }
285
286 @Override
287 public void resolveDataSetLinks() throws OceanusException {
288
289 final PrometheusDataSet myData = getDataSet();
290 resolveDataLink(PrometheusCryptographyDataType.DATAKEYSET, myData.getDataKeySets());
291 }
292
293
294
295
296
297
298
299
300 protected void adoptSecurity(final PrometheusDataKeySet pKeySet,
301 final PrometheusEncryptedDataItem pBase) throws OceanusException {
302
303 setValueDataKeySet(pKeySet);
304
305
306 final PrometheusEncryptedValues myBaseValues = pBase.getValues();
307
308
309 getValues().adoptSecurity(myBaseValues);
310 }
311
312
313
314
315
316
317
318 protected void initialiseSecurity(final PrometheusDataKeySet pKeySet) throws OceanusException {
319
320 setValueDataKeySet(pKeySet);
321
322
323 getValues().adoptSecurity(null);
324 }
325
326
327
328
329
330
331
332 protected void updateSecurity(final PrometheusDataKeySet pKeySet) throws OceanusException {
333
334 if (pKeySet.equals(getDataKeySet())) {
335 return;
336 }
337
338
339 pushHistory();
340
341
342 setDataKeySet(pKeySet);
343
344
345 getValues().updateSecurity();
346 }
347
348
349
350
351
352
353 public abstract static class PrometheusEncryptedList<T extends PrometheusEncryptedDataItem>
354 extends PrometheusDataList<T> {
355
356
357
358 static {
359 MetisFieldSet.newFieldSet(PrometheusEncryptedList.class);
360 }
361
362
363
364
365
366
367
368
369 protected PrometheusEncryptedList(final Class<T> pBaseClass,
370 final PrometheusDataSet pData,
371 final MetisListKey pItemType) {
372 this(pBaseClass, pData, pItemType, PrometheusListStyle.CORE);
373 }
374
375
376
377
378
379
380
381
382
383 protected PrometheusEncryptedList(final Class<T> pBaseClass,
384 final PrometheusDataSet pData,
385 final MetisListKey pItemType,
386 final PrometheusListStyle pStyle) {
387 super(pBaseClass, pData, pItemType, pStyle);
388 }
389
390
391
392
393
394
395 protected PrometheusEncryptedList(final PrometheusEncryptedList<T> pSource) {
396 super(pSource);
397 }
398
399
400
401
402
403
404 private PrometheusControlKey getControlKey() {
405 final PrometheusControlData myControl = getDataSet().getControl();
406 return (myControl == null)
407 ? null
408 : myControl.getControlKey();
409 }
410
411
412
413
414
415
416 private PrometheusDataKeySet getNextDataKeySet() {
417 final PrometheusControlKey myKey = getControlKey();
418 return (myKey == null)
419 ? null
420 : myKey.getNextDataKeySet();
421 }
422
423
424
425
426
427
428
429
430 public void updateSecurity(final TethysUIThreadStatusReport pReport,
431 final PrometheusControlKey pControl) throws OceanusException {
432
433 pReport.setNewStage(listName());
434
435
436 pReport.setNumSteps(size());
437
438
439 final Iterator<T> myIterator = iterator();
440 while (myIterator.hasNext()) {
441 final T myCurr = myIterator.next();
442
443
444 if (!pControl.equals(myCurr.getDataKeySet().getControlKey())) {
445
446 myCurr.updateSecurity(pControl.getNextDataKeySet());
447 }
448
449
450 pReport.setNextStep();
451 }
452 }
453
454
455
456
457
458
459
460
461
462 protected void adoptSecurity(final TethysUIThreadStatusReport pReport,
463 final PrometheusEncryptedList<?> pBase) throws OceanusException {
464
465 pReport.setNewStage(listName());
466
467
468 pReport.setNumSteps(size());
469
470
471 final PrometheusDataSet myData = getDataSet();
472 final PrometheusDataKeySetList mySets = myData.getDataKeySets();
473
474
475 final Iterator<T> myIterator = iterator();
476 final Class<T> myClass = getBaseClass();
477
478
479 while (myIterator.hasNext()) {
480
481 final PrometheusEncryptedDataItem myCurr = myIterator.next();
482 final PrometheusEncryptedDataItem myBase = pBase.findItemById(myCurr.getIndexedId());
483
484
485 final T myTarget = myClass.cast(myCurr);
486
487
488 if (myBase != null) {
489
490 final T mySource = myClass.cast(myBase);
491
492
493 PrometheusDataKeySet mySet = myBase.getDataKeySet();
494 mySet = mySets.findItemById(mySet.getIndexedId());
495
496
497 myTarget.adoptSecurity(mySet, mySource);
498 } else {
499
500 myTarget.initialiseSecurity(getNextDataKeySet());
501 }
502
503
504 pReport.setNextStep();
505 }
506 }
507 }
508 }