1 package net.mograsim.logic.ui.serializing;
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.util.HashMap;
8 import com.google.gson.JsonElement;
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;
16 public class CodeSnippetSupplier
18 private static final Map<String, String> standardSnippetIDClassNames = new HashMap<>();
20 private static final Map<String, RendererProvider> outlineRendererProvidersForComponentClassNames = new HashMap<>();
21 private static final Map<String, RendererProvider> symbolRendererProvidersForComponentClassNames = new HashMap<>();
23 private static final RendererProvider defaultOutlineRendererProvider;
24 private static final RendererProvider defaultSymbolRendererProvider;
27 defaultOutlineRendererProvider = new DefaultOutlineRendererProvider();
28 defaultSymbolRendererProvider = new DefaultSymbolRendererProvider();
33 try (InputStream s = IndirectGUIComponentCreator.class.getResourceAsStream("./standardSnippetIDMapping.json"))
36 throw new IOException("Resource not found");
37 Map<String, String> tmp = JsonHandler.readJson(s, Map.class);
38 standardSnippetIDClassNames.putAll(tmp);
42 System.err.println("Failed to initialize standard snippet ID mapping: " + e.getMessage());
46 public static void addStandardSnippetID(String standardSnippetID, String associatedSnippetClassName)
48 standardSnippetIDClassNames.put(standardSnippetID, associatedSnippetClassName);
51 public static void setOutlineRendererProvider(String id, RendererProvider outlineRendererProvider)
53 outlineRendererProvidersForComponentClassNames.put(id, outlineRendererProvider);
56 public static void setSymbolRendererProvider(String id, RendererProvider symbolRendererProvider)
58 symbolRendererProvidersForComponentClassNames.put(id, symbolRendererProvider);
61 public static Renderer createOutlineRenderer(String id, DeserializedSubmodelComponent component, JsonElement params)
63 return getSnippet(id, outlineRendererProvidersForComponentClassNames, defaultOutlineRendererProvider).create(component, params);
66 public static Renderer createSymbolRenderer(String id, DeserializedSubmodelComponent component, JsonElement params)
68 return getSnippet(id, symbolRendererProvidersForComponentClassNames, defaultSymbolRendererProvider).create(component, params);
72 private static <C> C getSnippet(String id, Map<String, C> specializedCodeMap, C defaultSnippet)
76 String snippetClassName;
77 if (id.startsWith("class:"))
78 snippetClassName = id.substring(6);
80 snippetClassName = standardSnippetIDClassNames.get(id);
81 if (snippetClassName != null)
83 tryLoadSnippetClass(snippetClassName);
84 C specializedCode = specializedCodeMap.get(snippetClassName);
85 if (specializedCode != null)
86 return specializedCode;
89 System.err.println("Couldn't load snippet " + id + "; using default");
90 return defaultSnippet;
93 private static void tryLoadSnippetClass(String snippetClassName)
95 tryInvokeStaticInitializer(snippetClassName, "Error getting snippet class: %s: %s\n");
98 public static void tryInvokeStaticInitializer(String className, String errorMessageFormat)
102 Class.forName(className, true, CodeSnippetSupplier.class.getClassLoader());
104 catch (ClassNotFoundException e)
106 System.err.printf(errorMessageFormat, className, "ClassNotFoundException thrown: " + e.getMessage());