1 package net.mograsim.plugin.nature;
3 import java.io.IOException;
4 import java.util.HashSet;
5 import java.util.Objects;
6 import java.util.Optional;
9 import org.eclipse.core.resources.IProject;
10 import org.eclipse.jface.util.PropertyChangeEvent;
11 import org.eclipse.ui.preferences.ScopedPreferenceStore;
13 import net.mograsim.machine.Machine;
14 import net.mograsim.machine.MachineDefinition;
15 import net.mograsim.machine.MachineRegistry;
16 import net.mograsim.plugin.nature.ProjectContextEvent.ProjectContextEventType;
18 public class MachineContext
21 ScopedPreferenceStore prefs;
22 Optional<String> machineId;
23 Optional<MachineDefinition> machineDefinition;
24 Optional<Machine> activeMachine;
26 private final Set<ActiveMachineListener> observers = new HashSet<>();
28 public MachineContext(IProject owner)
30 this.owner = Objects.requireNonNull(owner);
31 prefs = ProjectMachineContext.getProjectPrefs(owner);
32 prefs.addPropertyChangeListener(this::preferenceListener);
33 machineId = ProjectMachineContext.getMachineIdFrom(prefs);
37 public final IProject getProject()
42 public final ScopedPreferenceStore getPreferences()
48 * Returns true if the project configuration is valid in the current environment
50 public final boolean isCurrentyValid()
52 return machineDefinition.isPresent();
56 * Returns true if the persisted project configuration itself is intact
58 public final boolean isIntact()
60 return machineId.isPresent();
64 * Returns true if a machine is instantiated and (possibly) running
66 public final boolean isActive()
68 return activeMachine.isPresent();
72 * Sets the projects machineId. Will likely break things, if the {@link MachineContext} {@link #isActive()}.
74 public final boolean setMachineId(String machineId)
76 prefs.setValue(ProjectMachineContext.MACHINE_PROPERTY, machineId);
90 * Sets the active machine in the {@link MachineContext}'s project scope.
92 public final void setActiveMachine(Machine machine)
94 activeMachine = Optional.ofNullable(machine);
98 public final Optional<String> getMachineId()
103 public final Optional<MachineDefinition> getMachineDefinition()
105 return machineDefinition;
108 public final Optional<Machine> getActiveMachine()
110 return activeMachine;
113 final void updateDefinition()
115 machineDefinition = machineId.map(MachineRegistry::getMachine);
116 machineDefinition.ifPresent(md -> setActiveMachine(md.createNew()));
117 ProjectMachineContext.notifyListeners(new ProjectContextEvent(this, ProjectContextEventType.MACHINE_DEFINITION_CHANGE));
120 private void preferenceListener(PropertyChangeEvent changeEvent)
122 if (changeEvent.getProperty().equals(ProjectMachineContext.MACHINE_PROPERTY))
124 machineId = Optional.ofNullable((String) changeEvent.getNewValue());
129 public void registerObserver(ActiveMachineListener ob)
132 ob.setMachine(activeMachine);
135 public void deregisterObserver(ActiveMachineListener ob)
137 observers.remove(ob);
140 private void notifyObservers()
142 observers.forEach(ob -> ob.setMachine(activeMachine));
146 public static interface ActiveMachineListener
148 void setMachine(Optional<Machine> machine);