The final restructured version for automatic build using maven tycho
[Mograsim.git] / plugins / net.mograsim.logic.model / src / net / mograsim / logic / model / snippets / CodeSnippetSupplier.java
1 package net.mograsim.logic.model.snippets;
2
3 import java.util.Collections;
4 import java.util.HashMap;
5 import java.util.Map;
6
7 import net.mograsim.logic.model.serializing.ReflectionHelper;
8
9 public class CodeSnippetSupplier<C, S>
10 {
11         private final Map<String, String> standardSnippetIDClassNames = new HashMap<>();
12         private final Map<String, String> standardSnippetIDClassNamesUnmodifiable = Collections.unmodifiableMap(standardSnippetIDClassNames);
13         private final Map<String, SnippetDefinintion<C, ?, S>> snippetSuppliersForClassNames = new HashMap<>();
14         private final SnippetDefinintion<C, ?, S> defaultSnippetSupplier;
15
16         public CodeSnippetSupplier(SnippetDefinintion<C, ?, S> defaultSnippetSupplier)
17         {
18                 this.defaultSnippetSupplier = defaultSnippetSupplier;
19         }
20
21         public void addStandardSnippetID(String standardSnippetID, String associatedSnippetID)
22         {
23                 if (!associatedSnippetID.startsWith("class:"))
24                         throw new IllegalArgumentException("Unrecognized snippet ID format: " + associatedSnippetID);
25                 standardSnippetIDClassNames.put(standardSnippetID, associatedSnippetID);
26         }
27
28         public Map<String, String> getStandardSnippetIDs()
29         {
30                 return standardSnippetIDClassNamesUnmodifiable;
31         }
32
33         public void setSnippetSupplier(String id, SnippetDefinintion<C, ?, S> snippetSupplier)
34         {
35                 snippetSuppliersForClassNames.put(id, snippetSupplier);
36         }
37
38         // TODO report errors
39         public SnippetDefinintion<C, ?, S> getSnippetSupplier(String id)
40         {
41                 if (id != null)
42                 {
43                         String resolvedID = resolveID(id);
44                         if (resolvedID != null)
45                         {
46                                 String snippetClassName = resolvedID.substring(6);
47                                 tryLoadSnippetClass(snippetClassName);
48                                 SnippetDefinintion<C, ?, S> snippetSupplier = snippetSuppliersForClassNames.get(snippetClassName);
49                                 if (snippetSupplier != null)
50                                         return snippetSupplier;
51                         }
52                         System.err.println("Couldn't load snippet " + id + "; using default");
53                 }
54                 if (defaultSnippetSupplier == null)
55                         throw new IllegalArgumentException("No default snippet set");
56                 return defaultSnippetSupplier;
57         }
58
59         public String resolveID(String id)
60         {
61                 if (id.startsWith("class:"))
62                         return id;
63                 return standardSnippetIDClassNames.get(id);
64         }
65
66         // static helpers
67
68         private static void tryLoadSnippetClass(String snippetClassName)
69         {
70                 ReflectionHelper.tryInvokeStaticInitializer(snippetClassName, "Error getting snippet class: %s: %s\n");
71         }
72 }