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.metis.field.MetisFieldItem;
20 import io.github.tonywasher.joceanus.metis.field.MetisFieldSet;
21 import io.github.tonywasher.joceanus.metis.viewer.MetisViewerManager;
22 import io.github.tonywasher.joceanus.oceanus.base.OceanusException;
23 import io.github.tonywasher.joceanus.oceanus.event.OceanusEventManager;
24 import io.github.tonywasher.joceanus.oceanus.event.OceanusEventRegistrar;
25 import io.github.tonywasher.joceanus.oceanus.event.OceanusEventRegistrar.OceanusEventProvider;
26 import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
27 import io.github.tonywasher.joceanus.oceanus.logger.OceanusLogManager;
28 import io.github.tonywasher.joceanus.oceanus.logger.OceanusLogger;
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 MetisPreferenceParams theParams;
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 theParams = new MetisPreferenceParams(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 MetisPreferenceParams getParameters() {
106 return theParams;
107 }
108
109
110
111
112
113
114 protected void setParameters(final MetisPreferenceParams pParams) {
115 theParams = pParams;
116 }
117
118
119
120
121
122
123 public Collection<MetisPreferenceSet> getPreferenceSets() {
124 return theMap.values();
125 }
126
127
128
129
130
131
132
133
134 public <X extends MetisPreferenceSet> X getPreferenceSet(final Class<X> pClazz) {
135
136 synchronized (this) {
137
138 final String myName = pClazz.getSimpleName();
139 X mySet = pClazz.cast(theMap.get(myName));
140
141
142 if (mySet == null) {
143
144 mySet = newPreferenceSet(myName, pClazz);
145 }
146
147
148 return mySet;
149 }
150 }
151
152
153
154
155
156
157
158
159
160 protected <X extends MetisPreferenceSet> X newPreferenceSet(final String pName,
161 final Class<X> pClazz) {
162
163 try {
164
165 final Constructor<X> myConstructor = pClazz.getConstructor(MetisPreferenceParams.class);
166
167
168 final X mySet = myConstructor.newInstance(theParams);
169
170
171 theMap.put(pName, mySet);
172
173
174 theFields.declareLocalField(pName, m -> mySet);
175
176
177 theEventManager.fireEvent(MetisPreferenceEvent.NEWSET, mySet);
178
179
180 return mySet;
181
182 } catch (IllegalAccessException
183 | InstantiationException
184 | NoSuchMethodException
185 | SecurityException
186 | IllegalArgumentException
187 | InvocationTargetException e) {
188 LOGGER.error(ERROR_LOAD, e);
189 return null;
190 }
191 }
192 }