1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 package com.mindtree.techworks.insight.preferences;
26
27 import java.util.ArrayList;
28 import java.util.Collection;
29 import java.util.HashMap;
30 import java.util.Iterator;
31 import java.util.LinkedList;
32 import java.util.List;
33 import java.util.Map;
34
35 import com.mindtree.techworks.insight.preferences.model.Preference;
36 import com.mindtree.techworks.insight.preferences.model.PreferenceInfo;
37 import com.mindtree.techworks.insight.preferences.model.PreferenceModelManager;
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 public class PreferenceManager implements PreferenceModelManager {
58
59
60
61
62 private static PreferenceManager instance = null;
63
64
65
66
67
68 private static final String LISTENER_KEY_SEPERATOR = "_";
69
70
71
72
73
74 private static final int MAX_DIRTY_PREFERENCES = 5;
75
76
77
78
79 private HashMap preferenceCache = null;
80
81
82
83
84
85 private HashMap attributeChangeListeners = null;
86
87
88
89
90
91 private HashMap preferenceChangeListeners = null;
92
93
94
95
96 private LinkedList preferenceChangesToNotify = new LinkedList();
97
98
99
100
101 private boolean lockPreferenceNotifications = false;
102
103
104
105
106 private List dirtyPreferences = null;
107
108
109
110
111 private int totalDirtyCount;
112
113
114
115
116 private Map preferenceNameMap = null;
117
118
119
120
121 private boolean isAllPreferencesLoaded = false;
122
123
124
125
126 private PreferenceManager () {
127
128 preferenceCache = new HashMap();
129 attributeChangeListeners = new HashMap();
130 preferenceChangeListeners = new HashMap();
131 dirtyPreferences = new ArrayList();
132 }
133
134
135
136
137
138
139 public static PreferenceManager getInstance () {
140
141 if (null == instance) {
142
143 synchronized (PreferenceManager.class) {
144 if (null == instance) {
145 instance = new PreferenceManager();
146 }
147 }
148 }
149 return instance;
150 }
151
152
153
154
155 private void storePreferences () {
156
157
158 synchronized (dirtyPreferences) {
159 List preferencesToStore = new ArrayList();
160 for (Iterator dirtyPreferencesItr = dirtyPreferences.iterator(); dirtyPreferencesItr
161 .hasNext();) {
162 String completeDirtyPreferenceId = (String) dirtyPreferencesItr
163 .next();
164 String dirtyPreferenceId = completeDirtyPreferenceId;
165 int idIndex = completeDirtyPreferenceId
166 .indexOf(Preference.ID_SEPERATOR);
167 if (idIndex > -1) {
168 dirtyPreferenceId = completeDirtyPreferenceId.substring(0,
169 idIndex);
170 }
171 preferencesToStore.add(preferenceCache.get(dirtyPreferenceId));
172 }
173 PreferenceDataHandler dataHandler = null;
174 try {
175 dataHandler = PreferenceDataHandlerFactory.getDefaultHandler();
176 dataHandler.savePreferences(preferencesToStore);
177 } catch (PreferenceHandlerInstantiationException e) {
178 e.printStackTrace();
179 } catch (PreferenceHandlerStoreException e) {
180
181 e.printStackTrace();
182 }
183 totalDirtyCount = 0;
184 }
185 }
186
187
188
189
190
191
192
193 public Preference getPreference (String preferenceId) {
194
195 Preference preferenceToReturn = null;
196
197 if (!preferenceCache.containsKey(preferenceId)) {
198 loadPreference(preferenceId);
199 }
200 preferenceToReturn = (Preference) preferenceCache.get(preferenceId);
201
202 int parentLocation = preferenceId.indexOf(Preference.ID_SEPERATOR);
203
204 if (null == preferenceToReturn && parentLocation > 0) {
205 String parentPreferenceId = preferenceId.substring(0,
206 parentLocation);
207 if (!preferenceCache.containsKey(parentPreferenceId)) {
208 loadPreference(parentPreferenceId);
209 }
210 Preference parentPreference = (Preference) preferenceCache
211 .get(parentPreferenceId);
212 preferenceToReturn = parentPreference
213 .getPreferenceById(preferenceId
214 .substring(parentLocation + 1));
215 }
216
217 return preferenceToReturn;
218 }
219
220
221
222
223
224
225 private void loadPreference (String preferenceId) {
226
227 PreferenceDataHandler dataHandler = null;
228 Preference preference = null;
229 try {
230 dataHandler = PreferenceDataHandlerFactory.getDefaultHandler();
231 preference = dataHandler.getPreference(preferenceId);
232 } catch (PreferenceHandlerInstantiationException e) {
233 e.printStackTrace();
234 }
235 if (null != preference) {
236 preference.registerPreferenceModelManager(this);
237 preferenceCache.put(preferenceId, preference);
238 }
239 }
240
241
242
243
244
245
246
247
248 public Collection getAllPreferenceNames () {
249
250 Collection preferenceNameList = null;
251
252 if (null == preferenceNameMap) {
253 PreferenceDataHandler dataHandler = null;
254 try {
255 dataHandler = PreferenceDataHandlerFactory.getDefaultHandler();
256 preferenceNameList = dataHandler.getPreferenceNameList();
257
258 preferenceNameMap = new HashMap();
259 for (Iterator preferenceNameItr = preferenceNameList.iterator(); preferenceNameItr
260 .hasNext();) {
261 PreferenceInfo preferenceInfo = (PreferenceInfo) preferenceNameItr
262 .next();
263 preferenceNameMap.put(preferenceInfo.getId(),
264 preferenceInfo);
265 }
266 } catch (PreferenceHandlerInstantiationException e) {
267 e.printStackTrace();
268 }
269 } else {
270 preferenceNameList = preferenceNameMap.values();
271 }
272
273 return preferenceNameList;
274 }
275
276
277
278
279
280
281 public Collection getAllPreferences () {
282
283 if (!isAllPreferencesLoaded) {
284
285
286 if (null == preferenceNameMap) {
287
288 getAllPreferenceNames();
289 }
290
291
292 PreferenceDataHandler dataHandler = null;
293 try {
294 dataHandler = PreferenceDataHandlerFactory.getDefaultHandler();
295 Collection allPreferences = dataHandler.getAllPreferences();
296 for (Iterator allPreferencesIterator = allPreferences
297 .iterator(); allPreferencesIterator.hasNext();) {
298 Preference preference = (Preference) allPreferencesIterator
299 .next();
300 if (!preferenceCache.containsKey(preference.getId())) {
301 preference.registerPreferenceModelManager(this);
302 preferenceCache.put(preference.getId(), preference);
303 }
304 }
305
306 } catch (PreferenceHandlerInstantiationException e) {
307 e.printStackTrace();
308 }
309
310 isAllPreferencesLoaded = true;
311 }
312 return preferenceCache.values();
313 }
314
315
316
317
318
319
320
321
322
323
324 public void registerListener (String completePreferenceId,
325 String attributeId, PreferenceAttributeChangeListener listener) {
326
327 String key = completePreferenceId + LISTENER_KEY_SEPERATOR
328 + attributeId;
329 ArrayList listenerList = null;
330 if (attributeChangeListeners.containsKey(key)) {
331 listenerList = (ArrayList) attributeChangeListeners.get(key);
332 } else {
333 listenerList = new ArrayList();
334 }
335
336 if (!listenerList.contains(listener)) {
337 listenerList.add(listener);
338 attributeChangeListeners.put(key, listenerList);
339 }
340 }
341
342
343
344
345
346
347
348
349
350
351 public void deregisterListener (String completePreferenceId,
352 String attributeId, PreferenceAttributeChangeListener listener) {
353
354 String key = completePreferenceId + LISTENER_KEY_SEPERATOR
355 + attributeId;
356 if (attributeChangeListeners.containsKey(key)) {
357 ArrayList listenerList = (ArrayList) attributeChangeListeners
358 .get(key);
359 listenerList.remove(listener);
360 }
361 }
362
363
364
365
366
367
368
369
370 public void registerListener (String completePreferenceId,
371 PreferenceChangeListener listener) {
372
373 ArrayList listenerList = null;
374 if (preferenceChangeListeners.containsKey(completePreferenceId)) {
375 listenerList = (ArrayList) preferenceChangeListeners
376 .get(completePreferenceId);
377 } else {
378 listenerList = new ArrayList();
379 }
380
381 if (!listenerList.contains(listener)) {
382 listenerList.add(listener);
383 preferenceChangeListeners.put(completePreferenceId, listenerList);
384 }
385
386 }
387
388
389
390
391
392
393
394
395 public void deregisterListener (String completePreferenceId,
396 PreferenceChangeListener listener) {
397
398 if (preferenceChangeListeners.containsKey(completePreferenceId)) {
399 ArrayList listenerList = (ArrayList) preferenceChangeListeners
400 .get(completePreferenceId);
401 listenerList.remove(listener);
402 }
403 }
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426 public void attributeValueChanged (String completePreferenceId,
427 String attributeId, String newValue) {
428
429
430 String key = completePreferenceId + LISTENER_KEY_SEPERATOR
431 + attributeId;
432 if (attributeChangeListeners.containsKey(key)) {
433 ArrayList listenerList = (ArrayList) attributeChangeListeners
434 .get(key);
435 for (Iterator listenerIterator = listenerList.iterator(); listenerIterator
436 .hasNext();) {
437 PreferenceAttributeChangeListener listener = (PreferenceAttributeChangeListener) listenerIterator
438 .next();
439 listener.attributeValueChanged(completePreferenceId,
440 attributeId, newValue);
441 }
442 }
443
444
445 notifyPreferenceChangeListeners(completePreferenceId);
446
447
448 if (!dirtyPreferences.contains(completePreferenceId)) {
449 dirtyPreferences.add(completePreferenceId);
450 }
451 totalDirtyCount++ ;
452
453 if (totalDirtyCount >= MAX_DIRTY_PREFERENCES) {
454 storePreferences();
455 }
456 }
457
458
459
460
461
462
463
464
465 public void childPreferenceChanged (String preferenceId,
466 String childPreferenceId, int operation) {
467
468
469 notifyPreferenceChangeListeners(preferenceId);
470
471 String parentPreferenceId = preferenceId;
472 if (preferenceId.indexOf(Preference.ID_SEPERATOR) > -1) {
473 parentPreferenceId = preferenceId.substring(0, preferenceId
474 .indexOf(Preference.ID_SEPERATOR));
475 }
476
477 if (null != preferenceNameMap
478 && preferenceCache.containsKey(parentPreferenceId)) {
479
480 Preference preference = (Preference) preferenceCache
481 .get(parentPreferenceId);
482 preferenceNameMap.put(parentPreferenceId, preference
483 .getPreferenceInfo());
484 }
485
486
487 if (!dirtyPreferences.contains(preferenceId)) {
488 dirtyPreferences.add(preferenceId);
489 }
490 totalDirtyCount++ ;
491
492 if (totalDirtyCount >= MAX_DIRTY_PREFERENCES) {
493 storePreferences();
494 }
495
496 }
497
498
499
500
501
502 public void applicationShuttingDown () {
503
504 if (totalDirtyCount > 0) {
505 storePreferences();
506 }
507 }
508
509
510
511
512
513 public void preferenceAttributeChanged (String preferenceId,
514 String preferenceAttributeId, int operation) {
515
516
517 notifyPreferenceChangeListeners(preferenceId);
518
519
520 if (!dirtyPreferences.contains(preferenceId)) {
521 dirtyPreferences.add(preferenceId);
522 }
523 totalDirtyCount++ ;
524
525 if (totalDirtyCount >= MAX_DIRTY_PREFERENCES) {
526 storePreferences();
527 }
528 }
529
530
531
532
533 public void startPreferencesSave () {
534
535 lockPreferenceNotifications = true;
536 }
537
538
539
540
541 public void endPreferencesSave () {
542 lockPreferenceNotifications = false;
543 if (!preferenceChangesToNotify.isEmpty()) {
544 for (int i = preferenceChangesToNotify.size(); i >0; i--) {
545 notifyPreferenceChangeListeners((String) preferenceChangesToNotify.removeFirst());
546 }
547 }
548 }
549
550
551
552
553
554 private void notifyPreferenceChangeListeners(String completePreferenceId) {
555 if (lockPreferenceNotifications) {
556 if (!preferenceChangesToNotify.contains(completePreferenceId)) {
557 preferenceChangesToNotify.addLast(completePreferenceId);
558 }
559 } else {
560 Iterator keys = preferenceChangeListeners.keySet().iterator();
561 while (keys.hasNext()) {
562 String key = (String) keys.next();
563 if (completePreferenceId.startsWith(key)) {
564 Iterator listeners = ((List) preferenceChangeListeners.get(key)).iterator();
565 while (listeners.hasNext()) {
566 ((PreferenceChangeListener) listeners.next()).preferenceChanged(key);
567 }
568 }
569 }
570 }
571 }
572
573 }