1 package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent;
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 DelegatingSubcomponentHighLevelStateHandler implements SubcomponentHighLevelStateHandler
12 private final SubmodelComponent parentComponent;
13 private ModelComponent delegateTarget;
14 private String prefix;
16 public DelegatingSubcomponentHighLevelStateHandler(HighLevelStateHandlerContext context)
21 public DelegatingSubcomponentHighLevelStateHandler(HighLevelStateHandlerContext context,
22 DelegatingSubcomponentHighLevelStateHandlerParams params)
24 this.parentComponent = context.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 setPrefix(params.prefix);
39 parentComponent.submodel.addComponentRemovedListener(c ->
41 if (delegateTarget == c)
42 delegateTarget = null;
46 public void set(ModelComponent delegateTarget, String prefix)
48 setDelegateTarget(delegateTarget);
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 setPrefix(String prefix)
72 public String getPrefix()
78 public Object getHighLevelState(String subStateID)
80 if (delegateTarget == null)
81 throw new IllegalStateException("Delegating to a component that was destroyed");
82 return delegateTarget.getHighLevelState(getDelegateTargetHighLevelStateID(subStateID));
86 public void setHighLevelState(String subStateID, Object newState)
88 if (delegateTarget == null)
89 throw new IllegalStateException("Delegating to a component that was destroyed");
90 delegateTarget.setHighLevelState(getDelegateTargetHighLevelStateID(subStateID), newState);
93 private String getDelegateTargetHighLevelStateID(String subStateID)
95 return prefix == null ? subStateID : prefix + '.' + subStateID;
99 public String getIDForSerializing(IdentifyParams idParams)
105 public DelegatingSubcomponentHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams)
107 DelegatingSubcomponentHighLevelStateHandlerParams params = new DelegatingSubcomponentHighLevelStateHandlerParams();
108 params.delegateTarget = delegateTarget.getName();
109 params.prefix = prefix;
113 public static class DelegatingSubcomponentHighLevelStateHandlerParams
115 public String delegateTarget;
116 public String prefix;
121 StandardHighLevelStateHandlerSnippetSuppliers.subcomponentHandlerSupplier
122 .setSnippetSupplier(DelegatingSubcomponentHighLevelStateHandler.class.getCanonicalName(), SnippetDefinintion
123 .create(DelegatingSubcomponentHighLevelStateHandlerParams.class, DelegatingSubcomponentHighLevelStateHandler::new));