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.function.BiFunction;
8 import java.util.function.Function;
10 import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
11 import net.mograsim.logic.model.serializing.IdentifyParams;
12 import net.mograsim.logic.model.snippets.HighLevelStateHandler;
13 import net.mograsim.logic.model.snippets.SnippetDefinintion;
14 import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers;
15 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler;
16 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler.AtomicHighLevelStateHandlerParams;
17 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler;
18 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler.SubcomponentHighLevelStateHandlerParams;
20 public class StandardHighLevelStateHandler implements HighLevelStateHandler
22 private final SubmodelComponent component;
23 private final Map<String, SubcomponentHighLevelStateHandler> subcomponentHighLevelStateHandlers;
24 private final Map<String, SubcomponentHighLevelStateHandler> subcomponentHighLevelStateHandlersUnmodifiable;
25 private final Map<String, AtomicHighLevelStateHandler> atomicHighLevelStateHandlers;
26 private final Map<String, AtomicHighLevelStateHandler> atomicHighLevelStateHandlersUnmodifiable;
28 public StandardHighLevelStateHandler(SubmodelComponent component)
30 this(component, null);
33 public StandardHighLevelStateHandler(SubmodelComponent component, StandardHighLevelStateHandlerParams params)
35 this.component = component;
36 this.subcomponentHighLevelStateHandlers = new HashMap<>();
37 this.subcomponentHighLevelStateHandlersUnmodifiable = Collections.unmodifiableMap(subcomponentHighLevelStateHandlers);
38 this.atomicHighLevelStateHandlers = new HashMap<>();
39 this.atomicHighLevelStateHandlersUnmodifiable = Collections.unmodifiableMap(atomicHighLevelStateHandlers);
42 params.subcomponentHighLevelStates.forEach(this::addSubcomponentHighLevelState);
43 params.atomicHighLevelStates.forEach(this::addAtomicHighLevelState);
47 public SubcomponentHighLevelStateHandler addSubcomponentHighLevelState(String subcomponentStateID,
48 SubcomponentHighLevelStateHandlerParams handlerParams)
50 return addSubcomponentHighLevelState(subcomponentStateID,
51 StandardHighLevelStateHandlerSnippetSuppliers.subcomponentHandlerSupplier.getSnippetSupplier(handlerParams.id)::create,
52 handlerParams.params);
55 public <P, H extends SubcomponentHighLevelStateHandler> H addSubcomponentHighLevelState(String subcomponentStateID,
56 BiFunction<HighLevelStateHandlerContext, P, H> handlerConstructor, P handlerParams)
58 return addSubcomponentHighLevelState(subcomponentStateID, c -> handlerConstructor.apply(c, handlerParams));
61 public <H extends SubcomponentHighLevelStateHandler> H addSubcomponentHighLevelState(String subcomponentStateID,
62 Function<HighLevelStateHandlerContext, H> handlerConstructor)
64 HighLevelStateHandlerContext context = new HighLevelStateHandlerContext(component, subcomponentStateID);
65 H handler = handlerConstructor.apply(context);
66 addSubcomponentHighLevelState(subcomponentStateID, handler);
70 public void addSubcomponentHighLevelState(String subcomponentStateID, SubcomponentHighLevelStateHandler handler)
72 checkHighLevelStateIDPart(subcomponentStateID);
73 subcomponentHighLevelStateHandlers.put(subcomponentStateID, handler);
76 public void removeSubcomponentHighLevelState(String subcomponentStateID)
78 checkHighLevelStateIDPart(subcomponentStateID);
79 subcomponentHighLevelStateHandlers.remove(subcomponentStateID);
82 public Map<String, SubcomponentHighLevelStateHandler> getSubcomponentHighLevelStates()
84 return subcomponentHighLevelStateHandlersUnmodifiable;
87 public AtomicHighLevelStateHandler addAtomicHighLevelState(String atomicStateID, AtomicHighLevelStateHandlerParams handlerParams)
89 return addAtomicHighLevelState(atomicStateID,
90 StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier.getSnippetSupplier(handlerParams.id)::create,
91 handlerParams.params);
94 public <P, H extends AtomicHighLevelStateHandler> H addAtomicHighLevelState(String subcomponentStateID,
95 BiFunction<HighLevelStateHandlerContext, P, H> handlerConstructor, P handlerParams)
97 return addAtomicHighLevelState(subcomponentStateID, c -> handlerConstructor.apply(c, handlerParams));
100 public <H extends AtomicHighLevelStateHandler> H addAtomicHighLevelState(String subcomponentStateID,
101 Function<HighLevelStateHandlerContext, H> handlerConstructor)
103 HighLevelStateHandlerContext context = new HighLevelStateHandlerContext(component, subcomponentStateID);
104 H handler = handlerConstructor.apply(context);
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 getHighLevelState(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 setHighLevelState(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 String getIDForSerializing(IdentifyParams idParams)
178 public StandardHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams)
180 StandardHighLevelStateHandlerParams params = new StandardHighLevelStateHandlerParams();
181 params.subcomponentHighLevelStates = new HashMap<>();
182 params.atomicHighLevelStates = new HashMap<>();
183 for (Entry<String, SubcomponentHighLevelStateHandler> e : subcomponentHighLevelStateHandlers.entrySet())
185 String stateID = e.getKey();
186 SubcomponentHighLevelStateHandler handler = e.getValue();
187 SubcomponentHighLevelStateHandlerParams handlerParams = new SubcomponentHighLevelStateHandlerParams();
188 handlerParams.id = handler.getIDForSerializing(idParams);
189 handlerParams.params = handler.getParamsForSerializingJSON(idParams);
190 params.subcomponentHighLevelStates.put(stateID, handlerParams);
192 for (Entry<String, AtomicHighLevelStateHandler> e : atomicHighLevelStateHandlers.entrySet())
194 String stateID = e.getKey();
195 AtomicHighLevelStateHandler handler = e.getValue();
196 AtomicHighLevelStateHandlerParams handlerParams = new AtomicHighLevelStateHandlerParams();
197 handlerParams.id = handler.getIDForSerializing(idParams);
198 handlerParams.params = handler.getParamsForSerializingJSON(idParams);
199 params.atomicHighLevelStates.put(stateID, handlerParams);
204 public static class StandardHighLevelStateHandlerParams
206 public Map<String, SubcomponentHighLevelStateHandlerParams> subcomponentHighLevelStates;
207 public Map<String, AtomicHighLevelStateHandlerParams> atomicHighLevelStates;
212 SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier.setSnippetSupplier(
213 StandardHighLevelStateHandler.class.getCanonicalName(),
214 SnippetDefinintion.create(StandardHighLevelStateHandlerParams.class, StandardHighLevelStateHandler::new));