1 package net.mograsim.machine;
3 import java.util.Arrays;
4 import java.util.Collections;
5 import java.util.HashMap;
6 import java.util.HashSet;
8 import java.util.Objects;
11 import org.eclipse.core.runtime.CoreException;
12 import org.eclipse.core.runtime.IConfigurationElement;
13 import org.eclipse.core.runtime.IExtension;
14 import org.eclipse.core.runtime.IExtensionPoint;
15 import org.eclipse.core.runtime.IExtensionRegistry;
16 import org.eclipse.core.runtime.IRegistryEventListener;
17 import org.eclipse.core.runtime.Platform;
20 * The MachineRegsitry is a static context registry for all {@link MachineDefinition}s known at any point during runtime.
22 * It is updated automatically as mograsim machine definition extension points ({@link #MACHINE_EXT_ID}) are added or removed.
24 * @author Christian Femers
27 public class MachineRegistry
30 public static final String MACHINE_EXT_ID = "net.mograsim.machine.machine_definition";
32 private static final Map<String, MachineDefinition> installedMachines = Collections.synchronizedMap(new HashMap<>());
33 private static final Set<MachineRegistryListener> listeners = Collections.synchronizedSet(new HashSet<>());
35 private static void reload()
37 installedMachines.clear();
38 IExtensionRegistry registry = Platform.getExtensionRegistry();
39 System.out.println(Arrays.toString(registry.getExtensionPoints("net.mograsim.machine")));
40 IConfigurationElement[] config = registry.getConfigurationElementsFor(MACHINE_EXT_ID);
43 for (IConfigurationElement e : config)
45 System.out.println(e.getNamespaceIdentifier());
46 System.out.println(Arrays.toString(e.getAttributeNames()));
47 final Object o = e.createExecutableExtension("class");
48 final String id = e.getAttribute("unique_id");
49 if (o instanceof MachineDefinition)
51 System.out.println("Found " + id);
52 MachineDefinition md = (MachineDefinition) o;
53 if (Objects.equals(id, md.getId()))
54 installedMachines.put(id, md);
56 System.err.println("Machine definition ids to not match: " + id + " and " + md.getId());
59 System.err.println("Invalid machine definition: " + o + "(id=" + id + "");
63 catch (CoreException ex)
65 System.out.println(ex.getMessage());
70 public static void initialize()
73 Platform.getExtensionRegistry().addListener(new IRegistryEventListener()
77 public void removed(IExtensionPoint[] extensionPoints)
83 public void removed(IExtension[] extensions)
89 public void added(IExtensionPoint[] extensionPoints)
95 public void added(IExtension[] extensions)
102 public static Map<String, MachineDefinition> getInstalledMachines()
104 return Collections.unmodifiableMap(installedMachines);
107 public static MachineDefinition getMachine(String id)
109 return installedMachines.get(id);
112 private static void notifyListeners()
114 Map<String, MachineDefinition> unmodMachines = getInstalledMachines();
115 listeners.forEach(l -> l.onReload(unmodMachines));
118 public static void addMachineRegistryListener(MachineRegistryListener listener)
120 listeners.add(listener);
123 public static void removeMachineRegistryListener(MachineRegistryListener listener)
125 listeners.remove(listener);
129 public interface MachineRegistryListener
131 void onReload(Map<String, MachineDefinition> installedMachines);