import java.util.HashMap;
import java.util.Map;
-import com.google.gson.JsonElement;
-
-import net.mograsim.logic.ui.serializing.snippets.Renderer;
import net.mograsim.logic.ui.serializing.snippets.RendererProvider;
import net.mograsim.logic.ui.serializing.snippets.outlinerenderers.DefaultOutlineRendererProvider;
import net.mograsim.logic.ui.serializing.snippets.symbolrenderers.DefaultSymbolRendererProvider;
import net.mograsim.logic.ui.util.JsonHandler;
-public class CodeSnippetSupplier
+public class CodeSnippetSupplier<S>
{
- private static final Map<String, String> standardSnippetIDClassNames = new HashMap<>();
-
- private static final Map<String, RendererProvider> outlineRendererProvidersForComponentClassNames = new HashMap<>();
- private static final Map<String, RendererProvider> symbolRendererProvidersForComponentClassNames = new HashMap<>();
+ // public static members
+ public static final CodeSnippetSupplier<RendererProvider> symbolRendererProviderSupplier;
+ public static final CodeSnippetSupplier<RendererProvider> outlineRendererProviderSupplier;
- private static final RendererProvider defaultOutlineRendererProvider;
- private static final RendererProvider defaultSymbolRendererProvider;
static
{
- defaultOutlineRendererProvider = new DefaultOutlineRendererProvider();
- defaultSymbolRendererProvider = new DefaultSymbolRendererProvider();
- }
-
- static
- {
- try (InputStream s = IndirectGUIComponentCreator.class.getResourceAsStream("./standardSnippetIDMapping.json"))
- {
- if (s == null)
- throw new IOException("Resource not found");
- Map<String, String> tmp = JsonHandler.readJson(s, Map.class);
- standardSnippetIDClassNames.putAll(tmp);
- }
- catch (IOException e)
- {
- System.err.println("Failed to initialize standard snippet ID mapping: " + e.getMessage());
- }
+ symbolRendererProviderSupplier = new CodeSnippetSupplier<>(new DefaultSymbolRendererProvider());
+ outlineRendererProviderSupplier = new CodeSnippetSupplier<>(new DefaultOutlineRendererProvider());
}
- public static void addStandardSnippetID(String standardSnippetID, String associatedSnippetClassName)
- {
- standardSnippetIDClassNames.put(standardSnippetID, associatedSnippetClassName);
- }
+ // per-instance members
- public static void setOutlineRendererProvider(String id, RendererProvider outlineRendererProvider)
- {
- outlineRendererProvidersForComponentClassNames.put(id, outlineRendererProvider);
- }
+ private final Map<String, String> standardSnippetIDClassNames = new HashMap<>();
+ private final Map<String, S> snippetProvidersForClassNames = new HashMap<>();
+ private final S defaultSnippetProvider;
- public static void setSymbolRendererProvider(String id, RendererProvider symbolRendererProvider)
+ private CodeSnippetSupplier(S defaultSnippetProvider)
{
- symbolRendererProvidersForComponentClassNames.put(id, symbolRendererProvider);
+ this.defaultSnippetProvider = defaultSnippetProvider;
}
- public static Renderer createOutlineRenderer(String id, DeserializedSubmodelComponent component, JsonElement params)
+ public void addStandardSnippetID(String standardSnippetID, String associatedSnippetClassName)
{
- return getSnippet(id, outlineRendererProvidersForComponentClassNames, defaultOutlineRendererProvider).create(component, params);
+ standardSnippetIDClassNames.put(standardSnippetID, associatedSnippetClassName);
}
- public static Renderer createSymbolRenderer(String id, DeserializedSubmodelComponent component, JsonElement params)
+ public void setSnippetProvider(String id, S snippetProvider)
{
- return getSnippet(id, symbolRendererProvidersForComponentClassNames, defaultSymbolRendererProvider).create(component, params);
+ snippetProvidersForClassNames.put(id, snippetProvider);
}
// TODO report errors
- private static <C> C getSnippet(String id, Map<String, C> specializedCodeMap, C defaultSnippet)
+ public S getSnippetProvider(String id)
{
if (id != null)
{
- String snippetClassName;
+ String snippetProviderClassName;
if (id.startsWith("class:"))
- snippetClassName = id.substring(6);
+ snippetProviderClassName = id.substring(6);
else
- snippetClassName = standardSnippetIDClassNames.get(id);
- if (snippetClassName != null)
+ snippetProviderClassName = standardSnippetIDClassNames.get(id);
+ if (snippetProviderClassName != null)
{
- tryLoadSnippetClass(snippetClassName);
- C specializedCode = specializedCodeMap.get(snippetClassName);
- if (specializedCode != null)
- return specializedCode;
+ tryLoadSnippetClass(snippetProviderClassName);
+ S snippetProvider = snippetProvidersForClassNames.get(snippetProviderClassName);
+ if (snippetProvider != null)
+ return snippetProvider;
}
}
System.err.println("Couldn't load snippet " + id + "; using default");
- return defaultSnippet;
+ return defaultSnippetProvider;
+ }
+
+ // static helpers
+
+ static
+ {
+ try (InputStream s = IndirectGUIComponentCreator.class.getResourceAsStream("./standardSnippetIDMapping.json"))
+ {
+ if (s == null)
+ throw new IOException("Resource not found");
+ SnippetIDClassNames tmp = JsonHandler.readJson(s, SnippetIDClassNames.class);
+ tmp.standardOutlineRendererProviders.forEach(outlineRendererProviderSupplier::addStandardSnippetID);
+ tmp.standardSymbolRendererProviders.forEach(symbolRendererProviderSupplier::addStandardSnippetID);
+ }
+ catch (Exception e)
+ {
+ System.err.println("Failed to initialize standard snippet ID mapping: ");
+ e.printStackTrace();
+ }
+ }
+
+ private static class SnippetIDClassNames
+ {
+ public Map<String, String> standardOutlineRendererProviders;
+ public Map<String, String> standardSymbolRendererProviders;
}
private static void tryLoadSnippetClass(String snippetClassName)
System.err.printf(errorMessageFormat, className, "ClassNotFoundException thrown: " + e.getMessage());
}
}
+
}
\ No newline at end of file