2e7a9c1dbf6ea03422e23243bff7f7676b772ede
[Mograsim.git] / plugins / 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.machine.Machine;
8 import net.mograsim.machine.MachineRegistry;
9
10 public class MachineContext
11 {
12         private Machine machine;
13         private Set<ContextObserver> observers;
14         private static MachineContext instance;
15
16         private MachineContext()
17         {
18                 observers = new HashSet<>();
19         }
20
21         public static MachineContext getInstance()
22         {
23                 if (instance == null)
24                 {
25                         instance = new MachineContext();
26                         // TODO don't hardcode the Am2900
27                         instance.setMachine(MachineRegistry.getinstalledMachines().get("Am2900").createNew());
28                 }
29                 return instance;
30         }
31
32         public Machine getMachine()
33         {
34                 return machine;
35         }
36
37         public void setMachine(Machine machine)
38         {
39                 this.machine = machine;
40                 notifyObservers(machine);
41         }
42
43         public void registerObserver(ContextObserver ob)
44         {
45                 observers.add(ob);
46                 ob.setMachine(Optional.ofNullable(machine));
47         }
48
49         public void deregisterObserver(ContextObserver ob)
50         {
51                 observers.remove(ob);
52         }
53
54         private void notifyObservers(Machine machine)
55         {
56                 observers.forEach(ob -> ob.setMachine(Optional.ofNullable(machine)));
57         }
58
59         @FunctionalInterface
60         public static interface ContextObserver
61         {
62                 void setMachine(Optional<Machine> machine);
63         }
64 }