1 package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard;
3 import java.util.HashMap;
5 import java.util.function.BiFunction;
6 import java.util.function.Function;
8 import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
9 import net.mograsim.logic.model.snippets.HighLevelStateHandler;
10 import net.mograsim.logic.model.snippets.SnippetDefinintion;
11 import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers;
12 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler;
13 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler.AtomicHighLevelStateHandlerParams;
14 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler;
15 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler.SubcomponentHighLevelStateHandlerParams;
17 public class StandardHighLevelStateHandler implements HighLevelStateHandler
19 private final SubmodelComponent component;
20 private final Map<String, SubcomponentHighLevelStateHandler> subcomponentHighLevelStateHandlers;
21 private final Map<String, AtomicHighLevelStateHandler> atomicHighLevelStateHandlers;
23 public StandardHighLevelStateHandler(SubmodelComponent component)
25 this(component, null);
28 public StandardHighLevelStateHandler(SubmodelComponent component, StandardHighLevelStateHandlerParams params)
30 this.component = component;
31 this.subcomponentHighLevelStateHandlers = new HashMap<>();
32 this.atomicHighLevelStateHandlers = new HashMap<>();
35 params.subcomponentHighLevelStates.forEach(this::addSubcomponentHighLevelState);
36 params.atomicHighLevelStates.forEach(this::addAtomicHighLevelState);
40 public SubcomponentHighLevelStateHandler addSubcomponentHighLevelState(String subcomponentStateID,
41 SubcomponentHighLevelStateHandlerParams handlerParams)
43 return addSubcomponentHighLevelState(subcomponentStateID,
44 StandardHighLevelStateHandlerSnippetSuppliers.subcomponentHandlerSupplier.getSnippetSupplier(handlerParams.id)::create,
45 handlerParams.params);
48 public <P, H extends SubcomponentHighLevelStateHandler> H addSubcomponentHighLevelState(String subcomponentStateID,
49 BiFunction<HighLevelStateHandlerContext, P, H> handlerConstructor, P handlerParams)
51 return addSubcomponentHighLevelState(subcomponentStateID, c -> handlerConstructor.apply(c, handlerParams));
54 public <H extends SubcomponentHighLevelStateHandler> H addSubcomponentHighLevelState(String subcomponentStateID,
55 Function<HighLevelStateHandlerContext, H> handlerConstructor)
57 HighLevelStateHandlerContext context = new HighLevelStateHandlerContext(component, subcomponentStateID);
58 H handler = handlerConstructor.apply(context);
59 addSubcomponentHighLevelState(subcomponentStateID, handler);
63 public void addSubcomponentHighLevelState(String subcomponentStateID, SubcomponentHighLevelStateHandler handler)
65 checkHighLevelStateIDPart(subcomponentStateID);
66 subcomponentHighLevelStateHandlers.put(subcomponentStateID, handler);
69 public AtomicHighLevelStateHandler addAtomicHighLevelState(String atomicStateID, AtomicHighLevelStateHandlerParams handlerParams)
71 return addAtomicHighLevelState(atomicStateID,
72 StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier.getSnippetSupplier(handlerParams.id)::create,
73 handlerParams.params);
76 public <P, H extends AtomicHighLevelStateHandler> H addAtomicHighLevelState(String subcomponentStateID,
77 BiFunction<HighLevelStateHandlerContext, P, H> handlerConstructor, P handlerParams)
79 return addAtomicHighLevelState(subcomponentStateID, c -> handlerConstructor.apply(c, handlerParams));
82 public <H extends AtomicHighLevelStateHandler> H addAtomicHighLevelState(String subcomponentStateID,
83 Function<HighLevelStateHandlerContext, H> handlerConstructor)
85 HighLevelStateHandlerContext context = new HighLevelStateHandlerContext(component, subcomponentStateID);
86 H handler = handlerConstructor.apply(context);
87 addAtomicHighLevelState(subcomponentStateID, handler);
91 public void addAtomicHighLevelState(String atomicStateID, AtomicHighLevelStateHandler handler)
93 checkHighLevelStateIDPart(atomicStateID);
94 atomicHighLevelStateHandlers.put(atomicStateID, handler);
97 private static void checkHighLevelStateIDPart(String stateIDPart)
99 if (stateIDPart.indexOf('.') != -1)
100 throw new IllegalArgumentException("Illegal high level state ID part (contains dot): " + stateIDPart);
104 public Object getHighLevelState(String stateID)
106 int indexOfDot = stateID.indexOf('.');
107 if (indexOfDot == -1)
109 AtomicHighLevelStateHandler handler = atomicHighLevelStateHandlers.get(stateID);
111 return handler.getHighLevelState();
114 SubcomponentHighLevelStateHandler handler = subcomponentHighLevelStateHandlers.get(stateID.substring(0, indexOfDot));
116 return handler.getHighLevelState(stateID.substring(indexOfDot + 1));
118 throw new IllegalArgumentException("No high level state with ID " + stateID);
122 public void setHighLevelState(String stateID, Object newState)
124 int indexOfDot = stateID.indexOf('.');
125 if (indexOfDot == -1)
127 AtomicHighLevelStateHandler handler = atomicHighLevelStateHandlers.get(stateID);
129 handler.setHighLevelState(newState);
131 throw new IllegalArgumentException("No high level state with ID " + stateID);
134 SubcomponentHighLevelStateHandler handler = subcomponentHighLevelStateHandlers.get(stateID.substring(0, indexOfDot));
136 handler.setHighLevelState(stateID.substring(indexOfDot + 1), newState);
138 throw new IllegalArgumentException("No high level state with ID " + stateID);
142 public static class StandardHighLevelStateHandlerParams
144 public Map<String, SubcomponentHighLevelStateHandlerParams> subcomponentHighLevelStates;
145 public Map<String, AtomicHighLevelStateHandlerParams> atomicHighLevelStates;
150 SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier.setSnippetSupplier(
151 StandardHighLevelStateHandler.class.getCanonicalName(),
152 SnippetDefinintion.create(StandardHighLevelStateHandlerParams.class, StandardHighLevelStateHandler::new));