Allow to listen for changes in the MachineRegistry
[Mograsim.git] / plugins / net.mograsim.machine / src / net / mograsim / machine / MachineRegistry.java
index a270646..ca52eae 100644 (file)
@@ -3,21 +3,30 @@ package net.mograsim.machine;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
 import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IRegistryEventListener;
 import org.eclipse.core.runtime.Platform;
 
 public class MachineRegistry
 {
+
        private static final String MACHINE_EXT_ID = "net.mograsim.machine.machine_definition";
 
-       private static Map<String, MachineDefinition> installedMachines = new HashMap<>();
+       private static final Map<String, MachineDefinition> installedMachines = Collections.synchronizedMap(new HashMap<>());
+       private static final Set<MachineRegistryListener> listeners = Collections.synchronizedSet(new HashSet<>());
 
-       public static void reload()
+       private static void reload()
        {
+               installedMachines.clear();
                IExtensionRegistry registry = Platform.getExtensionRegistry();
                System.out.println(Arrays.toString(registry.getExtensionPoints("net.mograsim.machine")));
                IConfigurationElement[] config = registry.getConfigurationElementsFor(MACHINE_EXT_ID);
@@ -32,7 +41,11 @@ public class MachineRegistry
                                if (o instanceof MachineDefinition)
                                {
                                        System.out.println("Found " + id);
-                                       installedMachines.put(id, (MachineDefinition) o);
+                                       MachineDefinition md = (MachineDefinition) o;
+                                       if (Objects.equals(id, md.getId()))
+                                               installedMachines.put(id, md);
+                                       else
+                                               System.err.println("Machine definition ids to not match: " + id + " and " + md.getId());
                                } else
                                {
                                        System.err.println("Invalid machine definition: " + o + "(id=" + id + "");
@@ -43,10 +56,70 @@ public class MachineRegistry
                {
                        System.out.println(ex.getMessage());
                }
+               notifyListeners();
+       }
+
+       public static void initialize()
+       {
+               reload();
+               Platform.getExtensionRegistry().addListener(new IRegistryEventListener()
+               {
+
+                       @Override
+                       public void removed(IExtensionPoint[] extensionPoints)
+                       {
+                               // nothing?
+                       }
+
+                       @Override
+                       public void removed(IExtension[] extensions)
+                       {
+                               reload();
+                       }
+
+                       @Override
+                       public void added(IExtensionPoint[] extensionPoints)
+                       {
+                               // nothing?
+                       }
+
+                       @Override
+                       public void added(IExtension[] extensions)
+                       {
+                               reload();
+                       }
+               }, MACHINE_EXT_ID);
        }
 
-       public static Map<String, MachineDefinition> getinstalledMachines()
+       public static Map<String, MachineDefinition> getInstalledMachines()
        {
                return Collections.unmodifiableMap(installedMachines);
        }
+
+       public static MachineDefinition getMachine(String id)
+       {
+               return installedMachines.get(id);
+       }
+
+       private static void notifyListeners()
+       {
+               Map<String, MachineDefinition> unmodMachines = getInstalledMachines();
+               listeners.forEach(l -> l.onReload(unmodMachines));
+       }
+
+       public static void addMachineRegistryListener(MachineRegistryListener listener)
+       {
+               listeners.add(listener);
+       }
+
+       public static void removeMachineRegistryListener(MachineRegistryListener listener)
+       {
+               listeners.remove(listener);
+       }
+
+       @FunctionalInterface
+       public interface MachineRegistryListener
+       {
+               void onReload(Map<String, MachineDefinition> installedMachines);
+       }
 }