Updated Am2900Machine and -Definition; Added MachineContext
[Mograsim.git] / net.mograsim.logic.model / src / net / mograsim / logic / model / serializing / IdentifierGetter.java
1 package net.mograsim.logic.model.serializing;
2
3 import static net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier;
4 import static net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers.outlineRendererSupplier;
5 import static net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers.symbolRendererSupplier;
6 import static net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier;
7 import static net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers.subcomponentHandlerSupplier;
8
9 import java.util.Map;
10 import java.util.Map.Entry;
11 import java.util.function.Function;
12
13 import net.mograsim.logic.model.model.components.GUIComponent;
14 import net.mograsim.logic.model.snippets.CodeSnippetSupplier;
15 import net.mograsim.logic.model.snippets.HighLevelStateHandler;
16 import net.mograsim.logic.model.snippets.Renderer;
17 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler;
18 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler;
19
20 //TODO better name
21 public class IdentifierGetter
22 {
23         // TODO save IDs for everything than can be deserialized / serialized (=every JSONSerializable?)
24         public Function<GUIComponent, String> componentIDs;
25         public Function<Renderer, String> symbolRendererIDs;
26         public Function<Renderer, String> outlineRendererIDs;
27         public Function<HighLevelStateHandler, String> highLevelStateHandlerIDs;
28         public Function<SubcomponentHighLevelStateHandler, String> subcomponentHighLevelStateHandlerIDs;
29         public Function<AtomicHighLevelStateHandler, String> atomicHighLevelStateHandlerIDs;
30
31         /**
32          * Creates a new IdentifierGetter using the following as the default for all ID getter functions: <br>
33          * Define the verbose ID as <code>"class:" + canonicalClassName</code>.<br>
34          * If there is a standard ID mapping to this verbose ID recorded in the matching {@link CodeSnippetSupplier}, use this ID; if not, use
35          * the verbose ID.
36          */
37         public IdentifierGetter()
38         {
39                 componentIDs = generateStandardIDFunction(IndirectGUIComponentCreator.getStandardComponentIDs());
40                 symbolRendererIDs = generateStandardIDFunction(symbolRendererSupplier);
41                 outlineRendererIDs = generateStandardIDFunction(outlineRendererSupplier);
42                 highLevelStateHandlerIDs = generateStandardIDFunction(highLevelStateHandlerSupplier);
43                 atomicHighLevelStateHandlerIDs = generateStandardIDFunction(atomicHandlerSupplier);
44                 subcomponentHighLevelStateHandlerIDs = generateStandardIDFunction(subcomponentHandlerSupplier);
45         }
46
47         private static <T> Function<T, String> generateStandardIDFunction(CodeSnippetSupplier<?, T> snippetSupplier)
48         {
49                 return generateStandardIDFunction(snippetSupplier.getStandardSnippetIDs());
50         }
51
52         private static <T> Function<T, String> generateStandardIDFunction(Map<String, String> standardComponentIDs)
53         {
54                 return t ->
55                 {
56                         String verboseID = "class:" + t.getClass().getCanonicalName();
57                         return standardComponentIDs.entrySet().stream().filter(e -> e.getValue().equals(verboseID)).map(Entry::getKey).findAny()
58                                         .orElse(verboseID);
59                 };
60         }
61 }