changeset 130:df34d0465d83

Only prompt once in new project wizard The second prompt the user is presented with is from M2E. Try and work around it by using internal API directly to force a refresh without a prompt. Fall back to showing a prompt (using the standard command interface) if the API has changed.
author Omair Majid <omajid@redhat.com>
date Thu, 29 May 2014 16:49:15 -0400
parents 277471cea9af
children b40698bda910
files com.redhat.thermostat.tools.eclipse.plugin/src/com/redhat/thermostat/tools/eclipse/plugin/wizards/ProjectCreator.java
diffstat 1 files changed, 93 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/com.redhat.thermostat.tools.eclipse.plugin/src/com/redhat/thermostat/tools/eclipse/plugin/wizards/ProjectCreator.java	Thu May 29 13:58:41 2014 -0400
+++ b/com.redhat.thermostat.tools.eclipse.plugin/src/com/redhat/thermostat/tools/eclipse/plugin/wizards/ProjectCreator.java	Thu May 29 16:49:15 2014 -0400
@@ -3,8 +3,12 @@
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
 import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
 
@@ -130,21 +134,32 @@
     }
 
     public void create() throws CoreException, IOException {
-        createParentModuleProject();
+        List<Project> projects = new ArrayList<>();
+        Project project;
 
-        createCommonSubproject();
+        project = createParentModuleProject();
+        projects.add(project);
+
+        project = createCommonSubproject();
+        projects.add(project);
 
-        createJavaSubproject("agent");
-        createJavaSubproject("client");
-        createJavaSubproject("cli");
+        project = createJavaSubproject("agent");
+        projects.add(project);
+
+        project = createJavaSubproject("client");
+        projects.add(project);
 
-        createDistributionProject();
+        project = createJavaSubproject("cli");
+        projects.add(project);
 
-        refreshProjects();
+        project = createDistributionProject();
+        projects.add(project);
+
+        refreshProjects(projects);
     }
 
