8c13e96a96eff76793c5b5f3e6470cb1dcdab734
[Mograsim.git] / net.mograsim.logic.ui / src / net / mograsim / logic / ui / serializing / CodeSnippetSupplier.java
1 package net.mograsim.logic.ui.serializing;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.util.HashMap;
6 import java.util.Map;
7
8 import com.google.gson.JsonElement;
9
10 import net.mograsim.logic.ui.serializing.snippets.Renderer;
11 import net.mograsim.logic.ui.serializing.snippets.RendererProvider;
12 import net.mograsim.logic.ui.serializing.snippets.outlinerenderers.DefaultOutlineRendererProvider;
13 import net.mograsim.logic.ui.serializing.snippets.symbolrenderers.DefaultSymbolRendererProvider;
14 import net.mograsim.logic.ui.util.JsonHandler;
15
16 public class CodeSnippetSupplier
17 {
18         private static final Map<String, String> standardSnippetIDClassNames = new HashMap<>();
19
20         private static final Map<String, RendererProvider> outlineRendererProvidersForComponentClassNames = new HashMap<>();
21         private static final Map<String, RendererProvider> symbolRendererProvidersForComponentClassNames = new HashMap<>();
22
23         private static final RendererProvider defaultOutlineRendererProvider;
24         private static final RendererProvider defaultSymbolRendererProvider;
25         static
26         {
27                 defaultOutlineRendererProvider = new DefaultOutlineRendererProvider();
28                 defaultSymbolRendererProvider = new DefaultSymbolRendererProvider();
29         }
30
31         static
32         {
33                 try (InputStream s = IndirectGUIComponentCreator.class.getResourceAsStream("./standardSnippetIDMapping.json"))
34                 {
35                         if (s == null)
36                                 throw new IOException("Resource not found");
37                         Map<String, String> tmp = JsonHandler.readJson(s, Map.class);
38                         standardSnippetIDClassNames.putAll(tmp);
39                 }
40                 catch (IOException e)
41                 {
42                         System.err.println("Failed to initialize standard snippet ID mapping: " + e.getMessage());
43                 }
44         }
45
46         public static void addStandardSnippetID(String standardSnippetID, String associatedSnippetClassName)
47         {
48                 standardSnippetIDClassNames.put(standardSnippetID, associatedSnippetClassName);
49         }
50
51         public static void setOutlineRendererProvider(String id, RendererProvider outlineRendererProvider)
52         {
53                 outlineRendererProvidersForComponentClassNames.put(id, outlineRendererProvider);
54         }
55
56         public static void setSymbolRendererProvider(String id, RendererProvider symbolRendererProvider)
57         {
58                 symbolRendererProvidersForComponentClassNames.put(id, symbolRendererProvider);
59         }
60
61         public static Renderer createOutlineRenderer(String id, DeserializedSubmodelComponent component, JsonElement params)
62         {
63                 return getSnippet(id, outlineRendererProvidersForComponentClassNames, defaultOutlineRendererProvider).create(component, params);
64         }
65
66         public static Renderer createSymbolRenderer(String id, DeserializedSubmodelComponent component, JsonElement params)
67         {
68                 return getSnippet(id, symbolRendererProvidersForComponentClassNames, defaultSymbolRendererProvider).create(component, params);
69         }
70
71         // TODO report errors
72         private static <C> C getSnippet(String id, Map<String, C> specializedCodeMap, C defaultSnippet)
73         {
74                 if (id != null)
75                 {
76                         String snippetClassName;
77                         if (id.startsWith("class:"))
78                                 snippetClassName = id.substring(6);
79                         else
80                                 snippetClassName = standardSnippetIDClassNames.get(id);
81                         if (snippetClassName != null)
82                         {
83                                 tryLoadSnippetClass(snippetClassName);
84                                 C specializedCode = specializedCodeMap.get(snippetClassName);
85                                 if (specializedCode != null)
86                                         return specializedCode;
87                         }
88                 }
89                 System.err.println("Couldn't load snippet " + id + "; using default");
90                 return defaultSnippet;
91         }
92
93         private static void tryLoadSnippetClass(String snippetClassName)
94         {
95                 tryInvokeStaticInitializer(snippetClassName, "Error getting snippet class: %s: %s\n");
96         }
97
98         public static void tryInvokeStaticInitializer(String className, String errorMessageFormat)
99         {
100                 try
101                 {
102                         Class.forName(className, true, CodeSnippetSupplier.class.getClassLoader());
103                 }
104                 catch (ClassNotFoundException e)
105                 {
106                         System.err.printf(errorMessageFormat, className, "ClassNotFoundException thrown: " + e.getMessage());
107                 }
108         }
109 }