1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.github.tonywasher.joceanus.moneywise.lethe.views;
18
19 import io.github.tonywasher.joceanus.oceanus.base.OceanusException;
20 import io.github.tonywasher.joceanus.oceanus.date.OceanusDateRange;
21 import io.github.tonywasher.joceanus.oceanus.event.OceanusEventManager;
22 import io.github.tonywasher.joceanus.oceanus.event.OceanusEventRegistrar;
23 import io.github.tonywasher.joceanus.oceanus.event.OceanusEventRegistrar.OceanusEventProvider;
24 import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
25 import io.github.tonywasher.joceanus.oceanus.logger.OceanusLogManager;
26 import io.github.tonywasher.joceanus.oceanus.logger.OceanusLogger;
27 import io.github.tonywasher.joceanus.oceanus.profile.OceanusProfile;
28 import io.github.tonywasher.joceanus.metis.data.MetisDataDifference;
29 import io.github.tonywasher.joceanus.metis.field.MetisFieldItem;
30 import io.github.tonywasher.joceanus.metis.field.MetisFieldSet;
31 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicDataType;
32 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDataSet;
33 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransInfo;
34 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransInfo.MoneyWiseTransInfoList;
35 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransaction;
36 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransaction.MoneyWiseTransactionList;
37 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseStaticDataType;
38 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTransInfoType.MoneyWiseTransInfoTypeList;
39 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.analyse.MoneyWiseAnalysisTransAnalyser;
40 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysis;
41 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysisDataResource;
42 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysisManager;
43 import io.github.tonywasher.joceanus.moneywise.views.MoneyWiseView;
44 import io.github.tonywasher.joceanus.moneywise.views.MoneyWiseViewResource;
45 import io.github.tonywasher.joceanus.prometheus.views.PrometheusDataEvent;
46 import io.github.tonywasher.joceanus.prometheus.views.PrometheusEditEntry;
47 import io.github.tonywasher.joceanus.prometheus.views.PrometheusEditSet;
48
49 import java.util.Iterator;
50
51
52
53
54 public class MoneyWiseAnalysisView
55 implements MetisFieldItem, OceanusEventProvider<PrometheusDataEvent> {
56
57
58
59 private static final MetisFieldSet<MoneyWiseAnalysisView> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWiseAnalysisView.class);
60
61
62
63
64 static {
65 FIELD_DEFS.declareLocalField(MoneyWiseViewResource.ANALYSISVIEW_UPDATESET, MoneyWiseAnalysisView::getEditSet);
66 FIELD_DEFS.declareLocalField(MoneyWiseAnalysisDataResource.ANALYSIS_NAME, MoneyWiseAnalysisView::getAnalysis);
67 }
68
69
70
71
72 private static final OceanusLogger LOGGER = OceanusLogManager.getLogger(MoneyWiseAnalysisView.class);
73
74
75
76
77 private final OceanusEventManager<PrometheusDataEvent> theEventManager;
78
79
80
81
82 private final MoneyWiseView theView;
83
84
85
86
87 private final PrometheusEditSet theEditSet;
88
89
90
91
92 private final PrometheusEditEntry<MoneyWiseTransaction> theTransEntry;
93
94
95
96
97 private final PrometheusEditEntry<MoneyWiseTransInfo> theInfoEntry;
98
99
100
101
102 private MoneyWiseTransactionView theTransactions;
103
104
105
106
107 private MoneyWiseAnalysisManager theManager;
108
109
110
111
112 private MoneyWiseAnalysis theAnalysis;
113
114
115
116
117 private OceanusDateRange theRange;
118
119
120
121
122
123
124
125 public MoneyWiseAnalysisView(final MoneyWiseView pView,
126 final PrometheusEditSet pEditSet) {
127
128 theView = pView;
129 theEditSet = pEditSet;
130
131
132 theTransEntry = theEditSet.registerType(MoneyWiseBasicDataType.TRANSACTION);
133 theInfoEntry = theEditSet.registerType(MoneyWiseBasicDataType.TRANSACTIONINFO);
134
135
136 theEventManager = new OceanusEventManager<>();
137 }
138
139 @Override
140 public MetisFieldSet<MoneyWiseAnalysisView> getDataFieldSet() {
141 return FIELD_DEFS;
142 }
143
144 @Override
145 public String formatObject(final OceanusDataFormatter pFormatter) {
146 return FIELD_DEFS.getName();
147 }
148
149 @Override
150 public OceanusEventRegistrar<PrometheusDataEvent> getEventRegistrar() {
151 return theEventManager.getEventRegistrar();
152 }
153
154
155
156
157
158
159 public MoneyWiseAnalysis getAnalysis() {
160 return theAnalysis;
161 }
162
163
164
165
166
167
168 private PrometheusEditSet getEditSet() {
169 return theEditSet;
170 }
171
172
173
174
175
176
177 public MoneyWiseTransactionList getTransactions() {
178 return theTransactions;
179 }
180
181
182
183
184
185
186 public OceanusDateRange getRange() {
187 return theRange;
188 }
189
190
191
192
193 public void refreshData() {
194
195 try {
196
197 theManager = theView.getAnalysisManager();
198 theEditSet.setDataSet(theView.getData());
199
200
201 if (theRange != null) {
202
203 theAnalysis = theManager.getRangedAnalysis(theRange);
204
205
206 final MoneyWiseDataSet myData = theView.getData();
207 theTransactions = new MoneyWiseTransactionView(myData.getTransactions());
208
209
210 } else {
211
212 theAnalysis = null;
213 theTransactions = null;
214 }
215
216
217 registerLists();
218
219
220 theEventManager.fireEvent(PrometheusDataEvent.ADJUSTVISIBILITY);
221
222 } catch (OceanusException e) {
223 LOGGER.error("Failed to refreshData", e);
224 }
225 }
226
227
228
229
230
231
232 public void setRange(final OceanusDateRange pRange) {
233
234 if (!MetisDataDifference.isEqual(theRange, pRange)) {
235
236 theRange = pRange;
237 theAnalysis = theManager == null ? null : theManager.getRangedAnalysis(theRange);
238
239
240 theEventManager.fireEvent(PrometheusDataEvent.ADJUSTVISIBILITY);
241 }
242 }
243
244
245
246
247 private void registerLists() {
248
249 if (theTransactions != null) {
250 final MoneyWiseTransInfoList myInfo = theTransactions.getTransactionInfo();
251 theTransEntry.setDataList(theTransactions);
252 theInfoEntry.setDataList(myInfo);
253 } else {
254 theTransEntry.setDataList(null);
255 theInfoEntry.setDataList(null);
256 }
257 }
258
259
260
261
262 private final class MoneyWiseTransactionView
263 extends MoneyWiseTransactionList {
264
265
266
267
268
269
270 private MoneyWiseTransactionView(final MoneyWiseTransactionList pSource) throws OceanusException {
271
272 super(pSource);
273 setStyle(PrometheusListStyle.EDIT);
274 setEditSet(theEditSet);
275 theEditSet.setEditEntryList(MoneyWiseBasicDataType.TRANSACTION, this);
276
277
278 setTransInfoTypes(theEditSet.getDataList(MoneyWiseStaticDataType.TRANSINFOTYPE, MoneyWiseTransInfoTypeList.class));
279
280
281 final MoneyWiseTransInfoList myTransInfo = pSource.getTransactionInfo().getEmptyList(PrometheusListStyle.EDIT);
282 theEditSet.setEditEntryList(MoneyWiseBasicDataType.TRANSACTIONINFO, myTransInfo);
283 setTransactionInfo(myTransInfo);
284
285
286 final Iterator<MoneyWiseTransaction> myIterator = pSource.iterator();
287 while (myIterator.hasNext()) {
288 final MoneyWiseTransaction myCurr = myIterator.next();
289
290
291 if (myCurr.isDeleted()) {
292 continue;
293 }
294
295
296 final MoneyWiseTransaction myTrans = new MoneyWiseTransaction(this, myCurr);
297 add(myTrans);
298 myTrans.resolveEditSetLinks();
299
300
301 myTrans.adjustMapForItem();
302 }
303 }
304
305 @Override
306 public void postProcessOnUpdate() {
307
308 super.postProcessOnUpdate();
309
310
311 OceanusProfile myTask = theView.getActiveTask();
312 myTask = myTask.startTask("updateAnalysis");
313
314
315 try {
316
317 myTask.startTask("sortTransactions");
318 reSort();
319
320
321 myTask.startTask("UpdateMaps");
322 theView.getData().updateMaps();
323
324
325 myTask.startTask("analyseData");
326 final MoneyWiseAnalysisTransAnalyser myAnalyser = new MoneyWiseAnalysisTransAnalyser(myTask, theEditSet, theView.getPreferenceManager());
327 final MoneyWiseAnalysis myAnalysis = myAnalyser.getAnalysis();
328 theManager = new MoneyWiseAnalysisManager(myAnalysis);
329 theAnalysis = theManager.getRangedAnalysis(theRange);
330
331
332 myTask.startTask("Notify");
333 theEventManager.fireEvent(PrometheusDataEvent.ADJUSTVISIBILITY);
334
335
336 } catch (OceanusException e) {
337 LOGGER.error("Failed to analyse changes", e);
338 }
339 }
340 }
341 }