1 package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic;
3 import net.mograsim.logic.model.model.components.ModelComponent;
4 import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
5 import net.mograsim.logic.model.serializing.IdentifyParams;
6 import net.mograsim.logic.model.snippets.SnippetDefinintion;
7 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.HighLevelStateHandlerContext;
8 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers;
10 public class DelegatingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler
12 private final SubmodelComponent parentComponent;
13 private ModelComponent delegateTarget;
14 private String subStateID;
16 public DelegatingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context)
21 public DelegatingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context, DelegatingAtomicHighLevelStateHandlerParams params)
23 this.parentComponent = context.component;
27 if (params.delegateTarget == null)
28 setDelegateTarget(parentComponent);
31 ModelComponent delegateTarget = parentComponent.submodel.getComponentsByName().get(params.delegateTarget);
32 if (delegateTarget == null)
33 throw new NullPointerException("No subcomponent with name " + params.delegateTarget);
34 setDelegateTarget(delegateTarget);
36 setSubStateID(params.subStateID);
38 parentComponent.submodel.addComponentRemovedListener(c ->
40 if (delegateTarget == c)
41 delegateTarget = null;
45 public void set(ModelComponent delegateTarget, String subStateID)
47 setDelegateTarget(delegateTarget);
48 setSubStateID(subStateID);
51 public void setDelegateTarget(ModelComponent delegateTarget)
53 if (delegateTarget == null)
54 this.delegateTarget = parentComponent;
55 else if (parentComponent.submodel.getComponentsByName().get(delegateTarget.getName()) != delegateTarget)
56 throw new IllegalArgumentException(
57 "Can only set components belonging to the submodel of the parent component of this handler as the delegate target");
58 this.delegateTarget = delegateTarget;
61 public ModelComponent getDelegateTarget()
63 return delegateTarget;
66 public void setSubStateID(String subStateID)
68 this.subStateID = subStateID;
71 public String getSubStateID()
77 public Object getHighLevelState()
79 if (delegateTarget == null)
80 throw new IllegalStateException("Delegating to a component that was destroyed");
81 return delegateTarget.getHighLevelState(subStateID);
85 public void setHighLevelState(Object newState)
87 if (delegateTarget == null)
88 throw new IllegalStateException("Delegating to a component that was destroyed");
89 delegateTarget.setHighLevelState(subStateID, newState);
93 public String getIDForSerializing(IdentifyParams idParams)
99 public DelegatingAtomicHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams)
101 if (delegateTarget == null)
102 throw new IllegalStateException("Delegating to a component that was destroyed");
103 DelegatingAtomicHighLevelStateHandlerParams params = new DelegatingAtomicHighLevelStateHandlerParams();
104 params.delegateTarget = delegateTarget.getName();
105 params.subStateID = subStateID;
109 public static class DelegatingAtomicHighLevelStateHandlerParams
111 public String delegateTarget;
112 public String subStateID;
117 StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier.setSnippetSupplier(
118 DelegatingAtomicHighLevelStateHandler.class.getCanonicalName(),
119 SnippetDefinintion.create(DelegatingAtomicHighLevelStateHandlerParams.class, DelegatingAtomicHighLevelStateHandler::new));