import java.util.HashMap;
import java.util.Map;
+import java.util.Map.Entry;
+import java.util.function.BiFunction;
+import java.util.function.Function;
-import net.mograsim.logic.model.model.components.GUIComponent;
+import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
+import net.mograsim.logic.model.serializing.IdentifierGetter;
import net.mograsim.logic.model.snippets.HighLevelStateHandler;
import net.mograsim.logic.model.snippets.SnippetDefinintion;
import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers;
public class StandardHighLevelStateHandler implements HighLevelStateHandler
{
- private final GUIComponent component;
+ private final SubmodelComponent component;
private final Map<String, SubcomponentHighLevelStateHandler> subcomponentHighLevelStateHandlers;
private final Map<String, AtomicHighLevelStateHandler> atomicHighLevelStateHandlers;
- public StandardHighLevelStateHandler(GUIComponent component, SimpleHighLevelStateHandlerParams params)
+ public StandardHighLevelStateHandler(SubmodelComponent component)
+ {
+ this(component, null);
+ }
+
+ public StandardHighLevelStateHandler(SubmodelComponent component, StandardHighLevelStateHandlerParams params)
{
this.component = component;
this.subcomponentHighLevelStateHandlers = new HashMap<>();
this.atomicHighLevelStateHandlers = new HashMap<>();
- params.subcomponentHighLevelStates.forEach(this::addSubcomponentHighLevelState);
- params.atomicHighLevelStates.forEach(this::addAtomicHighLevelState);
+ if (params != null)
+ {
+ params.subcomponentHighLevelStates.forEach(this::addSubcomponentHighLevelState);
+ params.atomicHighLevelStates.forEach(this::addAtomicHighLevelState);
+ }
}
- public void addSubcomponentHighLevelState(String subcomponentStateID, SubcomponentHighLevelStateHandlerParams handlerParams)
+ public SubcomponentHighLevelStateHandler addSubcomponentHighLevelState(String subcomponentStateID,
+ SubcomponentHighLevelStateHandlerParams handlerParams)
+ {
+ return addSubcomponentHighLevelState(subcomponentStateID,
+ StandardHighLevelStateHandlerSnippetSuppliers.subcomponentHandlerSupplier.getSnippetSupplier(handlerParams.id)::create,
+ handlerParams.params);
+ }
+
+ public <P, H extends SubcomponentHighLevelStateHandler> H addSubcomponentHighLevelState(String subcomponentStateID,
+ BiFunction<HighLevelStateHandlerContext, P, H> handlerConstructor, P handlerParams)
+ {
+ return addSubcomponentHighLevelState(subcomponentStateID, c -> handlerConstructor.apply(c, handlerParams));
+ }
+
+ public <H extends SubcomponentHighLevelStateHandler> H addSubcomponentHighLevelState(String subcomponentStateID,
+ Function<HighLevelStateHandlerContext, H> handlerConstructor)
{
HighLevelStateHandlerContext context = new HighLevelStateHandlerContext(component, subcomponentStateID);
- addSubcomponentHighLevelState(subcomponentStateID, StandardHighLevelStateHandlerSnippetSuppliers.subcomponentHandlerSupplier
- .getSnippetSupplier(handlerParams.id).create(context, handlerParams.params));
+ H handler = handlerConstructor.apply(context);
+ addSubcomponentHighLevelState(subcomponentStateID, handler);
+ return handler;
}
public void addSubcomponentHighLevelState(String subcomponentStateID, SubcomponentHighLevelStateHandler handler)
subcomponentHighLevelStateHandlers.put(subcomponentStateID, handler);
}
- public void addAtomicHighLevelState(String atomicStateID, AtomicHighLevelStateHandlerParams handlerParams)
+ public AtomicHighLevelStateHandler addAtomicHighLevelState(String atomicStateID, AtomicHighLevelStateHandlerParams handlerParams)
+ {
+ return addAtomicHighLevelState(atomicStateID,
+ StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier.getSnippetSupplier(handlerParams.id)::create,
+ handlerParams.params);
+ }
+
+ public <P, H extends AtomicHighLevelStateHandler> H addAtomicHighLevelState(String subcomponentStateID,
+ BiFunction<HighLevelStateHandlerContext, P, H> handlerConstructor, P handlerParams)
{
- HighLevelStateHandlerContext context = new HighLevelStateHandlerContext(component, atomicStateID);
- addSubcomponentHighLevelState(atomicStateID, StandardHighLevelStateHandlerSnippetSuppliers.subcomponentHandlerSupplier
- .getSnippetSupplier(handlerParams.id).create(context, handlerParams.params));
+ return addAtomicHighLevelState(subcomponentStateID, c -> handlerConstructor.apply(c, handlerParams));
+ }
+
+ public <H extends AtomicHighLevelStateHandler> H addAtomicHighLevelState(String subcomponentStateID,
+ Function<HighLevelStateHandlerContext, H> handlerConstructor)
+ {
+ HighLevelStateHandlerContext context = new HighLevelStateHandlerContext(component, subcomponentStateID);
+ H handler = handlerConstructor.apply(context);
+ addAtomicHighLevelState(subcomponentStateID, handler);
+ return handler;
}
public void addAtomicHighLevelState(String atomicStateID, AtomicHighLevelStateHandler handler)
}
}
- public static class SimpleHighLevelStateHandlerParams
+ @Override
+ public StandardHighLevelStateHandlerParams getParamsForSerializing(IdentifierGetter idGetter)
+ {
+ StandardHighLevelStateHandlerParams params = new StandardHighLevelStateHandlerParams();
+ params.subcomponentHighLevelStates = new HashMap<>();
+ params.atomicHighLevelStates = new HashMap<>();
+ for (Entry<String, SubcomponentHighLevelStateHandler> e : subcomponentHighLevelStateHandlers.entrySet())
+ {
+ String stateID = e.getKey();
+ SubcomponentHighLevelStateHandler handler = e.getValue();
+ SubcomponentHighLevelStateHandlerParams handlerParams = new SubcomponentHighLevelStateHandlerParams();
+ handlerParams.id = idGetter.subcomponentHighLevelStateHandlerIDs.apply(handler);
+ handlerParams.params = handler.getParamsForSerializingJSON(idGetter);
+ params.subcomponentHighLevelStates.put(stateID, handlerParams);
+ }
+ for (Entry<String, AtomicHighLevelStateHandler> e : atomicHighLevelStateHandlers.entrySet())
+ {
+ String stateID = e.getKey();
+ AtomicHighLevelStateHandler handler = e.getValue();
+ AtomicHighLevelStateHandlerParams handlerParams = new AtomicHighLevelStateHandlerParams();
+ handlerParams.id = idGetter.atomicHighLevelStateHandlerIDs.apply(handler);
+ handlerParams.params = handler.getParamsForSerializingJSON(idGetter);
+ params.atomicHighLevelStates.put(stateID, handlerParams);
+ }
+ return params;
+ }
+
+ public static class StandardHighLevelStateHandlerParams
{
public Map<String, SubcomponentHighLevelStateHandlerParams> subcomponentHighLevelStates;
public Map<String, AtomicHighLevelStateHandlerParams> atomicHighLevelStates;
{
SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier.setSnippetSupplier(
StandardHighLevelStateHandler.class.getCanonicalName(),
- SnippetDefinintion.create(SimpleHighLevelStateHandlerParams.class, StandardHighLevelStateHandler::new));
+ SnippetDefinintion.create(StandardHighLevelStateHandlerParams.class, StandardHighLevelStateHandler::new));
}
}
\ No newline at end of file