1 package net.mograsim.logic.ui.serializing;
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.util.HashMap;
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;
13 public class CodeSnippetSupplier<S>
15 // public static members
16 public static final CodeSnippetSupplier<RendererProvider> symbolRendererProviderSupplier;
17 public static final CodeSnippetSupplier<RendererProvider> outlineRendererProviderSupplier;
21 symbolRendererProviderSupplier = new CodeSnippetSupplier<>(new DefaultSymbolRendererProvider());
22 outlineRendererProviderSupplier = new CodeSnippetSupplier<>(new DefaultOutlineRendererProvider());
25 // per-instance members
27 private final Map<String, String> standardSnippetIDClassNames = new HashMap<>();
28 private final Map<String, S> snippetProvidersForClassNames = new HashMap<>();
29 private final S defaultSnippetProvider;
31 private CodeSnippetSupplier(S defaultSnippetProvider)
33 this.defaultSnippetProvider = defaultSnippetProvider;
36 public void addStandardSnippetID(String standardSnippetID, String associatedSnippetClassName)
38 standardSnippetIDClassNames.put(standardSnippetID, associatedSnippetClassName);
41 public void setSnippetProvider(String id, S snippetProvider)
43 snippetProvidersForClassNames.put(id, snippetProvider);
47 public S getSnippetProvider(String id)
51 String snippetProviderClassName;
52 if (id.startsWith("class:"))
53 snippetProviderClassName = id.substring(6);
55 snippetProviderClassName = standardSnippetIDClassNames.get(id);
56 if (snippetProviderClassName != null)
58 tryLoadSnippetClass(snippetProviderClassName);
59 S snippetProvider = snippetProvidersForClassNames.get(snippetProviderClassName);
60 if (snippetProvider != null)
61 return snippetProvider;
64 System.err.println("Couldn't load snippet " + id + "; using default");
65 return defaultSnippetProvider;
72 try (InputStream s = IndirectGUIComponentCreator.class.getResourceAsStream("./standardSnippetIDMapping.json"))
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);
82 System.err.println("Failed to initialize standard snippet ID mapping: ");
87 private static class SnippetIDClassNames
89 public Map<String, String> standardOutlineRendererProviders;
90 public Map<String, String> standardSymbolRendererProviders;
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());