Updated Am2900Machine and -Definition; Added MachineContext
[Mograsim.git] / net.mograsim.plugin.core / src / net / mograsim / plugin / MachineContext.java
1 package net.mograsim.plugin;
2
3 import java.util.HashSet;
4 import java.util.Optional;
5 import java.util.Set;
6
7 import net.mograsim.logic.model.am2900.machine.Am2900Machine;
8 import net.mograsim.logic.model.am2900.machine.Am2900MachineDefinition;
9 import net.mograsim.machine.Machine;
10 import net.mograsim.machine.MachineRegistry;
11
12 public class MachineContext
13 {
14         private Machine machine;
15         private Set<ContextObserver> observers;
16         private static MachineContext instance;
17
18         private MachineContext()
19         {
20                 observers = new HashSet<>();
21         }
22
23         public static MachineContext getInstance()
24         {
25                 if (instance == null)
26                 {
27                         instance = new MachineContext();
28                         instance.setMachine(new Am2900Machine((Am2900MachineDefinition) MachineRegistry.getinstalledMachines().get("Am2900")));
29                 }
30                 return instance;
31         }
32
33         public Machine getMachine()
34         {
35                 return machine;
36         }
37
38         public void setMachine(Machine machine)
39         {
40                 this.machine = machine;
41                 notifyObservers(machine);
42         }
43
44         public void registerObserver(ContextObserver ob)
45         {
46                 observers.add(ob);
47                 ob.setMachine(Optional.ofNullable(machine));
48         }
49
50         public void deregisterObserver(ContextObserver ob)
51         {
52                 observers.remove(ob);
53         }
54
55         private void notifyObservers(Machine machine)
56         {
57                 observers.forEach(ob -> ob.setMachine(Optional.ofNullable(machine)));
58         }
59
60         @FunctionalInterface
61         public static interface ContextObserver
62         {
63                 void setMachine(Optional<Machine> machine);
64         }
65 }