Merge branch 'development' of https://gitlab.lrz.de/lrr-tum/students/eragp-misim...
[Mograsim.git] / net.mograsim.logic.model / src / net / mograsim / logic / model / snippets / highlevelstatehandlers / standard / atomic / DelegatingAtomicHighLevelStateHandler.java
1 package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic;
2
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;
9
10 public class DelegatingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler
11 {
12         private final SubmodelComponent parentComponent;
13         private ModelComponent delegateTarget;
14         private String subStateID;
15
16         public DelegatingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context)
17         {
18                 this(context, null);
19         }
20
21         public DelegatingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context, DelegatingAtomicHighLevelStateHandlerParams params)
22         {
23                 this.parentComponent = context.component;
24                 if (params != null)
25                 {
26                         // TODO document this
27                         if (params.delegateTarget == null)
28                                 setDelegateTarget(parentComponent);
29                         else
30                                 setDelegateTarget(parentComponent.submodel.getComponentsByName().get(params.delegateTarget));
31                         setSubStateID(params.subStateID);
32                 }
33         }
34
35         public void set(ModelComponent delegateTarget, String subStateID)
36         {
37                 setDelegateTarget(delegateTarget);
38                 setSubStateID(subStateID);
39         }
40
41         public void setDelegateTarget(ModelComponent delegateTarget)
42         {
43                 if (delegateTarget == null)
44                         this.delegateTarget = parentComponent;
45                 else if (parentComponent.submodel.getComponentsByName().get(delegateTarget.getName()) != delegateTarget)
46                         throw new IllegalArgumentException(
47                                         "Can only set components belonging to the submodel of the parent component of this handler as the delegate target");
48                 this.delegateTarget = delegateTarget;
49         }
50
51         public void setSubStateID(String subStateID)
52         {
53                 this.subStateID = subStateID;
54         }
55
56         @Override
57         public Object getHighLevelState()
58         {
59                 return delegateTarget.getHighLevelState(subStateID);
60         }
61
62         @Override
63         public void setHighLevelState(Object newState)
64         {
65                 delegateTarget.setHighLevelState(subStateID, newState);
66         }
67
68         @Override
69         public String getIDForSerializing(IdentifyParams idParams)
70         {
71                 return "delegating";
72         }
73
74         @Override
75         public DelegatingAtomicHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams)
76         {
77                 DelegatingAtomicHighLevelStateHandlerParams params = new DelegatingAtomicHighLevelStateHandlerParams();
78                 params.delegateTarget = delegateTarget.getName();
79                 params.subStateID = subStateID;
80                 return params;
81         }
82
83         public static class DelegatingAtomicHighLevelStateHandlerParams
84         {
85                 public String delegateTarget;
86                 public String subStateID;
87         }
88
89         static
90         {
91                 StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier.setSnippetSupplier(
92                                 DelegatingAtomicHighLevelStateHandler.class.getCanonicalName(),
93                                 SnippetDefinintion.create(DelegatingAtomicHighLevelStateHandlerParams.class, DelegatingAtomicHighLevelStateHandler::new));
94         }
95 }