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.Renderer;
9 import net.mograsim.logic.ui.serializing.snippets.SnippetSupplier;
10 import net.mograsim.logic.ui.serializing.snippets.outlinerenderers.DefaultOutlineRenderer;
11 import net.mograsim.logic.ui.serializing.snippets.symbolrenderers.DefaultSymbolRenderer;
12 import net.mograsim.logic.ui.util.JsonHandler;
14 public class CodeSnippetSupplier<S>
16 // public static members
17 public static final CodeSnippetSupplier<Renderer> symbolRendererProviderSupplier;
18 public static final CodeSnippetSupplier<Renderer> outlineRendererProviderSupplier;
22 symbolRendererProviderSupplier = new CodeSnippetSupplier<>(SnippetSupplier.create(Void.class, DefaultSymbolRenderer::new));
23 outlineRendererProviderSupplier = new CodeSnippetSupplier<>(SnippetSupplier.create(Void.class, DefaultOutlineRenderer::new));
26 // per-instance members
28 private final Map<String, String> standardSnippetIDClassNames = new HashMap<>();
29 private final Map<String, SnippetSupplier<?, S>> snippetProvidersForClassNames = new HashMap<>();
30 private final SnippetSupplier<?, S> defaultSnippetProvider;
32 private CodeSnippetSupplier(SnippetSupplier<?, S> defaultSnippetProvider)
34 this.defaultSnippetProvider = defaultSnippetProvider;
37 public void addStandardSnippetID(String standardSnippetID, String associatedSnippetClassName)
39 standardSnippetIDClassNames.put(standardSnippetID, associatedSnippetClassName);
42 public void setSnippetProvider(String id, SnippetSupplier<?, S> snippetProvider)
44 snippetProvidersForClassNames.put(id, snippetProvider);
48 public SnippetSupplier<?, S> getSnippetProvider(String id)
52 String snippetProviderClassName;
53 if (id.startsWith("class:"))
54 snippetProviderClassName = id.substring(6);
56 snippetProviderClassName = standardSnippetIDClassNames.get(id);
57 if (snippetProviderClassName != null)
59 tryLoadSnippetClass(snippetProviderClassName);
60 SnippetSupplier<?, S> snippetProvider = snippetProvidersForClassNames.get(snippetProviderClassName);
61 if (snippetProvider != null)
62 return snippetProvider;
65 System.err.println("Couldn't load snippet " + id + "; using default");
66 return defaultSnippetProvider;
73 try (InputStream s = IndirectGUIComponentCreator.class.getResourceAsStream("./standardSnippetIDMapping.json"))
76 throw new IOException("Resource not found");
77 SnippetIDClassNames tmp = JsonHandler.readJson(s, SnippetIDClassNames.class);
78 tmp.standardOutlineRendererProviders.forEach(outlineRendererProviderSupplier::addStandardSnippetID);
79 tmp.standardSymbolRendererProviders.forEach(symbolRendererProviderSupplier::addStandardSnippetID);
83 System.err.println("Failed to initialize standard snippet ID mapping: ");
88 private static class SnippetIDClassNames
90 public Map<String, String> standardOutlineRendererProviders;
91 public Map<String, String> standardSymbolRendererProviders;
94 private static void tryLoadSnippetClass(String snippetClassName)
96 tryInvokeStaticInitializer(snippetClassName, "Error getting snippet class: %s: %s\n");
99 public static void tryInvokeStaticInitializer(String className, String errorMessageFormat)
103 Class.forName(className, true, CodeSnippetSupplier.class.getClassLoader());
105 catch (ClassNotFoundException e)
107 System.err.printf(errorMessageFormat, className, "ClassNotFoundException thrown: " + e.getMessage());