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.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);
MachineDefinition md = (MachineDefinition) o;
if (Objects.equals(id, md.getId()))
installedMachines.put(id, md);
}
catch (CoreException ex)
{
- System.out.println(ex.getMessage());
+ System.err.println("An error occurred reloading the machines:");
+ ex.printStackTrace();
}
+ notifyListeners();
}
public static void initialize()
{
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);
+ }
}