b434ec9786505fa6bed9c30d92e937092dc1841d
[Mograsim.git] / plugins / net.mograsim.plugin.core / src / net / mograsim / plugin / nature / MachineContext.java
1 package net.mograsim.plugin.nature;
2
3 import java.io.IOException;
4 import java.util.Objects;
5 import java.util.Optional;
6
7 import org.eclipse.core.resources.IProject;
8 import org.eclipse.jface.util.PropertyChangeEvent;
9 import org.eclipse.ui.preferences.ScopedPreferenceStore;
10
11 import net.mograsim.machine.Machine;
12 import net.mograsim.machine.MachineDefinition;
13 import net.mograsim.machine.MachineRegistry;
14
15 public class MachineContext
16 {
17         IProject owner;
18         ScopedPreferenceStore prefs;
19         Optional<String> machineId;
20         Optional<MachineDefinition> machineDefinition;
21         Optional<Machine> activeMachine;
22
23         public MachineContext(IProject owner)
24         {
25                 this.owner = Objects.requireNonNull(owner);
26                 prefs = ProjectMachineContext.getProjectPrefs(owner);
27                 prefs.addPropertyChangeListener(this::preferenceListener);
28                 machineId = ProjectMachineContext.getMachineIdFrom(prefs);
29                 updateDefinition();
30         }
31
32         public final IProject getProject()
33         {
34                 return owner;
35         }
36
37         public final ScopedPreferenceStore getPreferences()
38         {
39                 return prefs;
40         }
41
42         /**
43          * Returns true if the project configuration is valid in the current environment
44          */
45         public final boolean isCurrentyValid()
46         {
47                 return machineDefinition.isPresent();
48         }
49
50         /**
51          * Returns true if the persisted project configuration itself is intact
52          */
53         public final boolean isIntact()
54         {
55                 return machineId.isPresent();
56         }
57
58         /**
59          * Returns true if a machine is instantiated and (possibly) running
60          */
61         public final boolean isActive()
62         {
63                 return activeMachine.isPresent();
64         }
65
66         /**
67          * Sets the projects machineId. Will likely break things, if the {@link MachineContext} {@link #isActive()}.
68          */
69         public final boolean setMachineId(String machineId)
70         {
71                 prefs.setValue(ProjectMachineContext.MACHINE_PROPERTY, machineId);
72                 try
73                 {
74                         prefs.save();
75                 }
76                 catch (IOException e)
77                 {
78                         e.printStackTrace();
79                         return false;
80                 }
81                 return true;
82         }
83
84         /**
85          * Sets the active machine in the {@link MachineContext}'s project scope.
86          */
87         public final void setActiveMachine(Machine machine)
88         {
89                 activeMachine = Optional.ofNullable(machine);
90         }
91
92         public final Optional<String> getMachineId()
93         {
94                 return machineId;
95         }
96
97         public final Optional<MachineDefinition> getMachineDefinition()
98         {
99                 return machineDefinition;
100         }
101
102         public final Optional<Machine> getActiveMachine()
103         {
104                 return activeMachine;
105         }
106
107         final void updateDefinition()
108         {
109                 machineDefinition = machineId.map(MachineRegistry::getMachine);
110         }
111
112         private void preferenceListener(PropertyChangeEvent changeEvent)
113         {
114                 if (changeEvent.getProperty().equals(ProjectMachineContext.MACHINE_PROPERTY))
115                 {
116                         machineId = Optional.ofNullable((String) changeEvent.getNewValue());
117                         updateDefinition();
118                 }
119         }
120 }