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