0e6185c410045ad5d5fcf0a8c385700de556f02d
[Mograsim.git] / plugins / net.mograsim.plugin.core / src / net / mograsim / plugin / nature / ProjectMachineContext.java
1 package net.mograsim.plugin.nature;
2
3 import java.util.Collections;
4 import java.util.HashMap;
5 import java.util.Map;
6 import java.util.Objects;
7 import java.util.Optional;
8
9 import org.eclipse.core.resources.IProject;
10 import org.eclipse.core.resources.ProjectScope;
11 import org.eclipse.core.runtime.Adapters;
12 import org.eclipse.core.runtime.CoreException;
13 import org.eclipse.core.runtime.IAdaptable;
14 import org.eclipse.ui.preferences.ScopedPreferenceStore;
15
16 public class ProjectMachineContext
17 {
18         private static Map<IProject, MachineContext> projectMachineContexts = Collections.synchronizedMap(new HashMap<>());
19
20         public static final String MOGRASIM_PROJECT_PREFS_NODE = "net.mograsim";
21         public static final String MACHINE_PROPERTY = "net.mograsim.projectMachineId";
22
23         public static MachineContext getMachineContextOf(IProject project)
24         {
25                 MachineContext mc = projectMachineContexts.get(project);
26                 if (mc != null)
27                         return mc;
28                 validateMograsimNatureProject(project);
29                 mc = new MachineContext(project);
30                 projectMachineContexts.put(project, mc);
31                 return mc;
32         }
33
34         public static MachineContext getMachineContextOf(IAdaptable mograsimProjectAdapable)
35         {
36                 IProject project = Adapters.adapt(mograsimProjectAdapable, IProject.class, true);
37                 Objects.requireNonNull(project, "project was null / no project found for " + mograsimProjectAdapable);
38                 return getMachineContextOf(project);
39         }
40
41         static ScopedPreferenceStore getProjectPrefs(IProject mograsimProject)
42         {
43                 return new ScopedPreferenceStore(new ProjectScope(mograsimProject), MOGRASIM_PROJECT_PREFS_NODE);
44         }
45
46         static IProject validateMograsimNatureProject(IAdaptable mograsimProjectAdapable)
47         {
48                 IProject project;
49                 if (mograsimProjectAdapable instanceof IProject)
50                 {
51                         project = (IProject) mograsimProjectAdapable;
52                 } else
53                 {
54                         project = Adapters.adapt(mograsimProjectAdapable, IProject.class, true);
55                         Objects.requireNonNull(project, () -> mograsimProjectAdapable + " is not adaptable to IProject");
56                 }
57                 try
58                 {
59                         if (!project.isNatureEnabled(MograsimNature.NATURE_ID))
60                                 throw new IllegalArgumentException(mograsimProjectAdapable + "is not (in) a Mograsim project");
61                 }
62                 catch (CoreException e)
63                 {
64                         e.printStackTrace();
65                         throw new IllegalArgumentException(mograsimProjectAdapable + " project nature could not be evaluated", e);
66                 }
67                 return project;
68         }
69
70         static boolean hasMograsimNature(IProject project)
71         {
72                 if (project == null)
73                         return false;
74                 try
75                 {
76                         return project.isNatureEnabled(MograsimNature.NATURE_ID);
77                 }
78                 catch (CoreException e)
79                 {
80                         e.printStackTrace();
81                         return false;
82                 }
83         }
84
85         static Optional<String> getMachineIdFrom(ScopedPreferenceStore preferenceStore)
86         {
87                 if (preferenceStore.contains(MACHINE_PROPERTY))
88                         return Optional.of(preferenceStore.getString(MACHINE_PROPERTY));
89                 return Optional.empty();
90         }
91 }