Restructured serializing/deserializing
[Mograsim.git] / net.mograsim.logic.model / src / net / mograsim / logic / model / snippets / highlevelstatehandlers / standard / StandardHighLevelStateHandler.java
1 package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard;
2
3 import java.util.HashMap;
4 import java.util.Map;
5
6 import net.mograsim.logic.model.model.components.GUIComponent;
7 import net.mograsim.logic.model.snippets.HighLevelStateHandler;
8 import net.mograsim.logic.model.snippets.SnippetDefinintion;
9 import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers;
10 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler;
11 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler.AtomicHighLevelStateHandlerParams;
12 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler;
13 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler.SubcomponentHighLevelStateHandlerParams;
14
15 public class StandardHighLevelStateHandler implements HighLevelStateHandler
16 {
17         private final GUIComponent component;
18         private final Map<String, SubcomponentHighLevelStateHandler> subcomponentHighLevelStateHandlers;
19         private final Map<String, AtomicHighLevelStateHandler> atomicHighLevelStateHandlers;
20
21         public StandardHighLevelStateHandler(GUIComponent component, SimpleHighLevelStateHandlerParams params)
22         {
23                 this.component = component;
24                 this.subcomponentHighLevelStateHandlers = new HashMap<>();
25                 this.atomicHighLevelStateHandlers = new HashMap<>();
26                 params.subcomponentHighLevelStates.forEach(this::addSubcomponentHighLevelState);
27                 params.atomicHighLevelStates.forEach(this::addAtomicHighLevelState);
28         }
29
30         public void addSubcomponentHighLevelState(String subcomponentStateID, SubcomponentHighLevelStateHandlerParams handlerParams)
31         {
32                 HighLevelStateHandlerContext context = new HighLevelStateHandlerContext(component, subcomponentStateID);
33                 addSubcomponentHighLevelState(subcomponentStateID, StandardHighLevelStateHandlerSnippetSuppliers.subcomponentHandlerSupplier
34                                 .getSnippetSupplier(handlerParams.id).create(context, handlerParams.params));
35         }
36
37         public void addSubcomponentHighLevelState(String subcomponentStateID, SubcomponentHighLevelStateHandler handler)
38         {
39                 checkHighLevelStateIDPart(subcomponentStateID);
40                 subcomponentHighLevelStateHandlers.put(subcomponentStateID, handler);
41         }
42
43         public void addAtomicHighLevelState(String atomicStateID, AtomicHighLevelStateHandlerParams handlerParams)
44         {
45                 HighLevelStateHandlerContext context = new HighLevelStateHandlerContext(component, atomicStateID);
46                 addSubcomponentHighLevelState(atomicStateID, StandardHighLevelStateHandlerSnippetSuppliers.subcomponentHandlerSupplier
47                                 .getSnippetSupplier(handlerParams.id).create(context, handlerParams.params));
48         }
49
50         public void addAtomicHighLevelState(String atomicStateID, AtomicHighLevelStateHandler handler)
51         {
52                 checkHighLevelStateIDPart(atomicStateID);
53                 atomicHighLevelStateHandlers.put(atomicStateID, handler);
54         }
55
56         private static void checkHighLevelStateIDPart(String stateIDPart)
57         {
58                 if (stateIDPart.indexOf('.') != -1)
59                         throw new IllegalArgumentException("Illegal high level state ID part (contains dot): " + stateIDPart);
60         }
61
62         @Override
63         public Object getHighLevelState(String stateID)
64         {
65                 int indexOfDot = stateID.indexOf('.');
66                 if (indexOfDot == -1)
67                 {
68                         AtomicHighLevelStateHandler handler = atomicHighLevelStateHandlers.get(stateID);
69                         if (handler != null)
70                                 return handler.getHighLevelState();
71                 } else
72                 {
73                         SubcomponentHighLevelStateHandler handler = subcomponentHighLevelStateHandlers.get(stateID.substring(0, indexOfDot));
74                         if (handler != null)
75                                 return handler.getHighLevelState(stateID.substring(indexOfDot + 1));
76                 }
77                 throw new IllegalArgumentException("No high level state with ID " + stateID);
78         }
79
80         @Override
81         public void setHighLevelState(String stateID, Object newState)
82         {
83                 int indexOfDot = stateID.indexOf('.');
84                 if (indexOfDot == -1)
85                 {
86                         AtomicHighLevelStateHandler handler = atomicHighLevelStateHandlers.get(stateID);
87                         if (handler != null)
88                                 handler.setHighLevelState(newState);
89                         else
90                                 throw new IllegalArgumentException("No high level state with ID " + stateID);
91                 } else
92                 {
93                         SubcomponentHighLevelStateHandler handler = subcomponentHighLevelStateHandlers.get(stateID.substring(0, indexOfDot));
94                         if (handler != null)
95                                 handler.setHighLevelState(stateID.substring(indexOfDot + 1), newState);
96                         else
97                                 throw new IllegalArgumentException("No high level state with ID " + stateID);
98                 }
99         }
100
101         public static class SimpleHighLevelStateHandlerParams
102         {
103                 public Map<String, SubcomponentHighLevelStateHandlerParams> subcomponentHighLevelStates;
104                 public Map<String, AtomicHighLevelStateHandlerParams> atomicHighLevelStates;
105         }
106
107         static
108         {
109                 SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier.setSnippetSupplier(
110                                 StandardHighLevelStateHandler.class.getCanonicalName(),
111                                 SnippetDefinintion.create(SimpleHighLevelStateHandlerParams.class, StandardHighLevelStateHandler::new));
112         }
113 }