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;
17 public class MachineContext
20 ScopedPreferenceStore prefs;
21 Optional<String> machineId;
22 Optional<MachineDefinition> machineDefinition;
23 Optional<Machine> activeMachine;
25 private final Set<ActiveMachineListener> observers = new HashSet<>();
27 public MachineContext(IProject owner)
29 this.owner = Objects.requireNonNull(owner);
30 prefs = ProjectMachineContext.getProjectPrefs(owner);
31 prefs.addPropertyChangeListener(this::preferenceListener);
32 machineId = ProjectMachineContext.getMachineIdFrom(prefs);
36 public final IProject getProject()
41 public final ScopedPreferenceStore getPreferences()
47 * Returns true if the project configuration is valid in the current environment
49 public final boolean isCurrentyValid()
51 return machineDefinition.isPresent();
55 * Returns true if the persisted project configuration itself is intact
57 public final boolean isIntact()
59 return machineId.isPresent();
63 * Returns true if a machine is instantiated and (possibly) running
65 public final boolean isActive()
67 return activeMachine.isPresent();
71 * Sets the projects machineId. Will likely break things, if the {@link MachineContext} {@link #isActive()}.
73 public final boolean setMachineId(String machineId)
75 prefs.setValue(ProjectMachineContext.MACHINE_PROPERTY, machineId);
89 * Sets the active machine in the {@link MachineContext}'s project scope.
91 public final void setActiveMachine(Machine machine)
93 activeMachine = Optional.ofNullable(machine);
97 public final Optional<String> getMachineId()
102 public final Optional<MachineDefinition> getMachineDefinition()
104 return machineDefinition;
107 public final Optional<Machine> getActiveMachine()
109 return activeMachine;
112 final void updateDefinition()
114 machineDefinition = machineId.map(MachineRegistry::getMachine);
117 private void preferenceListener(PropertyChangeEvent changeEvent)
119 if (changeEvent.getProperty().equals(ProjectMachineContext.MACHINE_PROPERTY))
121 machineId = Optional.ofNullable((String) changeEvent.getNewValue());
126 public void registerObserver(ActiveMachineListener ob)
129 ob.setMachine(activeMachine);
132 public void deregisterObserver(ActiveMachineListener ob)
134 observers.remove(ob);
137 private void notifyObservers()
139 observers.forEach(ob -> ob.setMachine(activeMachine));
143 public static interface ActiveMachineListener
145 void setMachine(Optional<Machine> machine);