The final restructured version for automatic build using maven tycho
[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.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                         // TODO don't hardcode the Am2900
29                         instance.setMachine(new Am2900Machine((Am2900MachineDefinition) MachineRegistry.getinstalledMachines().get("Am2900")));
30                 }
31                 return instance;
32         }
33
34         public Machine getMachine()
35         {
36                 return machine;
37         }
38
39         public void setMachine(Machine machine)
40         {
41                 this.machine = machine;
42                 notifyObservers(machine);
43         }
44
45         public void registerObserver(ContextObserver ob)
46         {
47                 observers.add(ob);
48                 ob.setMachine(Optional.ofNullable(machine));
49         }
50
51         public void deregisterObserver(ContextObserver ob)
52         {
53                 observers.remove(ob);
54         }
55
56         private void notifyObservers(Machine machine)
57         {
58                 observers.forEach(ob -> ob.setMachine(Optional.ofNullable(machine)));
59         }
60
61         @FunctionalInterface
62         public static interface ContextObserver
63         {
64                 void setMachine(Optional<Machine> machine);
65         }
66 }