1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.github.tonywasher.joceanus.moneywise.data.basic;
18
19 import io.github.tonywasher.joceanus.metis.data.MetisDataDifference;
20 import io.github.tonywasher.joceanus.metis.data.MetisDataItem.MetisDataFieldId;
21 import io.github.tonywasher.joceanus.metis.data.MetisDataItem.MetisDataList;
22 import io.github.tonywasher.joceanus.metis.data.MetisDataResource;
23 import io.github.tonywasher.joceanus.metis.field.MetisFieldItem;
24 import io.github.tonywasher.joceanus.metis.field.MetisFieldSet;
25 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseSecurity.MoneyWiseSecurityList;
26 import io.github.tonywasher.joceanus.moneywise.exc.MoneyWiseDataException;
27 import io.github.tonywasher.joceanus.oceanus.base.OceanusException;
28 import io.github.tonywasher.joceanus.oceanus.date.OceanusDate;
29 import io.github.tonywasher.joceanus.oceanus.date.OceanusDateFormatter;
30 import io.github.tonywasher.joceanus.oceanus.date.OceanusDateRange;
31 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusPrice;
32 import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
33 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataInstanceMap;
34 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataItem;
35 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataMapItem;
36 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataSet;
37 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataValues;
38 import io.github.tonywasher.joceanus.prometheus.data.PrometheusEncryptedDataItem;
39 import io.github.tonywasher.joceanus.prometheus.data.PrometheusEncryptedFieldSet;
40 import io.github.tonywasher.joceanus.prometheus.data.PrometheusEncryptedPair;
41 import io.github.tonywasher.joceanus.prometheus.data.PrometheusEncryptedValues;
42 import io.github.tonywasher.joceanus.prometheus.data.PrometheusListStyle;
43 import io.github.tonywasher.joceanus.prometheus.views.PrometheusEditSet;
44
45 import java.util.ArrayList;
46 import java.util.Currency;
47 import java.util.HashMap;
48 import java.util.Iterator;
49 import java.util.List;
50 import java.util.ListIterator;
51 import java.util.Map;
52
53
54
55
56
57
58 public class MoneyWiseSecurityPrice
59 extends PrometheusEncryptedDataItem {
60
61
62
63 public static final String OBJECT_NAME = MoneyWiseBasicDataType.SECURITYPRICE.getItemName();
64
65
66
67
68 public static final String LIST_NAME = MoneyWiseBasicDataType.SECURITYPRICE.getListName();
69
70
71
72
73 private static final PrometheusEncryptedFieldSet<MoneyWiseSecurityPrice> FIELD_DEFS = PrometheusEncryptedFieldSet.newEncryptedFieldSet(MoneyWiseSecurityPrice.class);
74
75
76
77
78 static {
79 FIELD_DEFS.declareLinkField(MoneyWiseBasicDataType.SECURITY);
80 FIELD_DEFS.declareDateField(MoneyWiseBasicResource.MONEYWISEDATA_FIELD_DATE);
81 FIELD_DEFS.declareEncryptedPriceField(MoneyWiseBasicResource.MONEYWISEDATA_FIELD_PRICE);
82 }
83
84
85
86
87 public static final String ERROR_CURRENCY = MoneyWiseBasicResource.MONEYWISEDATA_ERROR_CURRENCY.getValue();
88
89
90
91
92
93
94
95 protected MoneyWiseSecurityPrice(final MoneyWiseSecurityPriceBaseList<? extends MoneyWiseSecurityPrice> pList,
96 final MoneyWiseSecurityPrice pPrice) {
97
98 super(pList, pPrice);
99 }
100
101
102
103
104
105
106 public MoneyWiseSecurityPrice(final MoneyWiseSecurityPriceBaseList<? extends MoneyWiseSecurityPrice> pList) {
107 super(pList, 0);
108 setNextDataKeySet();
109 }
110
111
112
113
114
115
116
117
118 private MoneyWiseSecurityPrice(final MoneyWiseSecurityPriceList pList,
119 final PrometheusDataValues pValues) throws OceanusException {
120
121 super(pList, pValues);
122
123
124 final OceanusDataFormatter myFormatter = getDataSet().getDataFormatter();
125
126
127 try {
128
129 Object myValue = pValues.getValue(MoneyWiseBasicResource.MONEYWISEDATA_FIELD_DATE);
130 if (myValue instanceof OceanusDate d) {
131 setValueDate(d);
132 } else if (myValue instanceof String s) {
133 final OceanusDateFormatter myParser = myFormatter.getDateFormatter();
134 setValueDate(myParser.parseDate(s));
135 }
136
137
138 myValue = pValues.getValue(MoneyWiseBasicDataType.SECURITY);
139 if (myValue instanceof Integer i) {
140 setValueSecurity(i);
141 } else if (myValue instanceof String s) {
142 setValueSecurity(s);
143 }
144
145
146 myValue = pValues.getValue(MoneyWiseBasicResource.MONEYWISEDATA_FIELD_PRICE);
147 if (myValue instanceof OceanusPrice p) {
148 setValuePrice(p);
149 } else if (myValue instanceof byte[] ba) {
150 setValuePrice(ba);
151 } else if (myValue instanceof String myString) {
152 setValuePrice(myString);
153 setValuePrice(myFormatter.parseValue(myString, OceanusPrice.class));
154 }
155
156
157 } catch (IllegalArgumentException
158 | OceanusException e) {
159
160 throw new MoneyWiseDataException(this, ERROR_CREATEITEM, e);
161 }
162 }
163
164 @Override
165 public MetisFieldSetDef getDataFieldSet() {
166 return FIELD_DEFS;
167 }
168
169 @Override
170 public boolean includeXmlField(final MetisDataFieldId pField) {
171
172 if (MoneyWiseBasicDataType.SECURITY.equals(pField)) {
173 return true;
174 }
175 if (MoneyWiseBasicResource.MONEYWISEDATA_FIELD_DATE.equals(pField)) {
176 return true;
177 }
178 if (MoneyWiseBasicResource.MONEYWISEDATA_FIELD_PRICE.equals(pField)) {
179 return true;
180 }
181
182
183 return super.includeXmlField(pField);
184 }
185
186 @Override
187 public String toString() {
188
189 final PrometheusEncryptedValues myValues = getValues();
190 final Object mySecurity = myValues.getValue(MoneyWiseBasicDataType.SECURITY);
191 final Object myDate = myValues.getValue(MoneyWiseBasicResource.MONEYWISEDATA_FIELD_DATE);
192 final Object myPrice = myValues.getValue(MoneyWiseBasicResource.MONEYWISEDATA_FIELD_PRICE, OceanusPrice.class);
193
194
195 final OceanusDataFormatter myFormatter = getDataSet().getDataFormatter();
196
197
198 final StringBuilder myBuilder = new StringBuilder();
199 myBuilder.append(myFormatter.formatObject(mySecurity));
200 myBuilder.append(": ");
201 myBuilder.append(myFormatter.formatObject(myPrice));
202 myBuilder.append('@');
203 myBuilder.append(myFormatter.formatObject(myDate));
204
205
206 return myBuilder.toString();
207 }
208
209 @Override
210 public String formatObject(final OceanusDataFormatter pFormatter) {
211 return toString();
212 }
213
214
215
216
217
218
219 public OceanusPrice getPrice() {
220 return getValues().getValue(MoneyWiseBasicResource.MONEYWISEDATA_FIELD_PRICE, OceanusPrice.class);
221 }
222
223
224
225
226
227
228 public byte[] getPriceBytes() {
229 return getValues().getEncryptedBytes(MoneyWiseBasicResource.MONEYWISEDATA_FIELD_PRICE);
230 }
231
232
233
234
235
236
237 public PrometheusEncryptedPair getPriceField() {
238 return getValues().getEncryptedPair(MoneyWiseBasicResource.MONEYWISEDATA_FIELD_PRICE);
239 }
240
241
242
243
244
245
246 public OceanusDate getDate() {
247 return getValues().getValue(MoneyWiseBasicResource.MONEYWISEDATA_FIELD_DATE, OceanusDate.class);
248 }
249
250
251
252
253
254
255 public MoneyWiseSecurity getSecurity() {
256 return getValues().getValue(MoneyWiseBasicDataType.SECURITY, MoneyWiseSecurity.class);
257 }
258
259
260
261
262
263
264 public Integer getSecurityId() {
265 final MoneyWiseSecurity mySecurity = getSecurity();
266 return mySecurity == null
267 ? null
268 : mySecurity.getIndexedId();
269 }
270
271
272
273
274
275
276 public String getSecurityName() {
277 final MoneyWiseSecurity mySecurity = getSecurity();
278 return mySecurity == null
279 ? null
280 : mySecurity.getName();
281 }
282
283
284
285
286
287
288 private void setValueSecurity(final MoneyWiseSecurity pValue) {
289 getValues().setUncheckedValue(MoneyWiseBasicDataType.SECURITY, pValue);
290 }
291
292
293
294
295
296
297 private void setValueSecurity(final Integer pId) {
298 getValues().setUncheckedValue(MoneyWiseBasicDataType.SECURITY, pId);
299 }
300
301
302
303
304
305
306 private void setValueSecurity(final String pName) {
307 getValues().setUncheckedValue(MoneyWiseBasicDataType.SECURITY, pName);
308 }
309
310
311
312
313
314
315
316 private void setValuePrice(final OceanusPrice pValue) throws OceanusException {
317 setEncryptedValue(MoneyWiseBasicResource.MONEYWISEDATA_FIELD_PRICE, pValue);
318 }
319
320
321
322
323
324
325
326 private void setValuePrice(final byte[] pBytes) throws OceanusException {
327 setEncryptedValue(MoneyWiseBasicResource.MONEYWISEDATA_FIELD_PRICE, pBytes, OceanusPrice.class);
328 }
329
330
331
332
333
334
335 private void setValuePrice(final String pValue) {
336 getValues().setUncheckedValue(MoneyWiseBasicResource.MONEYWISEDATA_FIELD_PRICE, pValue);
337 }
338
339
340
341
342
343
344 public void setValuePrice(final PrometheusEncryptedPair pValue) {
345 getValues().setUncheckedValue(MoneyWiseBasicResource.MONEYWISEDATA_FIELD_PRICE, pValue);
346 }
347
348
349
350
351
352
353 private void setValueDate(final OceanusDate pValue) {
354 getValues().setUncheckedValue(MoneyWiseBasicResource.MONEYWISEDATA_FIELD_DATE, pValue);
355 }
356
357 @Override
358 @SuppressWarnings("unchecked")
359 public MoneyWiseSecurityPriceBaseList<? extends MoneyWiseSecurityPrice> getList() {
360 return (MoneyWiseSecurityPriceBaseList<? extends MoneyWiseSecurityPrice>) super.getList();
361 }
362
363 @Override
364 public MoneyWiseSecurityPrice getBase() {
365 return (MoneyWiseSecurityPrice) super.getBase();
366 }
367
368 @Override
369 public int compareValues(final PrometheusDataItem pThat) {
370
371 final MoneyWiseSecurityPrice myThat = (MoneyWiseSecurityPrice) pThat;
372
373
374 if (isHeader() != pThat.isHeader()) {
375 return isHeader()
376 ? -1
377 : 1;
378 }
379
380
381 final int iDiff = MetisDataDifference.compareObject(getDate(), myThat.getDate());
382 if (iDiff != 0) {
383
384 return -iDiff;
385 }
386
387
388 return getSecurity().compareTo(myThat.getSecurity());
389 }
390
391 @Override
392 public void resolveDataSetLinks() throws OceanusException {
393
394 super.resolveDataSetLinks();
395
396
397 resolveDataLink(MoneyWiseBasicDataType.SECURITY, MoneyWiseBasicDataType.SECURITY);
398 }
399
400
401
402
403
404
405
406 protected void resolveEditSetLinks(final PrometheusEditSet pEditSet) throws OceanusException {
407
408 final MoneyWiseSecurityList mySecurities = pEditSet.getDataList(MoneyWiseBasicDataType.SECURITY, MoneyWiseSecurityList.class);
409 resolveDataLink(MoneyWiseBasicDataType.SECURITY, mySecurities);
410 }
411
412
413
414
415
416
417 public void setSecurity(final MoneyWiseSecurity pValue) {
418 setValueSecurity(pValue);
419 }
420
421
422
423
424
425
426
427 public void setPrice(final OceanusPrice pPrice) throws OceanusException {
428 setValuePrice(pPrice);
429 }
430
431
432
433
434
435
436 public void setDate(final OceanusDate pDate) {
437 setValueDate(pDate);
438 }
439
440 @Override
441 public void touchUnderlyingItems() {
442
443 getSecurity().touchItem(this);
444 }
445
446 @Override
447 public void touchOnUpdate() {
448
449 getSecurity().touchItem(this);
450 }
451
452 @Override
453 public boolean applyChanges(final PrometheusDataItem pPrice) {
454
455 if (!(pPrice instanceof MoneyWiseSecurityPrice myPrice)) {
456 return false;
457 }
458
459
460 pushHistory();
461
462
463 if (!MetisDataDifference.isEqual(getPrice(), myPrice.getPrice())) {
464 setValuePrice(myPrice.getPriceField());
465 }
466
467
468 if (!MetisDataDifference.isEqual(getDate(), myPrice.getDate())) {
469 setValueDate(myPrice.getDate());
470 }
471
472
473 return checkForHistory();
474 }
475
476 @Override
477 public void adjustMapForItem() {
478 final MoneyWiseSecurityPriceBaseList<? extends MoneyWiseSecurityPrice> myList = getList();
479 final MoneyWiseSecurityPriceDataMap myMap = myList.getDataMap();
480 myMap.adjustForItem(this);
481 }
482
483
484
485
486
487
488 public abstract static class MoneyWiseSecurityPriceBaseList<T extends MoneyWiseSecurityPrice>
489 extends PrometheusEncryptedList<T> {
490
491
492
493 static {
494 MetisFieldSet.newFieldSet(MoneyWiseSecurityPriceBaseList.class);
495 }
496
497
498
499
500
501
502
503
504 protected MoneyWiseSecurityPriceBaseList(final PrometheusDataSet pData,
505 final Class<T> pClass,
506 final MoneyWiseBasicDataType pItemType) {
507
508 super(pClass, pData, pItemType, PrometheusListStyle.CORE);
509 }
510
511
512
513
514
515
516 protected MoneyWiseSecurityPriceBaseList(final MoneyWiseSecurityPriceBaseList<T> pSource) {
517
518 super(pSource);
519 }
520
521 @Override
522 public MoneyWiseSecurityPriceDataMap getDataMap() {
523 return (MoneyWiseSecurityPriceDataMap) super.getDataMap();
524 }
525
526 @Override
527 protected MoneyWiseSecurityPriceDataMap allocateDataMap() {
528 return new MoneyWiseSecurityPriceDataMap();
529 }
530 }
531
532
533
534
535 public static class MoneyWiseSecurityPriceList
536 extends MoneyWiseSecurityPriceBaseList<MoneyWiseSecurityPrice> {
537
538
539
540 private static final MetisFieldSet<MoneyWiseSecurityPriceList> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWiseSecurityPriceList.class);
541
542
543
544
545
546
547 protected MoneyWiseSecurityPriceList(final PrometheusDataSet pData) {
548 super(pData, MoneyWiseSecurityPrice.class, MoneyWiseBasicDataType.SECURITYPRICE);
549 }
550
551
552
553
554
555
556 private MoneyWiseSecurityPriceList(final MoneyWiseSecurityPriceList pSource) {
557 super(pSource);
558 }
559
560 @Override
561 public MetisFieldSet<MoneyWiseSecurityPriceList> getDataFieldSet() {
562 return FIELD_DEFS;
563 }
564
565 @Override
566 public String listName() {
567 return LIST_NAME;
568 }
569
570 @Override
571 public MetisFieldSetDef getItemFields() {
572 return MoneyWiseSecurityPrice.FIELD_DEFS;
573 }
574
575 @Override
576 protected MoneyWiseSecurityPriceList getEmptyList(final PrometheusListStyle pStyle) {
577 final MoneyWiseSecurityPriceList myList = new MoneyWiseSecurityPriceList(this);
578 myList.setStyle(pStyle);
579 return myList;
580 }
581
582
583
584
585
586
587
588
589 public MoneyWiseSecurityPriceList deriveEditList(final PrometheusEditSet pEditSet) throws OceanusException {
590
591 final MoneyWiseSecurityPriceList myList = getEmptyList(PrometheusListStyle.EDIT);
592 myList.ensureMap();
593 pEditSet.setEditEntryList(MoneyWiseBasicDataType.SECURITYPRICE, myList);
594
595
596 final Iterator<MoneyWiseSecurityPrice> myIterator = iterator();
597 while (myIterator.hasNext()) {
598 final MoneyWiseSecurityPrice myCurr = myIterator.next();
599
600
601 final MoneyWiseSecurityPrice myItem = new MoneyWiseSecurityPrice(myList, myCurr);
602 myItem.resolveEditSetLinks(pEditSet);
603 myList.add(myItem);
604
605
606 myItem.adjustMapForItem();
607 }
608
609
610 return myList;
611 }
612
613
614
615
616
617
618
619 @Override
620 public MoneyWiseSecurityPrice addCopyItem(final PrometheusDataItem pPrice) {
621 if (pPrice instanceof MoneyWiseSecurityPrice p) {
622 final MoneyWiseSecurityPrice myPrice = new MoneyWiseSecurityPrice(this, p);
623 add(myPrice);
624 return myPrice;
625 } else {
626 throw new UnsupportedOperationException();
627 }
628 }
629
630
631
632
633
634
635 @Override
636 public MoneyWiseSecurityPrice addNewItem() {
637 final MoneyWiseSecurityPrice myPrice = new MoneyWiseSecurityPrice(this);
638 add(myPrice);
639 return myPrice;
640 }
641
642 @Override
643 public MoneyWiseSecurityPrice addValuesItem(final PrometheusDataValues pValues) throws OceanusException {
644
645 final MoneyWiseSecurityPrice myPrice = new MoneyWiseSecurityPrice(this, pValues);
646
647
648 if (!isIdUnique(myPrice.getIndexedId())) {
649 myPrice.addError(ERROR_DUPLICATE, MetisDataResource.DATA_ID);
650 throw new MoneyWiseDataException(myPrice, ERROR_VALIDATION);
651 }
652
653
654 add(myPrice);
655
656
657 return myPrice;
658 }
659 }
660
661
662
663
664 public static class MoneyWiseSecurityPriceDataMap
665 implements PrometheusDataMapItem, MetisFieldItem {
666
667
668
669 @SuppressWarnings("rawtypes")
670 private static final MetisFieldSet<MoneyWiseSecurityPriceDataMap> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWiseSecurityPriceDataMap.class);
671
672
673
674
675 static {
676 FIELD_DEFS.declareLocalField(MoneyWiseBasicResource.MONEYWISEDATA_MAP_MAPOFMAPS, MoneyWiseSecurityPriceDataMap::getMapOfMaps);
677 FIELD_DEFS.declareLocalField(MoneyWiseBasicResource.SECURITYPRICE_MAP_MAPOFPRICES, MoneyWiseSecurityPriceDataMap::getMapOfPrices);
678 }
679
680
681
682
683 private final Map<MoneyWiseSecurity, Map<OceanusDate, Integer>> theMapOfMaps;
684
685
686
687
688 private final Map<MoneyWiseSecurity, MoneyWiseSecurityPriceList> theMapOfPrices;
689
690
691
692
693 public MoneyWiseSecurityPriceDataMap() {
694
695 theMapOfMaps = new HashMap<>();
696 theMapOfPrices = new HashMap<>();
697 }
698
699 @SuppressWarnings("rawtypes")
700 @Override
701 public MetisFieldSet<MoneyWiseSecurityPriceDataMap> getDataFieldSet() {
702 return FIELD_DEFS;
703 }
704
705 @Override
706 public String formatObject(final OceanusDataFormatter pFormatter) {
707 return FIELD_DEFS.getName();
708 }
709
710
711
712
713
714
715 private Map<MoneyWiseSecurity, Map<OceanusDate, Integer>> getMapOfMaps() {
716 return theMapOfMaps;
717 }
718
719
720
721
722
723
724 private Map<MoneyWiseSecurity, MoneyWiseSecurityPriceList> getMapOfPrices() {
725 return theMapOfPrices;
726 }
727
728 @Override
729 public void resetMap() {
730 theMapOfMaps.clear();
731 theMapOfPrices.clear();
732 }
733
734 @Override
735 public void adjustForItem(final PrometheusDataItem pItem) {
736
737 final MoneyWiseSecurityPrice myItem = (MoneyWiseSecurityPrice) pItem;
738 final MoneyWiseSecurity mySecurity = myItem.getSecurity();
739 if (mySecurity == null) {
740 return;
741 }
742
743
744 final Map<OceanusDate, Integer> myMap = theMapOfMaps.computeIfAbsent(mySecurity, s -> new HashMap<>());
745
746
747 final OceanusDate myDate = myItem.getDate();
748 final Integer myCount = myMap.get(myDate);
749 if (myCount == null) {
750 myMap.put(myDate, PrometheusDataInstanceMap.ONE);
751 } else {
752 myMap.put(myDate, myCount + 1);
753 }
754
755
756 final MoneyWiseSecurityPriceList myList = theMapOfPrices.computeIfAbsent(mySecurity, MoneyWiseSecurityPriceList::new);
757
758
759 myList.add(myItem);
760 }
761
762
763
764
765
766
767
768 public boolean validPriceCount(final MoneyWiseSecurityPrice pItem) {
769
770 final MoneyWiseSecurity mySecurity = pItem.getSecurity();
771 final OceanusDate myDate = pItem.getDate();
772
773
774 final Map<OceanusDate, Integer> myMap = theMapOfMaps.get(mySecurity);
775 if (myMap != null) {
776 final Integer myResult = myMap.get(myDate);
777 return PrometheusDataInstanceMap.ONE.equals(myResult);
778 }
779 return false;
780 }
781
782
783
784
785
786
787
788
789 public boolean availableDate(final MoneyWiseSecurity pSecurity,
790 final OceanusDate pDate) {
791
792 final Map<OceanusDate, Integer> myMap = theMapOfMaps.get(pSecurity);
793 return myMap == null
794 || myMap.get(pDate) == null;
795 }
796
797
798
799
800
801
802
803
804 public OceanusPrice getPriceForDate(final MoneyWiseAssetBase pSecurity,
805 final OceanusDate pDate) {
806
807 final MoneyWiseSecurity mySecurity = MoneyWiseSecurity.class.cast(pSecurity);
808
809
810 final MoneyWiseSecurityPriceList myList = theMapOfPrices.get(mySecurity);
811 if (myList != null) {
812
813 final Iterator<MoneyWiseSecurityPrice> myIterator = myList.iterator();
814 while (myIterator.hasNext()) {
815 final MoneyWiseSecurityPrice myCurr = myIterator.next();
816
817
818 if (pDate.compareTo(myCurr.getDate()) >= 0) {
819 return myCurr.getPrice();
820 }
821 }
822 }
823
824
825 final Currency myCurrency = mySecurity.getCurrency();
826 return OceanusPrice.getWholeUnits(PrometheusDataInstanceMap.ONE, myCurrency);
827 }
828
829
830
831
832
833
834
835
836 public OceanusPrice[] getPricesForRange(final MoneyWiseSecurity pSecurity,
837 final OceanusDateRange pRange) {
838
839 final Currency myCurrency = pSecurity.getCurrency();
840 OceanusPrice myFirst = OceanusPrice.getWholeUnits(PrometheusDataInstanceMap.ONE, myCurrency);
841 OceanusPrice myLatest = myFirst;
842 final OceanusDate myStart = pRange.getStart();
843
844
845 final MoneyWiseSecurityPriceList myList = theMapOfPrices.get(pSecurity);
846 if (myList != null) {
847
848 final ListIterator<MoneyWiseSecurityPrice> myIterator = myList.listIterator(myList.size());
849 while (myIterator.hasPrevious()) {
850 final MoneyWiseSecurityPrice myCurr = myIterator.previous();
851
852
853 final OceanusDate myDate = myCurr.getDate();
854 final int iComp = pRange.compareToDate(myDate);
855
856
857 if (iComp < 0) {
858 break;
859 }
860
861
862 myLatest = myCurr.getPrice();
863
864
865 if (iComp > 0
866 || myDate.compareTo(myStart) == 0) {
867 myFirst = myLatest;
868 }
869 }
870 }
871
872
873 return new OceanusPrice[]
874 {myFirst, myLatest};
875 }
876
877
878
879
880
881
882
883 public ListIterator<MoneyWiseSecurityPrice> priceIterator(final MoneyWiseSecurity pSecurity) {
884
885 final MoneyWiseSecurityPriceList myList = theMapOfPrices.get(pSecurity);
886 return myList != null
887 ? myList.listIterator(myList.size())
888 : null;
889 }
890
891
892
893
894 private static final class MoneyWiseSecurityPriceList
895 implements MetisFieldItem, MetisDataList<MoneyWiseSecurityPrice> {
896
897
898
899 private static final MetisFieldSet<MoneyWiseSecurityPriceList> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWiseSecurityPriceList.class);
900
901
902
903
904 static {
905 FIELD_DEFS.declareLocalField(MetisDataResource.LIST_SIZE, MoneyWiseSecurityPriceList::size);
906 }
907
908
909
910
911 private final List<MoneyWiseSecurityPrice> theList;
912
913
914
915
916 private final MoneyWiseSecurity theSecurity;
917
918
919
920
921
922
923 private MoneyWiseSecurityPriceList(final MoneyWiseSecurity pSecurity) {
924 theSecurity = pSecurity;
925 theList = new ArrayList<>();
926 }
927
928 @Override
929 public MetisFieldSet<MoneyWiseSecurityPriceList> getDataFieldSet() {
930 return FIELD_DEFS;
931 }
932
933 @Override
934 public String formatObject(final OceanusDataFormatter pFormatter) {
935 return theSecurity.formatObject(pFormatter)
936 + "("
937 + size()
938 + ")";
939 }
940
941 @Override
942 public String toString() {
943 return theSecurity.toString()
944 + "("
945 + size()
946 + ")";
947 }
948
949 @Override
950 public List<MoneyWiseSecurityPrice> getUnderlyingList() {
951 return theList;
952 }
953 }
954 }
955 }