1313import eu .dariolucia .reatmetric .api .alarms .IAlarmParameterDataArchive ;
1414import eu .dariolucia .reatmetric .api .archive .IArchive ;
1515import eu .dariolucia .reatmetric .api .archive .IArchiveFactory ;
16+ import eu .dariolucia .reatmetric .api .archive .IDataItemArchive ;
1617import eu .dariolucia .reatmetric .api .archive .exceptions .ArchiveException ;
1718import eu .dariolucia .reatmetric .api .common .AbstractDataItem ;
19+ import eu .dariolucia .reatmetric .api .common .Pair ;
1820import eu .dariolucia .reatmetric .api .common .exceptions .ReatmetricException ;
1921import eu .dariolucia .reatmetric .api .events .EventData ;
2022import eu .dariolucia .reatmetric .api .events .EventDataFilter ;
2426import eu .dariolucia .reatmetric .api .parameters .ParameterData ;
2527import eu .dariolucia .reatmetric .api .parameters .ParameterDataFilter ;
2628import eu .dariolucia .reatmetric .api .processing .IProcessingModelInitialiser ;
29+ import eu .dariolucia .reatmetric .core .configuration .AbstractInitialisationConfiguration ;
30+ import eu .dariolucia .reatmetric .core .configuration .ResumeInitialisationConfiguration ;
31+ import eu .dariolucia .reatmetric .core .configuration .TimeInitialisationConfiguration ;
2732
33+ import java .time .Instant ;
2834import java .util .*;
2935
3036public class ArchiveInitialiser implements IProcessingModelInitialiser {
3137
32- private final Date initTime ;
38+ private final Instant maxLookBackTime ;
39+ private final Instant initTime ;
3340 private final IArchive initArchive ;
41+ private final boolean externalArchive ;
3442
35- public ArchiveInitialiser (Date time , String archiveLocation ) throws ReatmetricException {
36- this .initTime = time ;
37- ServiceLoader <IArchiveFactory > archiveLoader = ServiceLoader .load (IArchiveFactory .class );
38- if (archiveLoader .findFirst ().isPresent ()) {
39- initArchive = archiveLoader .findFirst ().get ().buildArchive (archiveLocation );
40- initArchive .connect ();
43+ public ArchiveInitialiser (IArchive processingArchive , AbstractInitialisationConfiguration configuration ) throws ReatmetricException {
44+ if (configuration instanceof TimeInitialisationConfiguration ) {
45+ this .externalArchive = true ;
46+ this .initTime = ((TimeInitialisationConfiguration ) configuration ).getTime ().toInstant ();
47+ ServiceLoader <IArchiveFactory > archiveLoader = ServiceLoader .load (IArchiveFactory .class );
48+ if (archiveLoader .findFirst ().isPresent ()) {
49+ initArchive = archiveLoader .findFirst ().get ().buildArchive (((TimeInitialisationConfiguration ) configuration ).getArchiveLocation ());
50+ initArchive .connect ();
51+ } else {
52+ throw new ReatmetricException ("Initialisation archive configured to " + ((TimeInitialisationConfiguration ) configuration ).getArchiveLocation () + ", but no archive factory deployed" );
53+ }
54+ } else if (configuration instanceof ResumeInitialisationConfiguration ) {
55+ this .externalArchive = false ;
56+ initArchive = processingArchive ;
57+ // In order to be optimal with the dates, let's get the latest stored generation time for each data type: events, parameters, activities
58+ Instant lastStoredGenerationTime = null ;
59+ List <Pair <Class <? extends IDataItemArchive >, Class <? extends AbstractDataItem >>> toCheckPairs = Arrays .asList (
60+ Pair .of (IParameterDataArchive .class , ParameterData .class ),
61+ Pair .of (IAlarmParameterDataArchive .class , AlarmParameterData .class ),
62+ Pair .of (IEventDataArchive .class , EventData .class ),
63+ Pair .of (IActivityOccurrenceDataArchive .class , ActivityOccurrenceReport .class ),
64+ Pair .of (IActivityOccurrenceDataArchive .class , ActivityOccurrenceData .class )
65+ );
66+ for (Pair <Class <? extends IDataItemArchive >, Class <? extends AbstractDataItem >> pair : toCheckPairs ) {
67+ IDataItemArchive arc = processingArchive .getArchive (pair .getFirst ());
68+ if (arc != null ) {
69+ Instant retrieved = arc .retrieveLastGenerationTime (pair .getSecond ());
70+ if (retrieved != null && (lastStoredGenerationTime == null || lastStoredGenerationTime .isBefore (retrieved ))) {
71+ lastStoredGenerationTime = retrieved ;
72+ }
73+ }
74+ }
75+ // Still null? Use now
76+ if (lastStoredGenerationTime == null ) {
77+ lastStoredGenerationTime = Instant .now ();
78+ }
79+ initTime = lastStoredGenerationTime ;
4180 } else {
42- throw new ReatmetricException ("Initialisation archive configured to " + archiveLocation + ", but no archive factory deployed " );
81+ throw new IllegalArgumentException ("Initialisation configuration " + configuration + " not supported " );
4382 }
83+ this .maxLookBackTime = this .initTime .minusSeconds (configuration .getLookBackTime ());
4484 }
4585
4686 @ Override
@@ -60,7 +100,7 @@ public List<AbstractDataItem> getState(int externalId, SystemEntityType type) th
60100
61101 private List <AbstractDataItem > retrieveActivityOccurranceStates (int externalId ) throws ArchiveException {
62102 IActivityOccurrenceDataArchive arc = initArchive .getArchive (IActivityOccurrenceDataArchive .class );
63- List <ActivityOccurrenceData > activities = arc .retrieve (initTime . toInstant () , new ActivityOccurrenceDataFilter (null , null , null , null , null , Collections .singletonList (externalId )), null );
103+ List <ActivityOccurrenceData > activities = arc .retrieve (initTime , new ActivityOccurrenceDataFilter (null , null , null , null , null , Collections .singletonList (externalId )), maxLookBackTime );
64104 // Post processing: for each activity occurrence, remove the reports having verification time > initTime and rebuild the activity occurrence object
65105 List <AbstractDataItem > toReturn = new ArrayList <>(activities .size ());
66106 for (ActivityOccurrenceData aod : activities ) {
@@ -80,10 +120,10 @@ private List<AbstractDataItem> retrieveActivityOccurranceStates(int externalId)
80120
81121 private ActivityOccurrenceData sanitize (ActivityOccurrenceData aod ) {
82122 ActivityOccurrenceReport lastReport = aod .getProgressReports ().get (aod .getProgressReports ().size ());
83- if (lastReport .getGenerationTime ().compareTo (initTime . toInstant () ) > 0 ) {
123+ if (lastReport .getGenerationTime ().compareTo (initTime ) > 0 ) {
84124 // At least one report is exceeding the init time
85125 List <ActivityOccurrenceReport > shrinkedReports = new LinkedList <>(aod .getProgressReports ());
86- shrinkedReports .removeIf (rep -> rep .getGenerationTime ().compareTo (initTime . toInstant () ) > 0 );
126+ shrinkedReports .removeIf (rep -> rep .getGenerationTime ().compareTo (initTime ) > 0 );
87127 return new ActivityOccurrenceData (aod .getInternalId (), aod .getGenerationTime (), aod .getExtension (), aod .getExternalId (), aod .getName (), aod .getPath (), aod .getType (), aod .getArguments (), aod .getProperties (), shrinkedReports , aod .getRoute (), aod .getSource ());
88128 } else {
89129 return aod ;
@@ -92,9 +132,9 @@ private ActivityOccurrenceData sanitize(ActivityOccurrenceData aod) {
92132
93133 private List <AbstractDataItem > retrieveParameterState (int externalId ) throws ArchiveException {
94134 IParameterDataArchive arc = initArchive .getArchive (IParameterDataArchive .class );
95- List <ParameterData > params = arc .retrieve (initTime . toInstant () , new ParameterDataFilter (null , null , null , null , null , Collections .singletonList (externalId )), null );
135+ List <ParameterData > params = arc .retrieve (initTime , new ParameterDataFilter (null , null , null , null , null , Collections .singletonList (externalId )), maxLookBackTime );
96136 IAlarmParameterDataArchive arc2 = initArchive .getArchive (IAlarmParameterDataArchive .class );
97- List <AlarmParameterData > alarms = arc2 .retrieve (initTime . toInstant () , new AlarmParameterDataFilter (null , null , null , Collections .singletonList (externalId )), null );
137+ List <AlarmParameterData > alarms = arc2 .retrieve (initTime , new AlarmParameterDataFilter (null , null , null , Collections .singletonList (externalId )), maxLookBackTime );
98138 List <AbstractDataItem > toReturn = new ArrayList <>();
99139 if (params .size () > 0 ) {
100140 toReturn .add (params .get (0 ));
@@ -107,11 +147,22 @@ private List<AbstractDataItem> retrieveParameterState(int externalId) throws Arc
107147
108148 private List <AbstractDataItem > retrieveEventState (int externalId ) throws ArchiveException {
109149 IEventDataArchive arc = initArchive .getArchive (IEventDataArchive .class );
110- List <EventData > events = arc .retrieve (initTime . toInstant () , new EventDataFilter (null , null , null , null , null , null , Collections .singletonList (externalId )), null );
150+ List <EventData > events = arc .retrieve (initTime , new EventDataFilter (null , null , null , null , null , null , Collections .singletonList (externalId )), maxLookBackTime );
111151 List <AbstractDataItem > toReturn = new ArrayList <>();
112152 if (events .size () > 0 ) {
113153 toReturn .add (events .get (0 ));
114154 }
115155 return toReturn ;
116156 }
157+
158+ public void dispose () {
159+ if (externalArchive ) {
160+ try {
161+ initArchive .dispose ();
162+ } catch (ArchiveException e ) {
163+ // TODO log
164+ e .printStackTrace ();
165+ }
166+ }
167+ }
117168}
0 commit comments