View Javadoc
1   /*
2    * Prometheus: Application Framework
3    * Copyright 2012-2026. Tony Washer
4    *
5    * Licensed under the Apache License, Version 2.0 (the "License"); you may not
6    * use this file except in compliance with the License.  You may obtain a copy
7    * of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
14   * License for the specific language governing permissions and limitations under
15   * the License.
16   */
17  package io.github.tonywasher.joceanus.prometheus.views;
18  
19  import io.github.tonywasher.joceanus.oceanus.base.OceanusException;
20  import io.github.tonywasher.joceanus.oceanus.event.OceanusEventManager;
21  import io.github.tonywasher.joceanus.oceanus.event.OceanusEventRegistrar;
22  import io.github.tonywasher.joceanus.oceanus.event.OceanusEventRegistrar.OceanusEventProvider;
23  import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
24  import io.github.tonywasher.joceanus.oceanus.profile.OceanusProfile;
25  import io.github.tonywasher.joceanus.metis.toolkit.MetisToolkit;
26  import io.github.tonywasher.joceanus.metis.viewer.MetisViewerEntry;
27  import io.github.tonywasher.joceanus.metis.viewer.MetisViewerErrorList;
28  import io.github.tonywasher.joceanus.metis.viewer.MetisViewerExceptionWrapper;
29  import io.github.tonywasher.joceanus.metis.viewer.MetisViewerManager;
30  import io.github.tonywasher.joceanus.metis.viewer.MetisViewerStandardEntry;
31  import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataSet;
32  import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataValidator.PrometheusDataValidatorFactory;
33  import io.github.tonywasher.joceanus.prometheus.database.PrometheusDataStore;
34  import io.github.tonywasher.joceanus.prometheus.preference.PrometheusPreferenceManager;
35  import io.github.tonywasher.joceanus.prometheus.security.PrometheusSecurityPasswordManager;
36  import io.github.tonywasher.joceanus.prometheus.sheets.PrometheusSpreadSheet;
37  import io.github.tonywasher.joceanus.prometheus.toolkit.PrometheusToolkit;
38  import io.github.tonywasher.joceanus.tethys.api.factory.TethysUIFactory;
39  
40  import java.util.EnumMap;
41  import java.util.Map;
42  
43  /**
44   * Provides top-level control of data.
45   */
46  public abstract class PrometheusDataControl
47          implements OceanusEventProvider<PrometheusDataEvent> {
48      /**
49       * The Event Manager.
50       */
51      private final OceanusEventManager<PrometheusDataEvent> theEventManager;
52  
53      /**
54       * The DataSet.
55       */
56      private PrometheusDataSet theData;
57  
58      /**
59       * The Update DataSet.
60       */
61      private PrometheusDataSet theUpdates;
62  
63      /**
64       * The Error List.
65       */
66      private final MetisViewerErrorList theErrors;
67  
68      /**
69       * The toolkit.
70       */
71      private final PrometheusToolkit theToolkit;
72  
73      /**
74       * The metisToolkit.
75       */
76      private final MetisToolkit theMetisToolkit;
77  
78      /**
79       * The Viewer Entry hashMap.
80       */
81      private final Map<PrometheusViewerEntryId, MetisViewerEntry> theViewerMap;
82  
83      /**
84       * Validator factory.
85       */
86      private PrometheusDataValidatorFactory theValidatorFactory;
87  
88      /**
89       * Constructor for default control.
90       *
91       * @param pToolkit the toolkit
92       */
93      protected PrometheusDataControl(final PrometheusToolkit pToolkit) {
94          /* Store the parameters */
95          theToolkit = pToolkit;
96          theMetisToolkit = pToolkit.getToolkit();
97  
98          /* Create the Viewer Map and initialise it */
99          theViewerMap = new EnumMap<>(PrometheusViewerEntryId.class);
100         initViewerMap();
101 
102         /* Create event manager */
103         theEventManager = new OceanusEventManager<>();
104 
105         /* Create the error list */
106         theErrors = new MetisViewerErrorList();
107     }
108 
109     @Override
110     public OceanusEventRegistrar<PrometheusDataEvent> getEventRegistrar() {
111         return theEventManager.getEventRegistrar();
112     }
113 
114     /**
115      * Set the validator factory.
116      *
117      * @param pFactory the validator factory
118      */
119     public void setValidatorFactory(final PrometheusDataValidatorFactory pFactory) {
120         theValidatorFactory = pFactory;
121     }
122 
123     /**
124      * Obtain the validator factory.
125      *
126      * @return the validator factory
127      */
128     public PrometheusDataValidatorFactory getValidatorFactory() {
129         return theValidatorFactory;
130     }
131 
132     /**
133      * Record new DataSet.
134      *
135      * @param pData the new DataSet
136      */
137     public void setData(final PrometheusDataSet pData) {
138         /* Store the data */
139         theData = pData;
140 
141         /* Update the Data entry */
142         final MetisViewerEntry myData = getViewerEntry(PrometheusViewerEntryId.DATASET);
143         myData.setTreeObject(pData);
144 
145         /* Analyse the data */
146         analyseData(false);
147 
148         /* Refresh the views */
149         refreshViews();
150     }
151 
152     /**
153      * Increment data version.
154      */
155     public void incrementVersion() {
156         /* Increment data versions */
157         final int myVersion = theData.getVersion();
158         theData.setVersion(myVersion + 1);
159     }
160 
161     /**
162      * Obtain current DataSet.
163      *
164      * @return the current DataSet
165      */
166     public PrometheusDataSet getData() {
167         return theData;
168     }
169 
170     /**
171      * Derive update list.
172      *
173      * @throws OceanusException on error
174      */
175     public void deriveUpdates() throws OceanusException {
176         /* Store the updates */
177         theUpdates = theData.deriveUpdateSet();
178 
179         /* Update the Data entry */
180         final MetisViewerEntry myData = getViewerEntry(PrometheusViewerEntryId.UPDATES);
181         myData.setTreeObject(theUpdates);
182     }
183 
184     /**
185      * Obtain current Updates.
186      *
187      * @return the current Updates
188      */
189     public PrometheusDataSet getUpdates() {
190         return theUpdates;
191     }
192 
193     /**
194      * Add new Error.
195      *
196      * @param pError the new Error
197      */
198     public void addError(final OceanusException pError) {
199         theErrors.add(new MetisViewerExceptionWrapper(pError));
200     }
201 
202     /**
203      * Clear error list.
204      */
205     protected void clearErrors() {
206         theErrors.clear();
207     }
208 
209     /**
210      * Obtain current error.
211      *
212      * @return the current Error
213      */
214     public MetisViewerErrorList getErrors() {
215         return theErrors;
216     }
217 
218     /**
219      * Obtain toolkit.
220      *
221      * @return the toolkit
222      */
223     public PrometheusToolkit getToolkit() {
224         return theToolkit;
225     }
226 
227     /**
228      * Obtain DataFormatter.
229      *
230      * @return the DataFormatter
231      */
232     public OceanusDataFormatter getDataFormatter() {
233         return theMetisToolkit.getFormatter();
234     }
235 
236     /**
237      * Obtain SecurityManager.
238      *
239      * @return the SecurityManager
240      */
241     public PrometheusSecurityPasswordManager getPasswordManager() {
242         return theToolkit.getPasswordManager();
243     }
244 
245     /**
246      * Obtain PreferenceManager.
247      *
248      * @return the PreferenceManager
249      */
250     public PrometheusPreferenceManager getPreferenceManager() {
251         return theToolkit.getPreferenceManager();
252     }
253 
254     /**
255      * Obtain ViewerManager.
256      *
257      * @return the ViewerManager
258      */
259     public MetisViewerManager getViewerManager() {
260         return theMetisToolkit.getViewerManager();
261     }
262 
263     /**
264      * Obtain GuiFactory.
265      *
266      * @return the GuiFactory
267      */
268     public TethysUIFactory<?> getGuiFactory() {
269         return theMetisToolkit.getGuiFactory();
270     }
271 
272     /**
273      * Initialise ViewerMap.
274      */
275     private void initViewerMap() {
276         /* Access the viewer manager */
277         final MetisViewerManager myViewer = getViewerManager();
278 
279         /* Access standard entries */
280         theViewerMap.put(PrometheusViewerEntryId.ERROR, myViewer.getStandardEntry(MetisViewerStandardEntry.ERROR));
281         theViewerMap.put(PrometheusViewerEntryId.PROFILE, myViewer.getStandardEntry(MetisViewerStandardEntry.PROFILE));
282         theViewerMap.put(PrometheusViewerEntryId.DATA, myViewer.getStandardEntry(MetisViewerStandardEntry.DATA));
283         theViewerMap.put(PrometheusViewerEntryId.UPDATES, myViewer.getStandardEntry(MetisViewerStandardEntry.UPDATES));
284         theViewerMap.put(PrometheusViewerEntryId.VIEW, myViewer.getStandardEntry(MetisViewerStandardEntry.VIEW));
285 
286         /* Create Data entries */
287         final MetisViewerEntry myData = getViewerEntry(PrometheusViewerEntryId.DATA);
288         theViewerMap.put(PrometheusViewerEntryId.DATASET, myViewer.newEntry(myData, PrometheusViewerEntryId.DATASET.toString()));
289         theViewerMap.put(PrometheusViewerEntryId.ANALYSIS, myViewer.newEntry(myData, PrometheusViewerEntryId.ANALYSIS.toString()));
290 
291         /* Create View entries */
292         final MetisViewerEntry myView = getViewerEntry(PrometheusViewerEntryId.VIEW);
293         final MetisViewerEntry myMaint = myViewer.newEntry(myView, PrometheusViewerEntryId.MAINTENANCE.toString());
294         theViewerMap.put(PrometheusViewerEntryId.MAINTENANCE, myMaint);
295         theViewerMap.put(PrometheusViewerEntryId.STATIC, myViewer.newEntry(myMaint, PrometheusViewerEntryId.STATIC.toString()));
296 
297         /* Hide the error entry */
298         final MetisViewerEntry myError = theViewerMap.get(PrometheusViewerEntryId.ERROR);
299         myError.setVisible(myError.getObject() != null);
300     }
301 
302     /**
303      * Get viewer Entry.
304      *
305      * @param pId the id of the entry
306      * @return the Viewer Entry
307      */
308     public final MetisViewerEntry getViewerEntry(final PrometheusViewerEntryId pId) {
309         return theViewerMap.get(pId);
310     }
311 
312     /**
313      * Obtain SpreadSheet object.
314      *
315      * @return SpreadSheet object
316      */
317     public abstract PrometheusSpreadSheet getSpreadSheet();
318 
319     /**
320      * Obtain the database name.
321      *
322      * @return the name
323      */
324     public abstract String getDatabaseName();
325 
326     /**
327      * Obtain Database object.
328      *
329      * @return database object
330      * @throws OceanusException on error
331      */
332     public abstract PrometheusDataStore getDatabase() throws OceanusException;
333 
334     /**
335      * Obtain Null Database object.
336      *
337      * @return database object
338      * @throws OceanusException on error
339      */
340     public abstract PrometheusDataStore getNullDatabase() throws OceanusException;
341 
342     /**
343      * Obtain DataSet object.
344      *
345      * @return dataSet object
346      */
347     public abstract PrometheusDataSet getNewData();
348 
349     /**
350      * Analyse the data in the view.
351      *
352      * @param bPreserve preserve any error
353      * @return success true/false
354      */
355     protected abstract boolean analyseData(boolean bPreserve);
356 
357     /**
358      * refresh the data view.
359      */
360     final void refreshViews() {
361         /* Obtain the active profile */
362         OceanusProfile myTask = getActiveTask();
363         myTask = myTask.startTask("refreshViews");
364 
365         /* Refresh the Control */
366         theEventManager.fireEvent(PrometheusDataEvent.REFRESHVIEWS);
367 
368         /* Complete the task */
369         myTask.end();
370     }
371 
372     /**
373      * Undo changes in a viewSet.
374      */
375     public void undoLastChange() {
376         /* Obtain the active profile */
377         OceanusProfile myTask = getActiveTask();
378         myTask = myTask.startTask("unDoLastChange");
379 
380         /* UndoLastChange */
381         theData.undoLastChange();
382         myTask.end();
383 
384         /* Analyse the data */
385         analyseData(false);
386 
387         /* Refresh the views */
388         refreshViews();
389 
390         /* Complete the task */
391         myTask.end();
392     }
393 
394     /**
395      * Reset changes in a viewSet.
396      */
397     public void resetChanges() {
398         /* Obtain the active profile */
399         OceanusProfile myTask = getActiveTask();
400         myTask = myTask.startTask("resetChanges");
401 
402         /* Rewind the data */
403         theData.resetChanges();
404         myTask.end();
405 
406         /* Analyse the data */
407         analyseData(false);
408 
409         /* Refresh the views */
410         refreshViews();
411 
412         /* Complete the task */
413         myTask.end();
414     }
415 
416     /**
417      * Create new profile.
418      *
419      * @param pTask the name of the task
420      * @return the new profile
421      */
422     public OceanusProfile getNewProfile(final String pTask) {
423         return theMetisToolkit.getNewProfile(pTask);
424     }
425 
426     /**
427      * Obtain the active profile.
428      *
429      * @return the active profile
430      */
431     public OceanusProfile getActiveProfile() {
432         return theMetisToolkit.getActiveProfile();
433     }
434 
435     /**
436      * Obtain the active task.
437      *
438      * @return the active task
439      */
440     public OceanusProfile getActiveTask() {
441         return theMetisToolkit.getActiveTask();
442     }
443 }