X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=plugins%2Fnet.mograsim.machine%2Fsrc%2Fnet%2Fmograsim%2Fmachine%2FMachineRegistry.java;h=089cf31c9fb9f69671211e0204a8a0afccbd23e9;hb=3278dbc72d3d3c803dc5ad2c0dfedc42b277a3d6;hp=28e792169c5e50d24fa2d05e6edf4bd49647206f;hpb=f919efc362c3de5c94d894dc8fc7fe22c03fc865;p=Mograsim.git diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineRegistry.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineRegistry.java index 28e79216..089cf31c 100644 --- a/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineRegistry.java +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineRegistry.java @@ -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. + *

+ * 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 installedMachines = new HashMap<>(); + public static final String MACHINE_EXT_ID = "net.mograsim.machine.machine_definition"; + + private static final Map installedMachines = Collections.synchronizedMap(new HashMap<>()); + private static final Set listeners = Collections.synchronizedSet(new HashSet<>()); private static void reload() { @@ -35,7 +49,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 + ""); @@ -46,6 +64,7 @@ public class MachineRegistry { System.out.println(ex.getMessage()); } + notifyListeners(); } public static void initialize() @@ -89,4 +108,26 @@ public class MachineRegistry { return installedMachines.get(id); } + + private static void notifyListeners() + { + Map 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 installedMachines); + } }