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.Function;
11 import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
12 import net.mograsim.logic.model.serializing.IdentifyParams;
13 import net.mograsim.logic.model.snippets.HighLevelStateHandler;
14 import net.mograsim.logic.model.snippets.SnippetDefinintion;
15 import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers;
16 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler;
17 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler.AtomicHighLevelStateHandlerParams;
18 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler;
19 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler.SubcomponentHighLevelStateHandlerParams;
21 public class StandardHighLevelStateHandler implements HighLevelStateHandler
23 private final SubmodelComponent component;
24 private final Map<String, SubcomponentHighLevelStateHandler> subcomponentHighLevelStateHandlers;
25 private final Map<String, SubcomponentHighLevelStateHandler> subcomponentHighLevelStateHandlersUnmodifiable;
26 private final Map<String, AtomicHighLevelStateHandler> atomicHighLevelStateHandlers;
27 private final Map<String, AtomicHighLevelStateHandler> atomicHighLevelStateHandlersUnmodifiable;
29 public StandardHighLevelStateHandler(SubmodelComponent component)
31 this(component, null);
34 public StandardHighLevelStateHandler(SubmodelComponent component, StandardHighLevelStateHandlerParams params)
36 this.component = component;
37 this.subcomponentHighLevelStateHandlers = new HashMap<>();
38 this.subcomponentHighLevelStateHandlersUnmodifiable = Collections.unmodifiableMap(subcomponentHighLevelStateHandlers);
39 this.atomicHighLevelStateHandlers = new HashMap<>();
40 this.atomicHighLevelStateHandlersUnmodifiable = Collections.unmodifiableMap(atomicHighLevelStateHandlers);
43 params.subcomponentHighLevelStates.forEach(this::addSubcomponentHighLevelState);
44 params.atomicHighLevelStates.forEach(this::addAtomicHighLevelState);
48 public SubcomponentHighLevelStateHandler addSubcomponentHighLevelState(String subcomponentStateID,
49 SubcomponentHighLevelStateHandlerParams handlerParams)
51 return addSubcomponentHighLevelState(subcomponentStateID,
52 StandardHighLevelStateHandlerSnippetSuppliers.subcomponentHandlerSupplier.getSnippetSupplier(handlerParams.id)::create,
53 handlerParams.params);
56 public <P, H extends SubcomponentHighLevelStateHandler> H addSubcomponentHighLevelState(String subcomponentStateID,
57 BiFunction<HighLevelStateHandlerContext, P, H> handlerConstructor, P handlerParams)
59 return addSubcomponentHighLevelState(subcomponentStateID, c -> handlerConstructor.apply(c, handlerParams));
62 public <H extends SubcomponentHighLevelStateHandler> H addSubcomponentHighLevelState(String subcomponentStateID,
63 Function<HighLevelStateHandlerContext, H> handlerConstructor)
65 HighLevelStateHandlerContext context = new HighLevelStateHandlerContext(component, subcomponentStateID);
66 H handler = handlerConstructor.apply(context);
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<HighLevelStateHandlerContext, 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<HighLevelStateHandlerContext, H> handlerConstructor)
104 HighLevelStateHandlerContext context = new HighLevelStateHandlerContext(component, subcomponentStateID);
105 H handler = handlerConstructor.apply(context);
106 addAtomicHighLevelState(subcomponentStateID, handler);
110 public void addAtomicHighLevelState(String atomicStateID, AtomicHighLevelStateHandler handler)
112 checkHighLevelStateIDPart(atomicStateID);
113 atomicHighLevelStateHandlers.put(atomicStateID, handler);
116 public void removeAtomicHighLevelState(String atomicStateID)
118 checkHighLevelStateIDPart(atomicStateID);
119 atomicHighLevelStateHandlers.remove(atomicStateID);
122 public Map<String, AtomicHighLevelStateHandler> getAtomicHighLevelStates()
124 return atomicHighLevelStateHandlersUnmodifiable;
127 private static void checkHighLevelStateIDPart(String stateIDPart)
129 if (stateIDPart.indexOf('.') != -1)
130 throw new IllegalArgumentException("Illegal high level state ID part (contains dot): " + stateIDPart);
134 public Object getHighLevelState(String stateID)
136 int indexOfDot = stateID.indexOf('.');
137 if (indexOfDot == -1)
139 AtomicHighLevelStateHandler handler = atomicHighLevelStateHandlers.get(stateID);
141 return handler.getHighLevelState();
144 SubcomponentHighLevelStateHandler handler = subcomponentHighLevelStateHandlers.get(stateID.substring(0, indexOfDot));
146 return handler.getHighLevelState(stateID.substring(indexOfDot + 1));
148 throw new IllegalArgumentException("No high level state with ID " + stateID);
152 public void setHighLevelState(String stateID, Object newState)
154 int indexOfDot = stateID.indexOf('.');
155 if (indexOfDot == -1)
157 AtomicHighLevelStateHandler handler = atomicHighLevelStateHandlers.get(stateID);
159 handler.setHighLevelState(newState);
161 throw new IllegalArgumentException("No high level state with ID " + stateID);
164 SubcomponentHighLevelStateHandler handler = subcomponentHighLevelStateHandlers.get(stateID.substring(0, indexOfDot));
166 handler.setHighLevelState(stateID.substring(indexOfDot + 1), newState);
168 throw new IllegalArgumentException("No high level state with ID " + stateID);
173 public String getIDForSerializing(IdentifyParams idParams)
179 public StandardHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams)
181 StandardHighLevelStateHandlerParams params = new StandardHighLevelStateHandlerParams();
182 params.subcomponentHighLevelStates = new TreeMap<>();
183 params.atomicHighLevelStates = new TreeMap<>();
184 for (Entry<String, SubcomponentHighLevelStateHandler> e : subcomponentHighLevelStateHandlers.entrySet())
186 String stateID = e.getKey();
187 SubcomponentHighLevelStateHandler handler = e.getValue();
188 SubcomponentHighLevelStateHandlerParams handlerParams = new SubcomponentHighLevelStateHandlerParams();
189 handlerParams.id = handler.getIDForSerializing(idParams);
190 handlerParams.params = handler.getParamsForSerializingJSON(idParams);
191 params.subcomponentHighLevelStates.put(stateID, handlerParams);
193 for (Entry<String, AtomicHighLevelStateHandler> e : atomicHighLevelStateHandlers.entrySet())
195 String stateID = e.getKey();
196 AtomicHighLevelStateHandler handler = e.getValue();
197 AtomicHighLevelStateHandlerParams handlerParams = new AtomicHighLevelStateHandlerParams();
198 handlerParams.id = handler.getIDForSerializing(idParams);
199 handlerParams.params = handler.getParamsForSerializingJSON(idParams);
200 params.atomicHighLevelStates.put(stateID, handlerParams);
205 public static class StandardHighLevelStateHandlerParams
207 public Map<String, SubcomponentHighLevelStateHandlerParams> subcomponentHighLevelStates;
208 public Map<String, AtomicHighLevelStateHandlerParams> atomicHighLevelStates;
213 SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier.setSnippetSupplier(
214 StandardHighLevelStateHandler.class.getCanonicalName(),
215 SnippetDefinintion.create(StandardHighLevelStateHandlerParams.class, StandardHighLevelStateHandler::new));