1 package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic;
3 import java.util.function.Consumer;
5 import net.mograsim.logic.model.model.components.ModelComponent;
6 import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
7 import net.mograsim.logic.model.serializing.IdentifyParams;
8 import net.mograsim.logic.model.snippets.SnippetDefinintion;
9 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers;
11 public class DelegatingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler
13 private final SubmodelComponent parentComponent;
14 private ModelComponent delegateTarget;
15 private String subStateID;
17 public DelegatingAtomicHighLevelStateHandler(SubmodelComponent component)
19 this(component, null);
22 public DelegatingAtomicHighLevelStateHandler(SubmodelComponent component, DelegatingAtomicHighLevelStateHandlerParams params)
24 this.parentComponent = component;
28 if (params.delegateTarget == null)
29 setDelegateTarget(parentComponent);
32 ModelComponent delegateTarget = parentComponent.submodel.getComponentsByName().get(params.delegateTarget);
33 if (delegateTarget == null)
34 throw new NullPointerException("No subcomponent with name " + params.delegateTarget);
35 setDelegateTarget(delegateTarget);
37 setSubStateID(params.subStateID);
39 parentComponent.submodel.addComponentRemovedListener(c ->
41 if (delegateTarget == c)
42 delegateTarget = null;
46 public void set(ModelComponent delegateTarget, String subStateID)
48 setDelegateTarget(delegateTarget);
49 setSubStateID(subStateID);
52 public void setDelegateTarget(ModelComponent delegateTarget)
54 if (delegateTarget == null)
55 this.delegateTarget = parentComponent;
56 else if (parentComponent.submodel.getComponentsByName().get(delegateTarget.getName()) != delegateTarget)
57 throw new IllegalArgumentException(
58 "Can only set components belonging to the submodel of the parent component of this handler as the delegate target");
59 this.delegateTarget = delegateTarget;
62 public ModelComponent getDelegateTarget()
64 return delegateTarget;
67 public void setSubStateID(String subStateID)
69 this.subStateID = subStateID;
72 public String getSubStateID()
78 public Object getHighLevelState()
81 return delegateTarget.getHighLevelState(subStateID);
85 public void setHighLevelState(Object newState)
88 delegateTarget.setHighLevelState(subStateID, newState);
92 public void addListener(Consumer<Object> stateChanged)
95 delegateTarget.addHighLevelStateListener(subStateID, stateChanged);
99 public void removeListener(Consumer<Object> stateChanged)
102 delegateTarget.removeHighLevelStateListener(subStateID, stateChanged);
105 private void checkTarget()
107 if (delegateTarget == null)
108 throw new IllegalStateException("Delegating to a component that was destroyed");
112 public String getIDForSerializing(IdentifyParams idParams)
118 public DelegatingAtomicHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams)
121 DelegatingAtomicHighLevelStateHandlerParams params = new DelegatingAtomicHighLevelStateHandlerParams();
122 params.delegateTarget = delegateTarget == parentComponent ? null : delegateTarget.getName();
123 params.subStateID = subStateID;
127 public static class DelegatingAtomicHighLevelStateHandlerParams
129 public String delegateTarget;
130 public String subStateID;
135 StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier.setSnippetSupplier(
136 DelegatingAtomicHighLevelStateHandler.class.getCanonicalName(),
137 SnippetDefinintion.create(DelegatingAtomicHighLevelStateHandlerParams.class, DelegatingAtomicHighLevelStateHandler::new));