1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.github.tonywasher.joceanus.metis.preference;
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.logger.OceanusLogManager;
25 import io.github.tonywasher.joceanus.oceanus.logger.OceanusLogger;
26 import io.github.tonywasher.joceanus.metis.field.MetisFieldItem;
27 import io.github.tonywasher.joceanus.metis.field.MetisFieldSet;
28 import io.github.tonywasher.joceanus.metis.viewer.MetisViewerManager;
29
30 import java.lang.reflect.Constructor;
31 import java.lang.reflect.InvocationTargetException;
32 import java.util.Collection;
33 import java.util.HashMap;
34 import java.util.Map;
35
36
37
38
39
40
41 public class MetisPreferenceManager
42 implements MetisFieldItem, OceanusEventProvider<MetisPreferenceEvent> {
43
44
45
46 private static final OceanusLogger LOGGER = OceanusLogManager.getLogger(MetisPreferenceManager.class);
47
48
49
50
51 private final MetisFieldSet<MetisPreferenceManager> theFields;
52
53
54
55
56 private static final String ERROR_LOAD = "Failed to load preference Set";
57
58
59
60
61 private final OceanusEventManager<MetisPreferenceEvent> theEventManager;
62
63
64
65
66 private final MetisViewerManager theViewerManager;
67
68
69
70
71 private final Map<String, MetisPreferenceSet> theMap = new HashMap<>();
72
73
74
75
76
77
78
79 public MetisPreferenceManager(final MetisViewerManager pViewer) throws OceanusException {
80 theViewerManager = pViewer;
81 theEventManager = new OceanusEventManager<>();
82 theFields = MetisFieldSet.newFieldSet(this);
83 }
84
85 @Override
86 public MetisFieldSet<MetisPreferenceManager> getDataFieldSet() {
87 return theFields;
88 }
89
90 @Override
91 public String formatObject(final OceanusDataFormatter pFormatter) {
92 return theFields.getName();
93 }
94
95 @Override
96 public OceanusEventRegistrar<MetisPreferenceEvent> getEventRegistrar() {
97 return theEventManager.getEventRegistrar();
98 }
99
100
101
102
103
104
105 protected MetisViewerManager getViewer() {
106 return theViewerManager;
107 }
108
109
110
111
112
113
114 public Collection<MetisPreferenceSet> getPreferenceSets() {
115 return theMap.values();
116 }
117
118
119
120
121
122
123
124
125 public <X extends MetisPreferenceSet> X getPreferenceSet(final Class<X> pClazz) {
126
127 synchronized (this) {
128
129 final String myName = pClazz.getSimpleName();
130 X mySet = pClazz.cast(theMap.get(myName));
131
132
133 if (mySet == null) {
134
135 mySet = newPreferenceSet(myName, pClazz);
136 }
137
138
139 return mySet;
140 }
141 }
142
143
144
145
146
147
148
149
150
151 private <X extends MetisPreferenceSet> X newPreferenceSet(final String pName,
152 final Class<X> pClazz) {
153
154 try {
155
156 final Constructor<X> myConstructor = pClazz.getConstructor(MetisPreferenceManager.class);
157
158
159 final X mySet = myConstructor.newInstance(this);
160
161
162 theMap.put(pName, mySet);
163
164
165 theFields.declareLocalField(pName, m -> mySet);
166
167
168 theEventManager.fireEvent(MetisPreferenceEvent.NEWSET, mySet);
169
170
171 return mySet;
172
173 } catch (IllegalAccessException
174 | InstantiationException
175 | NoSuchMethodException
176 | SecurityException
177 | IllegalArgumentException
178 | InvocationTargetException e) {
179 LOGGER.error(ERROR_LOAD, e);
180 return null;
181 }
182 }
183 }