Eclipseplugins
ConfigurePdsProject.java
1 package com.proalpha.pds.projconf.configure;
2 
3 import java.io.BufferedReader;
4 import java.io.File;
5 import java.io.FileReader;
6 import java.io.IOException;
7 import java.util.ArrayList;
8 import java.util.Arrays;
9 import java.util.Collections;
10 import java.util.HashSet;
11 import java.util.List;
12 import java.util.Set;
13 import java.util.function.Predicate;
14 
15 import org.apache.commons.io.FileUtils;
16 import org.eclipse.core.resources.IFolder;
17 import org.eclipse.core.resources.IProject;
18 import org.eclipse.core.resources.IProjectDescription;
19 import org.eclipse.core.resources.IResource;
20 import org.eclipse.core.resources.IWorkspace;
21 import org.eclipse.core.resources.IWorkspaceRoot;
22 import org.eclipse.core.resources.ResourcesPlugin;
23 import org.eclipse.core.runtime.CoreException;
24 import org.eclipse.core.runtime.IPath;
25 import org.eclipse.core.runtime.IProgressMonitor;
26 import org.eclipse.core.runtime.IStatus;
27 import org.eclipse.core.runtime.Path;
28 import org.eclipse.core.runtime.Platform;
29 import org.eclipse.core.runtime.QualifiedName;
30 import org.eclipse.core.runtime.jobs.Job;
31 import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
32 import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
33 import org.eclipse.mylyn.tasks.core.TaskRepository;
34 import org.eclipse.mylyn.tasks.ui.TasksUi;
35 import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
36 import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
37 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
38 import org.eclipse.wst.common.project.facet.core.IActionDefinition;
39 import org.eclipse.wst.common.project.facet.core.IFacetedProject;
40 import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy;
41 import org.eclipse.wst.common.project.facet.core.IProjectFacet;
42 import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
45 
46 import com.atlassian.connector.eclipse.internal.jira.core.JiraCorePlugin;
47 import com.openedge.pdt.platform.PlatformPlugin;
48 import com.openedge.pdt.platform.PlatformSupport;
49 import com.openedge.pdt.platform.Proversion;
50 import com.openedge.pdt.project.OEProject;
51 import com.openedge.pdt.project.OEProjectPlugin;
52 import com.openedge.pdt.project.OEPropertyStore;
53 import com.openedge.pdt.project.ProjectPropath;
54 import com.openedge.pdt.project.PropathConstants;
55 import com.openedge.pdt.project.PropathEntry;
56 import com.openedge.pdt.project.PropathEnvironmentEntry;
57 import com.openedge.pdt.project.facet.IOpenEdgeFacetConstants;
58 import com.openedge.pdt.project.facet.openedge.IOECommonDataModelProperties;
59 import com.openedge.pdt.project.facet.openedge.IOEDataModelProperties;
60 import com.openedge.pdt.project.facet.openedge.IOpenEdgeDataModelProperties;
61 import com.openedge.pdt.project.facet.openedge.OECommonDataModelProvider;
62 import com.openedge.pdt.project.facet.openedge.ProjectPropathWizardPage;
63 import com.openedge.pdt.project.projecttypespecification.IOEProjectTypeSpecification;
64 import com.openedge.pdt.project.projecttypespecification.OEProjectTypesSpecificationManager;
65 import com.openedge.pdt.project.properties.IOEProjectProperties;
66 import com.proalpha.pds.paconnector.PANature;
67 import com.proalpha.pds.paconnector.PaProject;
68 import com.proalpha.pds.projconf.importwizards.ReadDemasFile;
69 import com.proalpha.pds.projconf.utils.ProgressUtils;
70 
77 public class ConfigurePdsProject {
78 
79  private final Logger logger = LoggerFactory.getLogger(ConfigurePdsProject.class);
80 
81  private ReadDemasFile propertiesFile;
82  private PlatformSupport supportPlatform;
83 
87  public ConfigurePdsProject(ReadDemasFile propertiesFile) {
88  this.propertiesFile = propertiesFile;
89  this.supportPlatform = PlatformPlugin.getDefault().getPlatformSupport();
90  }
91 
99  public IProject createProject(IProgressMonitor monitor) throws CoreException {
100 
101  monitor.beginTask("Create new OpenEdge Project", IProgressMonitor.UNKNOWN);
102  IProjectFacet openedgeFacet = ProjectFacetsManager.getProjectFacet(IOpenEdgeFacetConstants.OPENEDGE_FACET_ID);
103  Set<IProjectFacet> fixedFacets = new HashSet<>();
104  fixedFacets.add(openedgeFacet);
105 
109  IFacetedProject fproj = ProjectFacetsManager.create(propertiesFile.getFullProjectName(),
110  new Path(propertiesFile.getClientfolderproalpha()), monitor);
111 
112  IActionDefinition actionDefinition = openedgeFacet.getVersion("11").getActionDefinition(
113  Collections.singleton(openedgeFacet.getVersion("11")), IFacetedProject.Action.Type.INSTALL);
114 
115  IDataModel openEdgeDataModel = (IDataModel) actionDefinition.createConfigObject();
116 
117  openEdgeDataModel.setStringProperty(IFacetDataModelProperties.FACET_ID,
118  IOpenEdgeFacetConstants.OPENEDGE_FACET_ID);
119  openEdgeDataModel.setProperty(IFacetDataModelProperties.FACETED_PROJECT_WORKING_COPY,
120  fproj.createWorkingCopy());
121  IOEProjectTypeSpecification oeProjectTypeSpecification = OEProjectTypesSpecificationManager
122  .getProjectTypesSpecificationManager().getProjectTypeSpecification(openedgeFacet);
123  openEdgeDataModel.setProperty(IOpenEdgeDataModelProperties.CP_SPECIFIACTION, oeProjectTypeSpecification);
124  openEdgeDataModel.setStringProperty(IOpenEdgeDataModelProperties.BUILD_DIRECTORY_PATH,
125  propertiesFile.getObjDir());
126  openEdgeDataModel.setProperty(IOpenEdgeDataModelProperties.CP_SPECIFIACTION, oeProjectTypeSpecification);
127  openEdgeDataModel.setBooleanProperty(IOpenEdgeDataModelProperties.USE_PROJECT_ROOT, false);
128 
132  IDataModel commonDataModel = DataModelFactory.createDataModel(new OECommonDataModelProvider());
133  commonDataModel.setStringProperty(IOECommonDataModelProperties.PROJECT_LOCATION,
134  propertiesFile.getClientfolderproalpha());
135  ProgressUtils utils = new ProgressUtils(supportPlatform);
136  Proversion proversion = utils.getProgressVersion();
137  commonDataModel.setProperty(IOEDataModelProperties.PROVERSION, proversion);
138  openEdgeDataModel.addNestedModel(IOEDataModelProperties.COMMON_MODEL, commonDataModel);
139  openEdgeDataModel.setProperty(IOEDataModelProperties.COMMON_MODEL, commonDataModel);
140 
141  OEPropertyStore oePropertyStore = new OEPropertyStore(fproj.getProject());
142  oePropertyStore.setProperty(IOEProjectProperties.P_WORKDIR, propertiesFile.getClientfolderproalpha());
143  oePropertyStore.setProperty(IOEProjectProperties.P_TEMPDIR, propertiesFile.getTempDir());
144  oePropertyStore.setProperty(IOEProjectProperties.P_STARTUP, propertiesFile.getStartParameter());
145  oePropertyStore.setProperty(IOEProjectProperties.P_USEWORKSPACE_AVM, "true");
146  oePropertyStore.setProperty(IOEProjectProperties.P_RCODEPATH, propertiesFile.getObjDir());
147 
148  if ((propertiesFile.getAssembliesDir() != null) && (new File(propertiesFile.getAssembliesDir()).exists())) {
149  oePropertyStore.setProperty(IOEProjectProperties.P_USE_DEFAULT_ASSEMBLIES_DIRECTORY, "false");
150  oePropertyStore.setProperty(IOEProjectProperties.P_ASSEMBLIES_DIRECTORY, propertiesFile.getAssembliesDir());
151  }
152 
153  ProjectPropathWizardPage wizardPage = (ProjectPropathWizardPage) commonDataModel
154  .getProperty(IOECommonDataModelProperties.PROPATH_PAGE);
155  if (wizardPage != null) {
156  wizardPage.setUserModifiedPropaths(true);
157  }
158 
159  IProject createdProject = fproj.getProject();
160  List<PropathEntry> propahtList = loadPropath(Platform.getLocation().append(createdProject.getName()));
161  commonDataModel.setProperty(IOECommonDataModelProperties.PROPATH_ENTRIES, propahtList);
162  commonDataModel.setBooleanProperty(IOECommonDataModelProperties.UPDATE_PROPATH, true);
163 
164  fproj.installProjectFacet(openedgeFacet.getVersion("11"), openEdgeDataModel, null);
165  IFacetedProjectWorkingCopy fprowk = fproj.createWorkingCopy();
166  fprowk.setSelectedPreset(IOpenEdgeFacetConstants.OPENEDGE_PROJECT_PRESET_ID);
167 
168  return fproj.getProject();
169 
170  }
171 
172  public void installPaProject(IProgressMonitor monitor) throws CoreException, IOException {
173 
174  List<IProject> projects = Arrays.asList(ResourcesPlugin.getWorkspace().getRoot().getProjects());
175 
176  for (IProject p : projects) {
177 
178  if (p.getName().equals(propertiesFile.getFullProjectName())) {
179  return;
180  }
181  }
182 
183  cleanupProjectFiles();
184  monitor.worked(1);
185 
186  IProject oeProject = createProject(monitor);
187  monitor.worked(1);
188 
189  addPaNature(oeProject);
190  monitor.worked(1);
191  configurePaProject(oeProject);
192  monitor.worked(1);
193 
194  configureMylyn(propertiesFile.getJiraUrl(), "proAlpha", propertiesFile.getJiraProject(),
195  "All issues assigned to me");
196  monitor.worked(1);
197 
198  // Cancel OE-tooling until someone can justify this absurdly long source-scan
199  // If we don't cancel this and close the project an error gets thrown to the ui
200  Job[] jobs = Job.getJobManager().find((Object) "codemodeljobs");
201 
202  for (Job job : jobs) {
203  job.cancel();
204  try {
205  Thread.sleep(1000);
206  } catch (InterruptedException e) {
207  logger.error(e.getMessage());
208  Thread.currentThread().interrupt();
209  }
210  }
211 
212  oeProject.close(monitor);
213  }
214 
215  @SuppressWarnings("restriction")
216  public void configureMylyn(String jiraRepositoryUrl, String category, String repositoryLabel,
217  String repositorySummary) {
218 
219  TaskRepository repository = new TaskRepository(JiraCorePlugin.CONNECTOR_KIND, jiraRepositoryUrl);
220  repository.setCategory(category);
221  repository.setRepositoryLabel(repositoryLabel);
222 
223  // Though we know the userName, we should not pre-insert it! Otherwise, the
224  // plugin tries to
225  // authenticate with that user and failed logins will increase, and increase,...
226  // and increase
227  // until the user is blocked. So better leave the username empty!
228  if (TasksUi.getRepositoryManager().getRepository(JiraCorePlugin.CONNECTOR_KIND, jiraRepositoryUrl) == null) {
229  logger.debug("Repository {} hinzugefügt", repository.getRepositoryUrl());
230  TasksUi.getRepositoryManager().addRepository(repository);
231  }
232 
233  RepositoryQuery repQuery = (RepositoryQuery) TasksUi.getRepositoryModel().createRepositoryQuery(repository);
234  repQuery.setSummary(repositorySummary);
235  repQuery.setUrl(propertiesFile.getJiraUrl());
236  repQuery.setAttribute("FilterJql",
237  "issuetype in (standardIssueTypes(), subTaskIssueTypes()) "
238  + "AND resolution in (Unresolved, Duplicate, \"Cannot Reproduce\") "
239  + "AND assignee in (currentUser()) ORDER BY assignee ASC, priority DESC, updated DESC");
240  repQuery.setAttribute("FilterID", "10605");
241 
242  Set<RepositoryQuery> repositoryQueries = TasksUiPlugin.getTaskList()
243  .getRepositoryQueries(repository.getRepositoryUrl());
244  Predicate<RepositoryQuery> repositoryUrl = (
245  RepositoryQuery p) -> p.getRepositoryUrl() == repository.getRepositoryUrl();
246  Predicate<RepositoryQuery> summeryPredicate = (RepositoryQuery p) -> p.getSummary().equals(repositorySummary);
247 
248  if (repositoryQueries.stream().filter(summeryPredicate.and(repositoryUrl)).findAny().orElse(null) == null) {
249  logger.debug("Query: {}", repQuery.getAttribute("FilterJql"));
250  TasksUiPlugin.getTaskList().addQuery(repQuery);
251  }
252  }
253 
254  private void configurePaProject(IProject iProject) throws IOException {
255 
256  DatabaseConnectionBuilder databaseConnectionBuilder;
257  databaseConnectionBuilder = new DatabaseConnectionBuilder(propertiesFile.getFullProjectName(),
258  propertiesFile.getDbConnectionProperties(), propertiesFile.getClientfolderdb(),
259  propertiesFile.getDlc());
260  databaseConnectionBuilder.createDbConnections(iProject);
261 
262  addLinkedFolder(iProject);
263 
264  ProgressUtils utils = new ProgressUtils(supportPlatform);
265 
266  new PdsLaunchConfigurator(propertiesFile.getFullProjectName(), utils.getOpenEdgeVersionWithMinor(),
267  "pastartg.p", propertiesFile.getClientfolderproalpha(), propertiesFile.getClientfolderproalpha(),
268  propertiesFile.getStartParameter()).createNewLaunchConfiguration();
269 
270  OEProject oeProject = (OEProject) OEProjectPlugin.getDefault().getOpenEdgeModel().getOpenEdgeProject(iProject);
271  try {
272  IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
273  root.setPersistentProperty(new QualifiedName(oeProject.getName(),"ConsistencyChecksLocationLocal"), propertiesFile.getConsistencyChecksLocationLocal());
274  root.setPersistentProperty(new QualifiedName(oeProject.getName(),"ConsistencyChecksLocationServer"), propertiesFile.getConsistencyChecksLocationServer());
275  } catch (CoreException e1) {
276  // TODO Auto-generated catch block
277  e1.printStackTrace();
278  }
279 
280  final PaProject paProject = new PaProject((OEProject) oeProject);
281  paProject.savePaPref("Version", propertiesFile.getVersion());
282  paProject.dispose();
283 
284  }
285 
293  private List<PropathEntry> loadPropath(IPath projectPath) {
294  List<PropathEntry> propathList = new ArrayList<>();
295 
296  try (BufferedReader br = new BufferedReader(new FileReader(new File(propertiesFile.getPropathTemplate())));) {
297 
298  String line = null;
299  while ((line = br.readLine()) != null) {
300  propathList.add(
301  getPropathEntry(PropathConstants.SOURCE_DIRECTORY, PropathConstants.ALL_ENVIRONMENTS, line));
302  }
303  } catch (IOException e) {
304  logger.error(e.getMessage());
305  }
306 
307  // Add default PROPATH entries
308  ProjectPropath propathHandler = new ProjectPropath(projectPath);
309 
310  for (PropathEntry entry : propathHandler.getPropathEntries()) {
311  if (entry.getPath().equals(PropathConstants.WORKING_DIRECTORY_VARIABLE)) {
312  PropathEntry newEntry = getPropathEntry(PropathConstants.SOURCE_DIRECTORY,
313  PropathConstants.ALL_ENVIRONMENTS, entry.getPath());
314  propathList.add(newEntry);
315  } else {
316  propathList.add(entry);
317  }
318  }
319 
320  return propathList;
321  }
322 
323  private PropathEntry getPropathEntry(String kind, String env, String path) {
324  PropathEntry propathEntry = new PropathEntry(kind);
325  propathEntry.setEnvironment(new PropathEnvironmentEntry(env));
326  propathEntry.setPath(path);
327 
328  return propathEntry;
329 
330  }
331 
337  private void addLinkedFolder(IProject project) {
338  List<String> folderList = new ArrayList<>();
339  if ((propertiesFile.getLinkedFolderList() != null) && (!propertiesFile.getLinkedFolderList().isEmpty())) {
340  folderList = Arrays.asList(propertiesFile.getLinkedFolderList().split(","));
341  }
342 
343  if (!folderList.isEmpty()) {
344  for (String folder : folderList) {
345  createLinkedFolder(project, new Path(folder).lastSegment(), new Path(folder));
346  }
347  }
348  }
349 
357  private void createLinkedFolder(IProject project, String newFolder, final IPath linkedFolder) {
358  try {
359  IWorkspace workspace = ResourcesPlugin.getWorkspace();
360  IFolder link = project.getFolder(newFolder);
361 
362  if (workspace.validateLinkLocation(link, linkedFolder).matches(IStatus.ERROR)) {
363  throw new Exception(workspace.validateLinkLocation(link, linkedFolder).getException());
364  } else {
365  link.createLink(linkedFolder, IResource.NONE, null);
366  }
367  } catch (Exception e) {
368  logger.error("Could not create linked folder", e);
369  }
370  }
371 
376  private void cleanupProjectFiles() {
377  for (String str : ".project,.propath,.dbconnection,.settings".split(",")) {
378  File misc = new File(new Path(propertiesFile.getClientfolderproalpha()).append(str).toString());
379  if (misc.exists()) {
380  FileUtils.deleteQuietly(misc);
381  }
382  }
383  }
384 
391  private void addPaNature(IProject oeProject) throws CoreException {
392  IProjectDescription description = oeProject.getDescription();
393  String[] natures = description.getNatureIds();
394  String[] projectNatures = new String[natures.length + 1];
395  projectNatures[0] = PANature.NATURE_ID;
396  System.arraycopy(natures, 0, projectNatures, 1, natures.length);
397 
398  // validate the natures
399  IWorkspace workspace = ResourcesPlugin.getWorkspace();
400  IStatus status = workspace.validateNatureSet(projectNatures);
401 
402  // only apply pa nature, if the status is OK
403  if (status.getCode() == IStatus.OK) {
404  description.setNatureIds(projectNatures);
405  oeProject.setDescription(description, null);
406  }
407  }
408 }