Allow to listen for changes in the MachineRegistry
[Mograsim.git] / plugins / net.mograsim.machine / src / net / mograsim / machine / MachineRegistry.java
1 package net.mograsim.machine;
2
3 import java.util.Arrays;
4 import java.util.Collections;
5 import java.util.HashMap;
6 import java.util.HashSet;
7 import java.util.Map;
8 import java.util.Objects;
9 import java.util.Set;
10
11 import org.eclipse.core.runtime.CoreException;
12 import org.eclipse.core.runtime.IConfigurationElement;
13 import org.eclipse.core.runtime.IExtension;
14 import org.eclipse.core.runtime.IExtensionPoint;
15 import org.eclipse.core.runtime.IExtensionRegistry;
16 import org.eclipse.core.runtime.IRegistryEventListener;
17 import org.eclipse.core.runtime.Platform;
18
19 public class MachineRegistry
20 {
21
22         private static final String MACHINE_EXT_ID = "net.mograsim.machine.machine_definition";
23
24         private static final Map<String, MachineDefinition> installedMachines = Collections.synchronizedMap(new HashMap<>());
25         private static final Set<MachineRegistryListener> listeners = Collections.synchronizedSet(new HashSet<>());
26
27         private static void reload()
28         {
29                 installedMachines.clear();
30                 IExtensionRegistry registry = Platform.getExtensionRegistry();
31                 System.out.println(Arrays.toString(registry.getExtensionPoints("net.mograsim.machine")));
32                 IConfigurationElement[] config = registry.getConfigurationElementsFor(MACHINE_EXT_ID);
33                 try
34                 {
35                         for (IConfigurationElement e : config)
36                         {
37                                 System.out.println(e.getNamespaceIdentifier());
38                                 System.out.println(Arrays.toString(e.getAttributeNames()));
39                                 final Object o = e.createExecutableExtension("class");
40                                 final String id = e.getAttribute("unique_id");
41                                 if (o instanceof MachineDefinition)
42                                 {
43                                         System.out.println("Found " + id);
44                                         MachineDefinition md = (MachineDefinition) o;
45                                         if (Objects.equals(id, md.getId()))
46                                                 installedMachines.put(id, md);
47                                         else
48                                                 System.err.println("Machine definition ids to not match: " + id + " and " + md.getId());
49                                 } else
50                                 {
51                                         System.err.println("Invalid machine definition: " + o + "(id=" + id + "");
52                                 }
53                         }
54                 }
55                 catch (CoreException ex)
56                 {
57                         System.out.println(ex.getMessage());
58                 }
59                 notifyListeners();
60         }
61
62         public static void initialize()
63         {
64                 reload();
65                 Platform.getExtensionRegistry().addListener(new IRegistryEventListener()
66                 {
67
68                         @Override
69                         public void removed(IExtensionPoint[] extensionPoints)
70                         {
71                                 // nothing?
72                         }
73
74                         @Override
75                         public void removed(IExtension[] extensions)
76                         {
77                                 reload();
78                         }
79
80                         @Override
81                         public void added(IExtensionPoint[] extensionPoints)
82                         {
83                                 // nothing?
84                         }
85
86                         @Override
87                         public void added(IExtension[] extensions)
88                         {
89                                 reload();
90                         }
91                 }, MACHINE_EXT_ID);
92         }
93
94         public static Map<String, MachineDefinition> getInstalledMachines()
95         {
96                 return Collections.unmodifiableMap(installedMachines);
97         }
98
99         public static MachineDefinition getMachine(String id)
100         {
101                 return installedMachines.get(id);
102         }
103
104         private static void notifyListeners()
105         {
106                 Map<String, MachineDefinition> unmodMachines = getInstalledMachines();
107                 listeners.forEach(l -> l.onReload(unmodMachines));
108         }
109
110         public static void addMachineRegistryListener(MachineRegistryListener listener)
111         {
112                 listeners.add(listener);
113         }
114
115         public static void removeMachineRegistryListener(MachineRegistryListener listener)
116         {
117                 listeners.remove(listener);
118         }
119
120         @FunctionalInterface
121         public interface MachineRegistryListener
122         {
123                 void onReload(Map<String, MachineDefinition> installedMachines);
124         }
125 }