Made CodeSnippetSupplier generic
[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 net.mograsim.logic.ui.serializing.snippets.RendererProvider;
9 import net.mograsim.logic.ui.serializing.snippets.outlinerenderers.DefaultOutlineRendererProvider;
10 import net.mograsim.logic.ui.serializing.snippets.symbolrenderers.DefaultSymbolRendererProvider;
11 import net.mograsim.logic.ui.util.JsonHandler;
12
13 public class CodeSnippetSupplier<S>
14 {
15         // public static members
16         public static final CodeSnippetSupplier<RendererProvider> symbolRendererProviderSupplier;
17         public static final CodeSnippetSupplier<RendererProvider> outlineRendererProviderSupplier;
18
19         static
20         {
21                 symbolRendererProviderSupplier = new CodeSnippetSupplier<>(new DefaultSymbolRendererProvider());
22                 outlineRendererProviderSupplier = new CodeSnippetSupplier<>(new DefaultOutlineRendererProvider());
23         }
24
25         // per-instance members
26
27         private final Map<String, String> standardSnippetIDClassNames = new HashMap<>();
28         private final Map<String, S> snippetProvidersForClassNames = new HashMap<>();
29         private final S defaultSnippetProvider;
30
31         private CodeSnippetSupplier(S defaultSnippetProvider)
32         {
33                 this.defaultSnippetProvider = defaultSnippetProvider;
34         }
35
36         public void addStandardSnippetID(String standardSnippetID, String associatedSnippetClassName)
37         {
38                 standardSnippetIDClassNames.put(standardSnippetID, associatedSnippetClassName);
39         }
40
41         public void setSnippetProvider(String id, S snippetProvider)
42         {
43                 snippetProvidersForClassNames.put(id, snippetProvider);
44         }
45
46         // TODO report errors
47         public S getSnippetProvider(String id)
48         {
49                 if (id != null)
50                 {
51                         String snippetProviderClassName;
52                         if (id.startsWith("class:"))
53                                 snippetProviderClassName = id.substring(6);
54                         else
55                                 snippetProviderClassName = standardSnippetIDClassNames.get(id);
56                         if (snippetProviderClassName != null)
57                         {
58                                 tryLoadSnippetClass(snippetProviderClassName);
59                                 S snippetProvider = snippetProvidersForClassNames.get(snippetProviderClassName);
60                                 if (snippetProvider != null)
61                                         return snippetProvider;
62                         }
63                 }
64                 System.err.println("Couldn't load snippet " + id + "; using default");
65                 return defaultSnippetProvider;
66         }
67
68         // static helpers
69
70         static
71         {
72                 try (InputStream s = IndirectGUIComponentCreator.class.getResourceAsStream("./standardSnippetIDMapping.json"))
73                 {
74                         if (s == null)
75                                 throw new IOException("Resource not found");
76                         SnippetIDClassNames tmp = JsonHandler.readJson(s, SnippetIDClassNames.class);
77                         tmp.standardOutlineRendererProviders.forEach(outlineRendererProviderSupplier::addStandardSnippetID);
78                         tmp.standardSymbolRendererProviders.forEach(symbolRendererProviderSupplier::addStandardSnippetID);
79                 }
80                 catch (Exception e)
81                 {
82                         System.err.println("Failed to initialize standard snippet ID mapping: ");
83                         e.printStackTrace();
84                 }
85         }
86
87         private static class SnippetIDClassNames
88         {
89                 public Map<String, String> standardOutlineRendererProviders;
90                 public Map<String, String> standardSymbolRendererProviders;
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
110 }