Fixed a bug in Am2900; created dlatch8/80; relayouted some components
[Mograsim.git] / net.mograsim.logic.model / src / net / mograsim / logic / model / snippets / CodeSnippetSupplier.java
index 619254a..22ebc09 100644 (file)
@@ -3,12 +3,13 @@ package net.mograsim.logic.model.snippets;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Set;
+
+import net.mograsim.logic.model.serializing.ReflectionHelper;
 
 public class CodeSnippetSupplier<C, S>
 {
        private final Map<String, String> standardSnippetIDClassNames = new HashMap<>();
-       private final Set<String> standardSnippetIDSetUnmodifiable = Collections.unmodifiableSet(standardSnippetIDClassNames.keySet());
+       private final Map<String, String> standardSnippetIDClassNamesUnmodifiable = Collections.unmodifiableMap(standardSnippetIDClassNames);
        private final Map<String, SnippetDefinintion<C, ?, S>> snippetSuppliersForClassNames = new HashMap<>();
        private final SnippetDefinintion<C, ?, S> defaultSnippetSupplier;
 
@@ -17,14 +18,16 @@ public class CodeSnippetSupplier<C, S>
                this.defaultSnippetSupplier = defaultSnippetSupplier;
        }
 
-       public void addStandardSnippetID(String standardSnippetID, String associatedSnippetClassName)
+       public void addStandardSnippetID(String standardSnippetID, String associatedSnippetID)
        {
-               standardSnippetIDClassNames.put(standardSnippetID, associatedSnippetClassName);
+               if (!associatedSnippetID.startsWith("class:"))
+                       throw new IllegalArgumentException("Unrecognized snippet ID format: " + associatedSnippetID);
+               standardSnippetIDClassNames.put(standardSnippetID, associatedSnippetID);
        }
 
-       public Set<String> getStandardSnippetIDs()
+       public Map<String, String> getStandardSnippetIDs()
        {
-               return standardSnippetIDSetUnmodifiable;
+               return standardSnippetIDClassNamesUnmodifiable;
        }
 
        public void setSnippetSupplier(String id, SnippetDefinintion<C, ?, S> snippetSupplier)
@@ -37,13 +40,10 @@ public class CodeSnippetSupplier<C, S>
        {
                if (id != null)
                {
-                       String snippetClassName;
-                       if (id.startsWith("class:"))
-                               snippetClassName = id.substring(6);
-                       else
-                               snippetClassName = standardSnippetIDClassNames.get(id);
-                       if (snippetClassName != null)
+                       String resolvedID = resolveID(id);
+                       if (resolvedID != null)
                        {
+                               String snippetClassName = resolvedID.substring(6);
                                tryLoadSnippetClass(snippetClassName);
                                SnippetDefinintion<C, ?, S> snippetSupplier = snippetSuppliersForClassNames.get(snippetClassName);
                                if (snippetSupplier != null)
@@ -56,23 +56,17 @@ public class CodeSnippetSupplier<C, S>
                return defaultSnippetSupplier;
        }
 
-       // static helpers
-
-       private static void tryLoadSnippetClass(String snippetClassName)
+       public String resolveID(String id)
        {
-               tryInvokeStaticInitializer(snippetClassName, "Error getting snippet class: %s: %s\n");
+               if (id.startsWith("class:"))
+                       return id;
+               return standardSnippetIDClassNames.get(id);
        }
 
-       public static void tryInvokeStaticInitializer(String className, String errorMessageFormat)
+       // static helpers
+
+       private static void tryLoadSnippetClass(String snippetClassName)
        {
-               try
-               {
-                       Class.forName(className, true, CodeSnippetSupplier.class.getClassLoader());
-               }
-               catch (ClassNotFoundException e)
-               {
-                       System.err.printf(errorMessageFormat, className, "ClassNotFoundException thrown: " + e.getMessage());
-               }
+               ReflectionHelper.tryInvokeStaticInitializer(snippetClassName, "Error getting snippet class: %s: %s\n");
        }
-
 }
\ No newline at end of file