-    private void createParentModuleProject() throws CoreException, IOException {
-        Projects projects = createJavaProject(parentId);
+    private Project createParentModuleProject() throws CoreException, IOException {
+        Project project = createJavaProject(parentId);
 
         String pomContents = ""
                 + POM_HEADER
@@ -176,14 +191,16 @@
                 + "  </dependencyManagement>\n"
                 + POM_FOOTER;
 
-        createPomFile(projects, pomContents);
+        createPomFile(project, pomContents);
+
+        return project;
     }
 
-    private void createCommonSubproject() throws IOException, CoreException {
+    private Project createCommonSubproject() throws IOException, CoreException {
         String suffix = "common";
         String artifactId = this.artifactId + "-" + suffix;
         String packageName = packagePrefix + "." + suffix;
-        Projects projects = createJavaCodeProject(artifactId, packageName);
+        Project project = createJavaCodeProject(artifactId, packageName);
 
         String pomContents = ""
                 + POM_HEADER
@@ -204,15 +221,16 @@
                 + "  </dependencies>\n"
                 + POM_FOOTER;
 
-        createPomFile(projects, pomContents);
+        createPomFile(project, pomContents);
 
+        return project;
     }
 
-    private void createJavaSubproject(String subproject) throws CoreException, IOException {
+    private Project createJavaSubproject(String subproject) throws CoreException, IOException {
         String artifactId = this.artifactId + "-" + subproject;
         String subpackage = this.packagePrefix + "." + subproject;
 
-        Projects projects = createJavaCodeProject(artifactId, subpackage);
+        Project project = createJavaCodeProject(artifactId, subpackage);
 
         String pomContents = ""
                 + POM_HEADER
@@ -237,11 +255,13 @@
                 + "  </dependencies>\n"
                 + POM_FOOTER;
 
-        createPomFile(projects, pomContents);
+        createPomFile(project, pomContents);
+
+        return project;
     }
 
-    private Projects createJavaCodeProject(String projectName, String packageName) throws CoreException {
-        Projects projects = createJavaProject(projectName);
+    private Project createJavaCodeProject(String projectName, String packageName) throws CoreException {
+        Project projects = createJavaProject(projectName);
 
         IProject project = projects.project;
 
@@ -265,7 +285,7 @@
         return projects;
     }
 
-    private void createBundleActivator(Projects projects, IFolder root, String packageName) throws CoreException {
+    private void createBundleActivator(Project projects, IFolder root, String packageName) throws CoreException {
         IJavaProject javaProject = projects.javaProject;
 
         IPackageFragment pack = javaProject.getPackageFragmentRoot(root)
@@ -275,10 +295,10 @@
         pack.createCompilationUnit(BUNDLE_ACTIVATOR_NAME + ".java", bundleActivatorContents, false, null);
     }
 
-    private void createDistributionProject() throws CoreException, IOException {
+    private Project createDistributionProject() throws CoreException, IOException {
         String artifactId = this.artifactId + "-distribution";
 
-        Projects projects = createJavaProject(artifactId);
+        Project projects = createJavaProject(artifactId);
 
         String pomContents = ""
                 + POM_HEADER
@@ -360,10 +380,9 @@
         IFolder srcMainResourcesFolder = srcMainFolder.getFolder("resources");
         srcMainResourcesFolder.create(true, true, null);
 
-        // FIXME enable this
-        // createAssemblyDescriptor();
         createThermostatPluginXml(project.getName());
 
+        return projects;
     }
 
     private void createThermostatPluginXml(String projectName) throws CoreException, IOException {
@@ -376,7 +395,7 @@
         });
     }
 
-    private Projects createJavaProject(String projectName) throws CoreException {
+    private Project createJavaProject(String projectName) throws CoreException {
         IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
         IProject project = root.getProject(projectName);
         if (project.exists()) {
@@ -394,7 +413,7 @@
         // Create Java project
         IJavaProject javaProject = JavaCore.create(project);
 
-        return new Projects(project, javaProject);
+        return new Project(project, javaProject);
     }
 
     private void addJavaAndMavenNature(IProject project) throws CoreException {
@@ -414,7 +433,7 @@
         description.setNatureIds(newNatureIds);
     }
 
-    private void createPomFile(Projects projects, String contents) throws IOException, CoreException {
+    private void createPomFile(Project projects, String contents) throws IOException, CoreException {
         IProject project = projects.project;
         IFile pomFile = project.getFile(POM_FILE_NAME);
         try (InputStream contentStream = new ByteArrayInputStream(contents.getBytes(StandardCharsets.UTF_8))) {
@@ -436,29 +455,67 @@
             + "  </parent>\n";
     }
 
-    private void refreshProjects() throws CoreException {
+    private void refreshProjects(List<Project> projects) throws CoreException {
         // Refresh projects
         ResourcesPlugin.getWorkspace().getRoot().refreshLocal(IWorkspaceRoot.DEPTH_INFINITE, new NullProgressMonitor());
 
         // Refresh again, just to make sure changes are sane by the time maven sees them
         ResourcesPlugin.getWorkspace().getRoot().refreshLocal(IWorkspaceRoot.DEPTH_INFINITE, new NullProgressMonitor());
 
-        // Refresh maven things
+        // TODO wait for refresh to complete
+
+        tellM2eAboutNewProjects(projects);
+    }
+
+    private void tellM2eAboutNewProjects(List<Project> projects) throws CoreException {
         try {
-            // provided by m2e
-            final String UPADATE_MAVEN_PROJECT_COMMAND = "org.eclipse.m2e.core.ui.command.updateProject";
-            serviceHandler.executeCommand(UPADATE_MAVEN_PROJECT_COMMAND, null);
-        } catch (ExecutionException | NotDefinedException | NotEnabledException | NotHandledException e) {
-            Status s = new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Error refreshing maven configuration", e);
-            throw new CoreException(s);
+            refreshMavenProjectUsingInternalApi(projects);
+        } catch (UnsupportedOperationException e) {
+            try {
+                refreshMavenProjectUsingUglyButPublicCommandFallback();
+            } catch (UnsupportedOperationException e2) {
+                Status s = new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Error refreshing maven configuration", e2);
+                throw new CoreException(s);
+            }
         }
     }
 
-    private static class Projects {
+    private void refreshMavenProjectUsingInternalApi(List<Project> projects) throws UnsupportedOperationException {
+        List<IProject> actualProjects = new ArrayList<>();
+        for (Project project : projects) {
+            actualProjects.add(project.project);
+        }
+        IProject[] projectsToUpdate = actualProjects.toArray(new IProject[0]);
+
+        try {
+            // UpdateMavenProjectJob updateProjectsJob = new UpdateMavenProjectJob(projectsToUpdate);
+            Class<?> klass = Class.forName("org.eclipse.m2e.core.ui.internal.UpdateMavenProjectJob");
+            Constructor<?> constructor = klass.getConstructor(IProject[].class);
+            Object updateProjectsJob = constructor.newInstance((Object)projectsToUpdate);
+
+            // updateProjectsJob.schedule();
+            Method schedule = klass.getMethod("schedule");
+            schedule.invoke(updateProjectsJob);
+        } catch (ReflectiveOperationException | SecurityException | IllegalArgumentException e) {
+            throw new UnsupportedOperationException("Incompatible m2e version", e);
+        }
+    }
+
+    /** This interrupts the UI by showing a completely un-needed prompt */
+    private void refreshMavenProjectUsingUglyButPublicCommandFallback() throws UnsupportedOperationException {
+        final String UPADATE_MAVEN_PROJECT_COMMAND = "org.eclipse.m2e.core.ui.command.updateProject";
+        try {
+            serviceHandler.executeCommand(UPADATE_MAVEN_PROJECT_COMMAND, null);
+        } catch (ExecutionException | NotDefinedException | NotEnabledException | NotHandledException e) {
+            throw new UnsupportedOperationException("Unable to refresh m2e using " + UPADATE_MAVEN_PROJECT_COMMAND);
+        }
+    }
+
+    private static class Project {
         private final IProject project;
         private final IJavaProject javaProject;
 
-        public Projects(IProject project, IJavaProject javaProject) {
+        public Project(IProject project, IJavaProject javaProject) {
             this.project = project;
             this.javaProject = javaProject;
         }