1 package com.proalpha.pds.projconf.configure;
3 import java.io.BufferedReader;
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;
13 import java.util.function.Predicate;
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;
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;
82 private PlatformSupport supportPlatform;
88 this.propertiesFile = propertiesFile;
89 this.supportPlatform = PlatformPlugin.getDefault().getPlatformSupport();
99 public IProject
createProject(IProgressMonitor monitor)
throws CoreException {
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);
109 IFacetedProject fproj = ProjectFacetsManager.create(propertiesFile.getFullProjectName(),
110 new Path(propertiesFile.getClientfolderproalpha()), monitor);
112 IActionDefinition actionDefinition = openedgeFacet.getVersion(
"11").getActionDefinition(
113 Collections.singleton(openedgeFacet.getVersion(
"11")), IFacetedProject.Action.Type.INSTALL);
115 IDataModel openEdgeDataModel = (IDataModel) actionDefinition.createConfigObject();
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);
132 IDataModel commonDataModel = DataModelFactory.createDataModel(
new OECommonDataModelProvider());
133 commonDataModel.setStringProperty(IOECommonDataModelProperties.PROJECT_LOCATION,
134 propertiesFile.getClientfolderproalpha());
137 commonDataModel.setProperty(IOEDataModelProperties.PROVERSION, proversion);
138 openEdgeDataModel.addNestedModel(IOEDataModelProperties.COMMON_MODEL, commonDataModel);
139 openEdgeDataModel.setProperty(IOEDataModelProperties.COMMON_MODEL, commonDataModel);
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());
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());
153 ProjectPropathWizardPage wizardPage = (ProjectPropathWizardPage) commonDataModel
154 .getProperty(IOECommonDataModelProperties.PROPATH_PAGE);
155 if (wizardPage !=
null) {
156 wizardPage.setUserModifiedPropaths(
true);
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);
164 fproj.installProjectFacet(openedgeFacet.getVersion(
"11"), openEdgeDataModel,
null);
165 IFacetedProjectWorkingCopy fprowk = fproj.createWorkingCopy();
166 fprowk.setSelectedPreset(IOpenEdgeFacetConstants.OPENEDGE_PROJECT_PRESET_ID);
168 return fproj.getProject();
172 public void installPaProject(IProgressMonitor monitor)
throws CoreException, IOException {
174 List<IProject> projects = Arrays.asList(ResourcesPlugin.getWorkspace().getRoot().getProjects());
176 for (IProject p : projects) {
178 if (p.getName().equals(propertiesFile.getFullProjectName())) {
183 cleanupProjectFiles();
189 addPaNature(oeProject);
191 configurePaProject(oeProject);
194 configureMylyn(propertiesFile.getJiraUrl(),
"proAlpha", propertiesFile.getJiraProject(),
195 "All issues assigned to me");
200 Job[] jobs = Job.getJobManager().find((Object)
"codemodeljobs");
202 for (Job job : jobs) {
206 }
catch (InterruptedException e) {
207 logger.error(e.getMessage());
208 Thread.currentThread().interrupt();
212 oeProject.close(monitor);
215 @SuppressWarnings(
"restriction")
216 public
void configureMylyn(String jiraRepositoryUrl, String category, String repositoryLabel,
217 String repositorySummary) {
219 TaskRepository repository =
new TaskRepository(JiraCorePlugin.CONNECTOR_KIND, jiraRepositoryUrl);
220 repository.setCategory(category);
221 repository.setRepositoryLabel(repositoryLabel);
228 if (TasksUi.getRepositoryManager().getRepository(JiraCorePlugin.CONNECTOR_KIND, jiraRepositoryUrl) ==
null) {
229 logger.debug(
"Repository {} hinzugefügt", repository.getRepositoryUrl());
230 TasksUi.getRepositoryManager().addRepository(repository);
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");
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);
248 if (repositoryQueries.stream().filter(summeryPredicate.and(repositoryUrl)).findAny().orElse(
null) ==
null) {
249 logger.debug(
"Query: {}", repQuery.getAttribute(
"FilterJql"));
250 TasksUiPlugin.getTaskList().addQuery(repQuery);
254 private void configurePaProject(IProject iProject)
throws IOException {
256 DatabaseConnectionBuilder databaseConnectionBuilder;
257 databaseConnectionBuilder =
new DatabaseConnectionBuilder(propertiesFile.getFullProjectName(),
258 propertiesFile.getDbConnectionProperties(), propertiesFile.getClientfolderdb(),
259 propertiesFile.getDlc());
260 databaseConnectionBuilder.createDbConnections(iProject);
262 addLinkedFolder(iProject);
264 ProgressUtils utils =
new ProgressUtils(supportPlatform);
266 new PdsLaunchConfigurator(propertiesFile.getFullProjectName(), utils.getOpenEdgeVersionWithMinor(),
267 "pastartg.p", propertiesFile.getClientfolderproalpha(), propertiesFile.getClientfolderproalpha(),
268 propertiesFile.getStartParameter()).createNewLaunchConfiguration();
270 OEProject oeProject = (OEProject) OEProjectPlugin.getDefault().getOpenEdgeModel().getOpenEdgeProject(iProject);
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) {
277 e1.printStackTrace();
280 final PaProject paProject =
new PaProject((OEProject) oeProject);
281 paProject.savePaPref(
"Version", propertiesFile.getVersion());
293 private List<PropathEntry> loadPropath(IPath projectPath) {
294 List<PropathEntry> propathList =
new ArrayList<>();
296 try (BufferedReader br =
new BufferedReader(
new FileReader(
new File(propertiesFile.getPropathTemplate())));) {
299 while ((line = br.readLine()) !=
null) {
301 getPropathEntry(PropathConstants.SOURCE_DIRECTORY, PropathConstants.ALL_ENVIRONMENTS, line));
303 }
catch (IOException e) {
304 logger.error(e.getMessage());
308 ProjectPropath propathHandler =
new ProjectPropath(projectPath);
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);
316 propathList.add(entry);
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);
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(
","));
343 if (!folderList.isEmpty()) {
344 for (String folder : folderList) {
345 createLinkedFolder(project,
new Path(folder).lastSegment(),
new Path(folder));
357 private void createLinkedFolder(IProject project, String newFolder,
final IPath linkedFolder) {
359 IWorkspace workspace = ResourcesPlugin.getWorkspace();
360 IFolder link = project.getFolder(newFolder);
362 if (workspace.validateLinkLocation(link, linkedFolder).matches(IStatus.ERROR)) {
363 throw new Exception(workspace.validateLinkLocation(link, linkedFolder).getException());
365 link.createLink(linkedFolder, IResource.NONE,
null);
367 }
catch (Exception e) {
368 logger.error(
"Could not create linked folder", e);
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());
380 FileUtils.deleteQuietly(misc);
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);
399 IWorkspace workspace = ResourcesPlugin.getWorkspace();
400 IStatus status = workspace.validateNatureSet(projectNatures);
403 if (status.getCode() == IStatus.OK) {
404 description.setNatureIds(projectNatures);
405 oeProject.setDescription(description,
null);
Proversion getProgressVersion()