1 package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard;
3 import java.util.Collections;
4 import java.util.HashMap;
6 import java.util.Map.Entry;
7 import java.util.TreeMap;
8 import java.util.function.BiFunction;
9 import java.util.function.Consumer;
10 import java.util.function.Function;
12 import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
13 import net.mograsim.logic.model.serializing.IdentifyParams;
14 import net.mograsim.logic.model.snippets.HighLevelStateHandler;
15 import net.mograsim.logic.model.snippets.SnippetDefinintion;
16 import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers;
17 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler;
18 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler.AtomicHighLevelStateHandlerParams;
19 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler;
20 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler.SubcomponentHighLevelStateHandlerParams;
22 public class StandardHighLevelStateHandler implements HighLevelStateHandler
24 private final SubmodelComponent component;
25 private final Map<String, SubcomponentHighLevelStateHandler> subcomponentHighLevelStateHandlers;
26 private final Map<String, SubcomponentHighLevelStateHandler> subcomponentHighLevelStateHandlersUnmodifiable;
27 private final Map<String, AtomicHighLevelStateHandler> atomicHighLevelStateHandlers;
28 private final Map<String, AtomicHighLevelStateHandler> atomicHighLevelStateHandlersUnmodifiable;
30 public StandardHighLevelStateHandler(SubmodelComponent component)
32 this(component, null);
35 public StandardHighLevelStateHandler(SubmodelComponent component, StandardHighLevelStateHandlerParams params)
37 this.component = component;
38 this.subcomponentHighLevelStateHandlers = new HashMap<>();
39 this.subcomponentHighLevelStateHandlersUnmodifiable = Collections.unmodifiableMap(subcomponentHighLevelStateHandlers);
40 this.atomicHighLevelStateHandlers = new HashMap<>();
41 this.atomicHighLevelStateHandlersUnmodifiable = Collections.unmodifiableMap(atomicHighLevelStateHandlers);
44 params.subcomponentHighLevelStates.forEach(this::addSubcomponentHighLevelState);
45 params.atomicHighLevelStates.forEach(this::addAtomicHighLevelState);
49 public SubcomponentHighLevelStateHandler addSubcomponentHighLevelState(String subcomponentStateID,
50 SubcomponentHighLevelStateHandlerParams handlerParams)
52 return addSubcomponentHighLevelState(subcomponentStateID,
53 StandardHighLevelStateHandlerSnippetSuppliers.subcomponentHandlerSupplier.getSnippetSupplier(handlerParams.id)::create,
54 handlerParams.params);
57 public <P, H extends SubcomponentHighLevelStateHandler> H addSubcomponentHighLevelState(String subcomponentStateID,
58 BiFunction<SubmodelComponent, P, H> handlerConstructor, P handlerParams)
60 return addSubcomponentHighLevelState(subcomponentStateID, c -> handlerConstructor.apply(c, handlerParams));
63 public <H extends SubcomponentHighLevelStateHandler> H addSubcomponentHighLevelState(String subcomponentStateID,
64 Function<SubmodelComponent, H> handlerConstructor)
66 H handler = handlerConstructor.apply(component);
67 addSubcomponentHighLevelState(subcomponentStateID, handler);
71 public void addSubcomponentHighLevelState(String subcomponentStateID, SubcomponentHighLevelStateHandler handler)
73 checkHighLevelStateIDPart(subcomponentStateID);
74 subcomponentHighLevelStateHandlers.put(subcomponentStateID, handler);
77 public void removeSubcomponentHighLevelState(String subcomponentStateID)
79 checkHighLevelStateIDPart(subcomponentStateID);
80 subcomponentHighLevelStateHandlers.remove(subcomponentStateID);
83 public Map<String, SubcomponentHighLevelStateHandler> getSubcomponentHighLevelStates()
85 return subcomponentHighLevelStateHandlersUnmodifiable;
88 public AtomicHighLevelStateHandler addAtomicHighLevelState(String atomicStateID, AtomicHighLevelStateHandlerParams handlerParams)
90 return addAtomicHighLevelState(atomicStateID,
91 StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier.getSnippetSupplier(handlerParams.id)::create,
92 handlerParams.params);
95 public <P, H extends AtomicHighLevelStateHandler> H addAtomicHighLevelState(String subcomponentStateID,
96 BiFunction<SubmodelComponent, P, H> handlerConstructor, P handlerParams)
98 return addAtomicHighLevelState(subcomponentStateID, c -> handlerConstructor.apply(c, handlerParams));
101 public <H extends AtomicHighLevelStateHandler> H addAtomicHighLevelState(String subcomponentStateID,
102 Function<SubmodelComponent, H> handlerConstructor)
104 H handler = handlerConstructor.apply(component);
105 addAtomicHighLevelState(subcomponentStateID, handler);
109 public void addAtomicHighLevelState(String atomicStateID, AtomicHighLevelStateHandler handler)
111 checkHighLevelStateIDPart(atomicStateID);
112 atomicHighLevelStateHandlers.put(atomicStateID, handler);
115 public void removeAtomicHighLevelState(String atomicStateID)
117 checkHighLevelStateIDPart(atomicStateID);
118 atomicHighLevelStateHandlers.remove(atomicStateID);
121 public Map<String, AtomicHighLevelStateHandler> getAtomicHighLevelStates()
123 return atomicHighLevelStateHandlersUnmodifiable;
126 private static void checkHighLevelStateIDPart(String stateIDPart)
128 if (stateIDPart.indexOf('.') != -1)
129 throw new IllegalArgumentException("Illegal high level state ID part (contains dot): " + stateIDPart);
133 public Object get(String stateID)
135 int indexOfDot = stateID.indexOf('.');
136 if (indexOfDot == -1)
138 AtomicHighLevelStateHandler handler = atomicHighLevelStateHandlers.get(stateID);
140 return handler.getHighLevelState();
143 SubcomponentHighLevelStateHandler handler = subcomponentHighLevelStateHandlers.get(stateID.substring(0, indexOfDot));
145 return handler.getHighLevelState(stateID.substring(indexOfDot + 1));
147 throw new IllegalArgumentException("No high level state with ID " + stateID);
151 public void set(String stateID, Object newState)
153 int indexOfDot = stateID.indexOf('.');
154 if (indexOfDot == -1)
156 AtomicHighLevelStateHandler handler = atomicHighLevelStateHandlers.get(stateID);
158 handler.setHighLevelState(newState);
160 throw new IllegalArgumentException("No high level state with ID " + stateID);
163 SubcomponentHighLevelStateHandler handler = subcomponentHighLevelStateHandlers.get(stateID.substring(0, indexOfDot));
165 handler.setHighLevelState(stateID.substring(indexOfDot + 1), newState);
167 throw new IllegalArgumentException("No high level state with ID " + stateID);
172 public void addListener(String stateID, Consumer<Object> stateChanged)
174 int indexOfDot = stateID.indexOf('.');
175 if (indexOfDot == -1)
177 AtomicHighLevelStateHandler handler = atomicHighLevelStateHandlers.get(stateID);
179 handler.addListener(stateChanged);
181 throw new IllegalArgumentException("No high level state with ID " + stateID);
184 SubcomponentHighLevelStateHandler handler = subcomponentHighLevelStateHandlers.get(stateID.substring(0, indexOfDot));
186 handler.addListener(stateID.substring(indexOfDot + 1), stateChanged);
188 throw new IllegalArgumentException("No high level state with ID " + stateID);
193 public void removeListener(String stateID, Consumer<Object> stateChanged)
195 int indexOfDot = stateID.indexOf('.');
196 if (indexOfDot == -1)
198 AtomicHighLevelStateHandler handler = atomicHighLevelStateHandlers.get(stateID);
200 handler.removeListener(stateChanged);
202 throw new IllegalArgumentException("No high level state with ID " + stateID);
205 SubcomponentHighLevelStateHandler handler = subcomponentHighLevelStateHandlers.get(stateID.substring(0, indexOfDot));
207 handler.removeListener(stateID.substring(indexOfDot + 1), stateChanged);
209 throw new IllegalArgumentException("No high level state with ID " + stateID);
214 public String getIDForSerializing(IdentifyParams idParams)
220 public StandardHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams)
222 StandardHighLevelStateHandlerParams params = new StandardHighLevelStateHandlerParams();
223 params.subcomponentHighLevelStates = new TreeMap<>();
224 params.atomicHighLevelStates = new TreeMap<>();
225 for (Entry<String, SubcomponentHighLevelStateHandler> e : subcomponentHighLevelStateHandlers.entrySet())
227 String stateID = e.getKey();
228 SubcomponentHighLevelStateHandler handler = e.getValue();
229 SubcomponentHighLevelStateHandlerParams handlerParams = new SubcomponentHighLevelStateHandlerParams();
230 handlerParams.id = handler.getIDForSerializing(idParams);
231 handlerParams.params = handler.getParamsForSerializingJSON(idParams);
232 params.subcomponentHighLevelStates.put(stateID, handlerParams);
234 for (Entry<String, AtomicHighLevelStateHandler> e : atomicHighLevelStateHandlers.entrySet())
236 String stateID = e.getKey();
237 AtomicHighLevelStateHandler handler = e.getValue();
238 AtomicHighLevelStateHandlerParams handlerParams = new AtomicHighLevelStateHandlerParams();
239 handlerParams.id = handler.getIDForSerializing(idParams);
240 handlerParams.params = handler.getParamsForSerializingJSON(idParams);
241 params.atomicHighLevelStates.put(stateID, handlerParams);
246 public static class StandardHighLevelStateHandlerParams
248 public Map<String, SubcomponentHighLevelStateHandlerParams> subcomponentHighLevelStates;
249 public Map<String, AtomicHighLevelStateHandlerParams> atomicHighLevelStates;
254 SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier.setSnippetSupplier(
255 StandardHighLevelStateHandler.class.getCanonicalName(),
256 SnippetDefinintion.create(StandardHighLevelStateHandlerParams.class, StandardHighLevelStateHandler::new));