Made CodeSnippetSupplier generic
authorDaniel Kirschten <daniel.kirschten@gmx.de>
Thu, 4 Jul 2019 08:50:11 +0000 (10:50 +0200)
committerDaniel Kirschten <daniel.kirschten@gmx.de>
Thu, 4 Jul 2019 08:50:11 +0000 (10:50 +0200)
net.mograsim.logic.ui/src/net/mograsim/logic/ui/serializing/CodeSnippetSupplier.java
net.mograsim.logic.ui/src/net/mograsim/logic/ui/serializing/SubmodelComponentDeserializer.java
net.mograsim.logic.ui/src/net/mograsim/logic/ui/serializing/snippets/symbolrenderers/CenteredTextSymbolRendererProvider.java
net.mograsim.logic.ui/src/net/mograsim/logic/ui/serializing/snippets/symbolrenderers/SimpleRectangularLikeSymbolRendererProvider.java
net.mograsim.logic.ui/src/net/mograsim/logic/ui/serializing/standardSnippetIDMapping.json

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
index e997ad2..20961a7 100644 (file)
@@ -61,9 +61,10 @@ public final class SubmodelComponentDeserializer
        {
                DeserializedSubmodelComponent comp = new DeserializedSubmodelComponent(model);
                comp.setSubmodelScale(params.submodel.innerScale);
-               comp.setOutlineRenderer(
-                               CodeSnippetSupplier.createOutlineRenderer(params.outlineRendererSnippetID, comp, params.outlineRendererParams));
-               comp.setSymbolRenderer(CodeSnippetSupplier.createSymbolRenderer(params.symbolRendererSnippetID, comp, params.symbolRendererParams));
+               comp.setOutlineRenderer(CodeSnippetSupplier.outlineRendererProviderSupplier.getSnippetProvider(params.outlineRendererSnippetID)
+                               .create(comp, params.outlineRendererParams));
+               comp.setSymbolRenderer(CodeSnippetSupplier.symbolRendererProviderSupplier.getSnippetProvider(params.symbolRendererSnippetID)
+                               .create(comp, params.symbolRendererParams));
                // TODO high level states
                comp.setSize(params.width, params.height);
                for (InterfacePinParams iPinParams : params.interfacePins)
index de1551b..98e6c43 100644 (file)
@@ -51,7 +51,7 @@ public class CenteredTextSymbolRendererProvider implements RendererProvider
 
        static
        {
-               CodeSnippetSupplier.setSymbolRendererProvider(CenteredTextSymbolRendererProvider.class.getCanonicalName(),
+               CodeSnippetSupplier.symbolRendererProviderSupplier.setSnippetProvider(CenteredTextSymbolRendererProvider.class.getCanonicalName(),
                                new CenteredTextSymbolRendererProvider());
        }
 }
\ No newline at end of file
index a47c47f..c7a8fa1 100644 (file)
@@ -77,7 +77,7 @@ public class SimpleRectangularLikeSymbolRendererProvider implements RendererProv
 
        static
        {
-               CodeSnippetSupplier.setSymbolRendererProvider(SimpleRectangularLikeSymbolRendererProvider.class.getCanonicalName(),
-                               new SimpleRectangularLikeSymbolRendererProvider());
+               CodeSnippetSupplier.symbolRendererProviderSupplier.setSnippetProvider(
+                               SimpleRectangularLikeSymbolRendererProvider.class.getCanonicalName(), new SimpleRectangularLikeSymbolRendererProvider());
        }
 }
\ No newline at end of file
index 850d54c..30976a0 100644 (file)
@@ -1,5 +1,8 @@
 mograsim version: 0.1.3
 {
-  "CenteredTextSymbolRenderer": "net.mograsim.logic.ui.serializing.snippets.symbolrenderers.CenteredTextSymbolRendererProvider",
-  "SimpleRectangularLikeSymbolRenderer": "net.mograsim.logic.ui.serializing.snippets.symbolrenderers.SimpleRectangularLikeSymbolRendererProvider"
+  "standardOutlineRendererProviders": {},
+  "standardSymbolRendererProviders": {
+    "CenteredTextSymbolRenderer": "net.mograsim.logic.ui.serializing.snippets.symbolrenderers.CenteredTextSymbolRendererProvider",
+    "SimpleRectangularLikeSymbolRenderer": "net.mograsim.logic.ui.serializing.snippets.symbolrenderers.SimpleRectangularLikeSymbolRendererProvider"
+  }
 }
\ No newline at end of file