The final restructured version for automatic build using maven tycho
[Mograsim.git] / plugins / net.mograsim.plugin.core / src / net / mograsim / plugin / MachineContext.java
diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/MachineContext.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/MachineContext.java
new file mode 100644 (file)
index 0000000..cc96edb
--- /dev/null
@@ -0,0 +1,66 @@
+package net.mograsim.plugin;
+
+import java.util.HashSet;
+import java.util.Optional;
+import java.util.Set;
+
+import net.mograsim.logic.model.am2900.machine.Am2900Machine;
+import net.mograsim.logic.model.am2900.machine.Am2900MachineDefinition;
+import net.mograsim.machine.Machine;
+import net.mograsim.machine.MachineRegistry;
+
+public class MachineContext
+{
+       private Machine machine;
+       private Set<ContextObserver> observers;
+       private static MachineContext instance;
+
+       private MachineContext()
+       {
+               observers = new HashSet<>();
+       }
+
+       public static MachineContext getInstance()
+       {
+               if (instance == null)
+               {
+                       instance = new MachineContext();
+                       // TODO don't hardcode the Am2900
+                       instance.setMachine(new Am2900Machine((Am2900MachineDefinition) MachineRegistry.getinstalledMachines().get("Am2900")));
+               }
+               return instance;
+       }
+
+       public Machine getMachine()
+       {
+               return machine;
+       }
+
+       public void setMachine(Machine machine)
+       {
+               this.machine = machine;
+               notifyObservers(machine);
+       }
+
+       public void registerObserver(ContextObserver ob)
+       {
+               observers.add(ob);
+               ob.setMachine(Optional.ofNullable(machine));
+       }
+
+       public void deregisterObserver(ContextObserver ob)
+       {
+               observers.remove(ob);
+       }
+
+       private void notifyObservers(Machine machine)
+       {
+               observers.forEach(ob -> ob.setMachine(Optional.ofNullable(machine)));
+       }
+
+       @FunctionalInterface
+       public static interface ContextObserver
+       {
+               void setMachine(Optional<Machine> machine);
+       }
+}