1 package net.mograsim.plugin.nature;
3 import java.util.Collections;
4 import java.util.HashMap;
5 import java.util.HashSet;
7 import java.util.Objects;
8 import java.util.Optional;
11 import org.eclipse.core.resources.IProject;
12 import org.eclipse.core.resources.IResourceChangeEvent;
13 import org.eclipse.core.resources.ProjectScope;
14 import org.eclipse.core.resources.ResourcesPlugin;
15 import org.eclipse.core.runtime.Adapters;
16 import org.eclipse.core.runtime.CoreException;
17 import org.eclipse.core.runtime.IAdaptable;
18 import org.eclipse.ui.preferences.ScopedPreferenceStore;
20 import net.mograsim.plugin.nature.ProjectContextEvent.ProjectContextEventType;
22 public class ProjectMachineContext
24 private static Map<IProject, MachineContext> projectMachineContexts = Collections.synchronizedMap(new HashMap<>());
25 private static final Set<ProjectContextListener> listeners = Collections.synchronizedSet(new HashSet<>());
27 public static final String MOGRASIM_PROJECT_PREFS_NODE = "net.mograsim";
28 public static final String MACHINE_PROPERTY = "net.mograsim.projectMachineId";
30 public static MachineContext getMachineContextOf(IProject project)
32 MachineContext mc = projectMachineContexts.get(project);
35 validateMograsimNatureProject(project);
36 mc = new MachineContext(project);
37 projectMachineContexts.put(project, mc);
38 notifyListeners(new ProjectContextEvent(mc, ProjectContextEventType.NEW));
42 public static MachineContext getMachineContextOf(IAdaptable mograsimProjectAdapable)
44 IProject project = Adapters.adapt(mograsimProjectAdapable, IProject.class, true);
45 Objects.requireNonNull(project, "project was null / no project found for " + mograsimProjectAdapable);
46 return getMachineContextOf(project);
49 public static Map<IProject, MachineContext> getAllProjectMachineContexts()
51 return Collections.unmodifiableMap(projectMachineContexts);
54 static ScopedPreferenceStore getProjectPrefs(IProject mograsimProject)
56 return new ScopedPreferenceStore(new ProjectScope(mograsimProject), MOGRASIM_PROJECT_PREFS_NODE);
59 static IProject validateMograsimNatureProject(IAdaptable mograsimProjectAdapable)
62 if (mograsimProjectAdapable instanceof IProject)
64 project = (IProject) mograsimProjectAdapable;
67 project = Adapters.adapt(mograsimProjectAdapable, IProject.class, true);
68 Objects.requireNonNull(project, () -> mograsimProjectAdapable + " is not adaptable to IProject");
72 if (!project.isNatureEnabled(MograsimNature.NATURE_ID))
73 throw new IllegalArgumentException(mograsimProjectAdapable + "is not (in) a Mograsim project");
75 catch (CoreException e)
78 throw new IllegalArgumentException(mograsimProjectAdapable + " project nature could not be evaluated", e);
83 static boolean hasMograsimNature(IProject project)
89 return project.isNatureEnabled(MograsimNature.NATURE_ID);
91 catch (CoreException e)
98 static Optional<String> getMachineIdFrom(ScopedPreferenceStore preferenceStore)
100 if (preferenceStore.contains(MACHINE_PROPERTY))
101 return Optional.of(preferenceStore.getString(MACHINE_PROPERTY));
102 return Optional.empty();
105 static void notifyListeners(ProjectContextEvent projectContextEvent)
107 listeners.forEach(l -> l.onProjectContextChange(projectContextEvent));
110 public static void addProjectContextListener(ProjectContextListener listener)
112 listeners.add(listener);
115 public static void removeProjectContextListener(ProjectContextListener listener)
117 listeners.remove(listener);
122 ResourcesPlugin.getWorkspace().addResourceChangeListener(ProjectMachineContext::resourceChanged);
125 private static void resourceChanged(IResourceChangeEvent event)
127 // System.out.println(((ResourceChangeEvent) event).toDebugString());
128 ProjectContextEventType eventType = ProjectContextEventType.ofResourceChangeEvent(event.getType());
129 if (eventType == null)
131 if (event.getResource() == null || event.getResource().getProject() == null)
133 MachineContext mc = projectMachineContexts.get(event.getResource().getProject());
136 // System.out.println(" " + eventType + " - " + mc.getProject());
137 notifyListeners(new ProjectContextEvent(mc, eventType));