1 package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard;
3 import java.util.HashMap;
5 import java.util.Map.Entry;
6 import java.util.function.BiFunction;
7 import java.util.function.Function;
9 import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
10 import net.mograsim.logic.model.serializing.IdentifierGetter;
11 import net.mograsim.logic.model.snippets.HighLevelStateHandler;
12 import net.mograsim.logic.model.snippets.SnippetDefinintion;
13 import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers;
14 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler;
15 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler.AtomicHighLevelStateHandlerParams;
16 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler;
17 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler.SubcomponentHighLevelStateHandlerParams;
19 public class StandardHighLevelStateHandler implements HighLevelStateHandler
21 private final SubmodelComponent component;
22 private final Map<String, SubcomponentHighLevelStateHandler> subcomponentHighLevelStateHandlers;
23 private final Map<String, AtomicHighLevelStateHandler> atomicHighLevelStateHandlers;
25 public StandardHighLevelStateHandler(SubmodelComponent component)
27 this(component, null);
30 public StandardHighLevelStateHandler(SubmodelComponent component, StandardHighLevelStateHandlerParams params)
32 this.component = component;
33 this.subcomponentHighLevelStateHandlers = new HashMap<>();
34 this.atomicHighLevelStateHandlers = new HashMap<>();
37 params.subcomponentHighLevelStates.forEach(this::addSubcomponentHighLevelState);
38 params.atomicHighLevelStates.forEach(this::addAtomicHighLevelState);
42 public SubcomponentHighLevelStateHandler addSubcomponentHighLevelState(String subcomponentStateID,
43 SubcomponentHighLevelStateHandlerParams handlerParams)
45 return addSubcomponentHighLevelState(subcomponentStateID,
46 StandardHighLevelStateHandlerSnippetSuppliers.subcomponentHandlerSupplier.getSnippetSupplier(handlerParams.id)::create,
47 handlerParams.params);
50 public <P, H extends SubcomponentHighLevelStateHandler> H addSubcomponentHighLevelState(String subcomponentStateID,
51 BiFunction<HighLevelStateHandlerContext, P, H> handlerConstructor, P handlerParams)
53 return addSubcomponentHighLevelState(subcomponentStateID, c -> handlerConstructor.apply(c, handlerParams));
56 public <H extends SubcomponentHighLevelStateHandler> H addSubcomponentHighLevelState(String subcomponentStateID,
57 Function<HighLevelStateHandlerContext, H> handlerConstructor)
59 HighLevelStateHandlerContext context = new HighLevelStateHandlerContext(component, subcomponentStateID);
60 H handler = handlerConstructor.apply(context);
61 addSubcomponentHighLevelState(subcomponentStateID, handler);
65 public void addSubcomponentHighLevelState(String subcomponentStateID, SubcomponentHighLevelStateHandler handler)
67 checkHighLevelStateIDPart(subcomponentStateID);
68 subcomponentHighLevelStateHandlers.put(subcomponentStateID, handler);
71 public AtomicHighLevelStateHandler addAtomicHighLevelState(String atomicStateID, AtomicHighLevelStateHandlerParams handlerParams)
73 return addAtomicHighLevelState(atomicStateID,
74 StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier.getSnippetSupplier(handlerParams.id)::create,
75 handlerParams.params);
78 public <P, H extends AtomicHighLevelStateHandler> H addAtomicHighLevelState(String subcomponentStateID,
79 BiFunction<HighLevelStateHandlerContext, P, H> handlerConstructor, P handlerParams)
81 return addAtomicHighLevelState(subcomponentStateID, c -> handlerConstructor.apply(c, handlerParams));
84 public <H extends AtomicHighLevelStateHandler> H addAtomicHighLevelState(String subcomponentStateID,
85 Function<HighLevelStateHandlerContext, H> handlerConstructor)
87 HighLevelStateHandlerContext context = new HighLevelStateHandlerContext(component, subcomponentStateID);
88 H handler = handlerConstructor.apply(context);
89 addAtomicHighLevelState(subcomponentStateID, handler);
93 public void addAtomicHighLevelState(String atomicStateID, AtomicHighLevelStateHandler handler)
95 checkHighLevelStateIDPart(atomicStateID);
96 atomicHighLevelStateHandlers.put(atomicStateID, handler);
99 private static void checkHighLevelStateIDPart(String stateIDPart)
101 if (stateIDPart.indexOf('.') != -1)
102 throw new IllegalArgumentException("Illegal high level state ID part (contains dot): " + stateIDPart);
106 public Object getHighLevelState(String stateID)
108 int indexOfDot = stateID.indexOf('.');
109 if (indexOfDot == -1)
111 AtomicHighLevelStateHandler handler = atomicHighLevelStateHandlers.get(stateID);
113 return handler.getHighLevelState();
116 SubcomponentHighLevelStateHandler handler = subcomponentHighLevelStateHandlers.get(stateID.substring(0, indexOfDot));
118 return handler.getHighLevelState(stateID.substring(indexOfDot + 1));
120 throw new IllegalArgumentException("No high level state with ID " + stateID);
124 public void setHighLevelState(String stateID, Object newState)
126 int indexOfDot = stateID.indexOf('.');
127 if (indexOfDot == -1)
129 AtomicHighLevelStateHandler handler = atomicHighLevelStateHandlers.get(stateID);
131 handler.setHighLevelState(newState);
133 throw new IllegalArgumentException("No high level state with ID " + stateID);
136 SubcomponentHighLevelStateHandler handler = subcomponentHighLevelStateHandlers.get(stateID.substring(0, indexOfDot));
138 handler.setHighLevelState(stateID.substring(indexOfDot + 1), newState);
140 throw new IllegalArgumentException("No high level state with ID " + stateID);
145 public StandardHighLevelStateHandlerParams getParamsForSerializing(IdentifierGetter idGetter)
147 StandardHighLevelStateHandlerParams params = new StandardHighLevelStateHandlerParams();
148 params.subcomponentHighLevelStates = new HashMap<>();
149 params.atomicHighLevelStates = new HashMap<>();
150 for (Entry<String, SubcomponentHighLevelStateHandler> e : subcomponentHighLevelStateHandlers.entrySet())
152 String stateID = e.getKey();
153 SubcomponentHighLevelStateHandler handler = e.getValue();
154 SubcomponentHighLevelStateHandlerParams handlerParams = new SubcomponentHighLevelStateHandlerParams();
155 handlerParams.id = idGetter.subcomponentHighLevelStateHandlerIDs.apply(handler);
156 handlerParams.params = handler.getParamsForSerializingJSON(idGetter);
157 params.subcomponentHighLevelStates.put(stateID, handlerParams);
159 for (Entry<String, AtomicHighLevelStateHandler> e : atomicHighLevelStateHandlers.entrySet())
161 String stateID = e.getKey();
162 AtomicHighLevelStateHandler handler = e.getValue();
163 AtomicHighLevelStateHandlerParams handlerParams = new AtomicHighLevelStateHandlerParams();
164 handlerParams.id = idGetter.atomicHighLevelStateHandlerIDs.apply(handler);
165 handlerParams.params = handler.getParamsForSerializingJSON(idGetter);
166 params.atomicHighLevelStates.put(stateID, handlerParams);
171 public static class StandardHighLevelStateHandlerParams
173 public Map<String, SubcomponentHighLevelStateHandlerParams> subcomponentHighLevelStates;
174 public Map<String, AtomicHighLevelStateHandlerParams> atomicHighLevelStates;
179 SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier.setSnippetSupplier(
180 StandardHighLevelStateHandler.class.getCanonicalName(),
181 SnippetDefinintion.create(StandardHighLevelStateHandlerParams.class, StandardHighLevelStateHandler::new));