Made CodeSnippetSupplier generic
[Mograsim.git] / net.mograsim.logic.ui / src / net / mograsim / logic / ui / serializing / CodeSnippetSupplier.java
index 8c13e96..453e2ac 100644 (file)
@@ -5,89 +5,89 @@ import java.io.InputStream;
 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)
@@ -106,4 +106,5 @@ public class CodeSnippetSupplier
                        System.err.printf(errorMessageFormat, className, "ClassNotFoundException thrown: " + e.getMessage());
                }
        }
+
 }
\ No newline at end of file