Introduced Machine.getCoreModelParameters
[Mograsim.git] / plugins / net.mograsim.machine / src / net / mograsim / machine / MachineRegistry.java
index 28e7921..d312412 100644 (file)
@@ -1,9 +1,12 @@
 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,30 +15,40 @@ 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()
        {
                installedMachines.clear();
                IExtensionRegistry registry = Platform.getExtensionRegistry();
-               System.out.println(Arrays.toString(registry.getExtensionPoints("net.mograsim.machine")));
                IConfigurationElement[] config = registry.getConfigurationElementsFor(MACHINE_EXT_ID);
                try
                {
                        for (IConfigurationElement e : config)
                        {
-                               System.out.println(e.getNamespaceIdentifier());
-                               System.out.println(Arrays.toString(e.getAttributeNames()));
                                final Object o = e.createExecutableExtension("class");
                                final String id = e.getAttribute("unique_id");
                                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 + "");
@@ -44,8 +57,10 @@ public class MachineRegistry
                }
                catch (CoreException ex)
                {
-                       System.out.println(ex.getMessage());
+                       System.err.println("An error occurred reloading the machines:");
+                       ex.printStackTrace();
                }
+               notifyListeners();
        }
 
        public static void initialize()
@@ -89,4 +104,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);
+       }
 }