Added comment on MachineRegistry
[Mograsim.git] / plugins / net.mograsim.machine / src / net / mograsim / machine / MachineRegistry.java
index 52e5d60..089cf31 100644 (file)
@@ -3,7 +3,11 @@ 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;
@@ -12,11 +16,21 @@ import org.eclipse.core.runtime.IExtensionRegistry;
 import org.eclipse.core.runtime.IRegistryEventListener;
 import org.eclipse.core.runtime.Platform;
 
+/**
+ * The MachineRegsitry is a static context registry for all {@link MachineDefinition}s known at any point during runtime.
+ * <p>
+ * It is updated automatically as mograsim machine definition extension points ({@link #MACHINE_EXT_ID}) are added or removed.
+ *
+ * @author Christian Femers
+ *
+ */
 public class MachineRegistry
 {
-       private static final String MACHINE_EXT_ID = "net.mograsim.machine.machine_definition";
 
-       private static final Map<String, MachineDefinition> installedMachines = new HashMap<>();
+       public static final String MACHINE_EXT_ID = "net.mograsim.machine.machine_definition";
+
+       private static final Map<String, MachineDefinition> installedMachines = Collections.synchronizedMap(new HashMap<>());
+       private static final Set<MachineRegistryListener> listeners = Collections.synchronizedSet(new HashSet<>());
 
        private static void reload()
        {
@@ -50,6 +64,7 @@ public class MachineRegistry
                {
                        System.out.println(ex.getMessage());
                }
+               notifyListeners();
        }
 
        public static void initialize()
@@ -93,4 +108,26 @@ public class MachineRegistry
        {
                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);
+       }
 }