Eclipseplugins
PaProjectManager.java
1 package com.proalpha.pds.paconnector;
2 
3 import java.text.MessageFormat;
4 import java.util.Arrays;
5 import java.util.List;
6 import java.util.concurrent.CopyOnWriteArrayList;
7 
8 import org.eclipse.core.resources.IFile;
9 import org.eclipse.core.resources.IProject;
10 import org.eclipse.core.resources.IResource;
11 import org.eclipse.core.resources.ResourcesPlugin;
12 import org.eclipse.core.runtime.CoreException;
13 import org.eclipse.core.runtime.IAdaptable;
14 import org.eclipse.core.runtime.IAdapterManager;
15 import org.eclipse.core.runtime.Platform;
16 import org.eclipse.core.runtime.SubMonitor;
17 import org.eclipse.jface.dialogs.MessageDialog;
18 import org.eclipse.jface.text.ITextSelection;
19 import org.eclipse.jface.viewers.ISelection;
20 import org.eclipse.jface.viewers.IStructuredSelection;
21 import org.eclipse.jface.viewers.ITreeSelection;
22 import org.eclipse.swt.widgets.Display;
23 import org.eclipse.ui.IEditorInput;
24 import org.eclipse.ui.IEditorPart;
25 import org.eclipse.ui.ISelectionService;
26 import org.eclipse.ui.IWorkbenchPage;
27 import org.eclipse.ui.IWorkbenchWindow;
28 import org.eclipse.ui.PlatformUI;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
31 
32 import com.openedge.pdt.project.IOpenEdgeProject;
33 import com.openedge.pdt.project.IOpenEdgeProjectListener;
34 import com.openedge.pdt.project.OEProject;
35 import com.openedge.pdt.project.OEProjectPlugin;
36 import com.proalpha.pds.paconnector.utils.CheckPythonModules;
37 
38 public class PaProjectManager {
39 
40  private final Logger logger = LoggerFactory.getLogger(PaProjectManager.class);
41 
42  private OpenEdgeProjectListener projectListener;
43  private List<PaProject> paProjects;
44 
45  public List<PaProject> getPaProjects() {
46  return paProjects;
47  }
48 
49  private Boolean pythonVersionChecked = false;
50 
51  public PaProjectManager() {
52  this.paProjects = new CopyOnWriteArrayList<>();
53  this.projectListener = new OpenEdgeProjectListener();
54  OEProjectPlugin.getDefault().getProjectManager().addOpenEdgeProjectListener(projectListener);
55 
56  // Add all projects that were already opened before the listener was registered
57  this.checkPythonVersions();
58  this.addOpenProjects();
59 
60  }
61 
65  private void addOpenProjects() {
66  List<IProject> projects = Arrays.asList(ResourcesPlugin.getWorkspace().getRoot().getProjects());
67  for (IProject project : projects) {
68  if (project.isOpen()) {
69  OEProject oeProject = (OEProject) OEProjectPlugin.getDefault().getOpenEdgeModel()
70  .getOpenEdgeProject(project);
71  if(oeProject != null) addPaProject(oeProject);
72  }
73  }
74  }
75 
76  public void addPaProject(IOpenEdgeProject oeProject) {
77  if (canAddPaProject(oeProject)) {
78  final PaProject paProject = new PaProject((OEProject) oeProject);
79  paProjects.add(paProject);
80  this.checkPythonVersions();
81  }
82  }
83 
84  public void addPaProject(PaProject paProject) {
85  if (canAddPaProject(paProject.getOeProject())) {
86  paProjects.add(paProject);
87  this.checkPythonVersions();
88  }
89  }
90 
91  private boolean canAddPaProject(IOpenEdgeProject oeProject) {
92  try {
93  IProject project = oeProject.getProject();
94  if(project != null) return project.hasNature("com.proalpha.pds.ui.proalphaNature");
95  return false;
96  } catch (CoreException e) {
97  return false;
98  }
99  }
100 
101  public void removePaProject(IOpenEdgeProject oeProject) {
102  paProjects.forEach(paProject -> {
103  if (paProject.getOeProject().equals(oeProject)) {
104  paProject.dispose();
105  paProjects.remove(paProject);
106  }
107  });
108  }
109 
110  public void openProjects(List<IProject> affectedProjects, SubMonitor monitor) {
111  for (IProject iProject : affectedProjects) {
112  SubMonitor subMonitor = monitor.newChild(1);
113  subMonitor.subTask(MessageFormat.format("Opening project {0}", iProject.getName()));
114  try {
115  iProject.open(subMonitor);
116  } catch (CoreException e) {
117  logger.error("Error while opening project {}", iProject);
118  } finally {
119  subMonitor.done();
120  }
121  }
122  }
123 
124  public void closeProjects(List<IProject> affectedProjects, SubMonitor monitor) {
125  for (IProject iProject : affectedProjects) {
126  SubMonitor subMonitor = monitor.newChild(1);
127  subMonitor.subTask(MessageFormat.format("Closing project {0}", iProject.getName()));
128  try {
129  iProject.close(subMonitor);
130  } catch (CoreException e) {
131  logger.error("Error while closing project {}", iProject);
132  } finally {
133  subMonitor.done();
134  }
135  }
136  }
137 
138  public PaProject getPaProject(IOpenEdgeProject oeProject) {
139  for (PaProject paProject : paProjects) {
140  if (paProject.getOeProject().equals(oeProject))
141  return paProject;
142  }
143  return null;
144  }
145 
146  public PaProject getPaProject(IProject iProject) {
147 
148  OEProject oeProject = (OEProject) OEProjectPlugin.getDefault().getOpenEdgeModel().getOpenEdgeProject(iProject);
149  for (PaProject paProject : paProjects) {
150  if (paProject.getOeProject().equals(oeProject))
151  return paProject;
152  }
153  return null;
154  }
155 
160  PaProject paProject = null;
161 
162  // get the WorkbenchWindow
163  IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
164 
165  if (activeWorkbenchWindow == null) {
166  // without a activeWorkbenchWindow we can't find anything.
167  return null;
168  }
169  // first try to find with Selection Service
170  ISelectionService service = activeWorkbenchWindow.getService(ISelectionService.class);
171 
172  if (service != null) {
173  ISelection selection = service.getSelection();
174  if (selection instanceof IStructuredSelection) {
175  if (((IStructuredSelection) selection).getFirstElement() instanceof IResource) {
176  IProject curProject = ((IResource) ((IStructuredSelection) selection).getFirstElement())
177  .getProject();
178  // OEProjet found. Return
179  paProject = getPaProject(curProject);
180  }
181  }
182  }
183 
184  // If we didn't find any project try to find it via EditorInput
185  if (paProject == null) {
186 
187  // second try to find with active Page of workbench
188  try {
189  // Every single assign could throw a NPE. But we don't want to
190  // check for null after every assign. Try and catch is the better way
191  IWorkbenchPage activePage = activeWorkbenchWindow.getActivePage();
192  IEditorPart activeEditor = activePage.getActiveEditor();
193  IEditorInput curedit = activeEditor.getEditorInput();
194  IResource curresource = curedit.getAdapter(IResource.class);
195  IProject curProject = curresource.getProject();
196  paProject = getPaProject(curProject);
197  } catch (NullPointerException e) {
198  // do nothing. So we return null
199  }
200  }
201  return paProject;
202  }
203 
204  public PaProject getPaProjectByProjectExplorer() {
205  ISelectionService ss = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService();
206  String projExpID = "org.eclipse.ui.navigator.ProjectExplorer";
207  ISelection sel = ss.getSelection(projExpID);
208  Object selectedObject = sel;
209  if (sel instanceof IStructuredSelection) {
210  selectedObject = ((IStructuredSelection) sel).getFirstElement();
211  }
212  if (selectedObject instanceof IAdaptable) {
213  IResource res = ((IAdaptable) selectedObject).getAdapter(IResource.class);
214  return getPaProject(res.getProject());
215  }
216  return null;
217  }
218 
219  public IFile getFileFromActiveSelection() {
220 
221  IFile file = null;
222  IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
223  IAdapterManager adapterManager = Platform.getAdapterManager();
224 
225  if (workbenchWindow != null && adapterManager != null) {
226 
227  ISelectionService selectionService = workbenchWindow.getSelectionService();
228  ISelection activSelection = selectionService.getSelection();
229 
230  if (activSelection instanceof ITreeSelection) {
231  Object input = ((ITreeSelection) activSelection).getFirstElement();
232  if (input != null)
233  file = adapterManager.getAdapter(input, IFile.class);
234  }
235 
236  else if (activSelection instanceof ITextSelection) {
237  IWorkbenchPage page = workbenchWindow.getActivePage();
238  IEditorPart editor = page.getActiveEditor();
239  if (editor != null) {
240  IEditorInput input = editor.getEditorInput();
241  file = adapterManager.getAdapter(input, IFile.class);
242  }
243  }
244 
245  }
246 
247  return file;
248 
249  }
250 
251  public void dispose() {
252  if (projectListener != null) {
253  OEProjectPlugin.getDefault().getProjectManager().removeOpenEdgeProjectListener(projectListener);
254  projectListener = null;
255  }
256  }
257 
258  private void checkPythonVersions() {
259  // if version checked do not check again
260  if (this.pythonVersionChecked)
261  return;
262 
263  CheckPythonModules pycheck = new CheckPythonModules();
264 
265  if (!pycheck.pythonVersionsMatch()) {
266  // message dialogs can rise an error with invalid Thread access. execute in own
267  // thread and try a several times
268  new Thread(new Runnable() {
269  public void run() {
270  final String messagetext = "To use this plugin version of proALPHA higher versions of python modules is needed. "
271  + "To update the python module execute\n\n"
272  + "python -m pip install pa_installer --upgrade --upgrade-strategy=eager\n\n"
273  + "in a command line started with admin rights.";
274  // try till worked
275  while (true) {
276  try {
277  Thread.sleep(1000);
278  } catch (Exception e) {
279  }
280  Display.getDefault().asyncExec(new Runnable() {
281  public void run() {
282  MessageDialog.openWarning(
283  PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
284  "python not up to date", messagetext);
285  }
286  });
287  // after work done return
288  break;
289  }
290  }
291  }).start();
292 
293  }
294  this.pythonVersionChecked = true;
295  }
296 
297  private class OpenEdgeProjectListener implements IOpenEdgeProjectListener {
298  public void projectCreated(final IOpenEdgeProject project) {
299  PaProjectManager.this.addPaProject(project);
300  }
301 
302  public void projectDeleted(final IOpenEdgeProject project) {
303  PaProjectManager.this.removePaProject(project);
304  }
305 
306  }
307 
308 }