/******************************************************************************* * Copyright (c) 2012 - 2017 GoPivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * GoPivotal, Inc. - initial API and implementation * DISID Corporation, S.L - Spring Roo maintainer *******************************************************************************/ package org.springframework.ide.eclipse.roo.ui.internal.wizard; import java.io.File; import java.io.FileWriter; import java.lang.reflect.InvocationTargetException; import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.internal.ui.wizards.NewElementWizard; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.INewWizard; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.WorkspaceModifyOperation; import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard; import org.springframework.ide.eclipse.core.SpringCore; import org.springframework.ide.eclipse.roo.core.RooCoreActivator; import org.springframework.ide.eclipse.roo.core.model.IRooInstall; import org.springframework.ide.eclipse.roo.ui.RooUiActivator; import org.springframework.ide.eclipse.roo.ui.internal.RooUiUtil; import org.springframework.ide.eclipse.roo.ui.internal.StyledTextAppender; import org.springframework.ide.eclipse.roo.ui.internal.actions.OpenShellJob; import org.springframework.roo.shell.eclipse.Bootstrap; import org.springframework.roo.shell.eclipse.ProjectRefresher; import org.springsource.ide.eclipse.commons.core.SpringCorePreferences; import org.springsource.ide.eclipse.commons.core.SpringCoreUtils; /** * @author Christian Dupuis * @author Leo Dos Santos * @author Juan Carlos GarcĂ­a * @since 2.2.0 */ @SuppressWarnings("restriction") public class NewRooProjectWizard extends NewElementWizard implements INewWizard { private static final Map<String, String> ROO_JAVA_VERSION_MAPPING; private static final Map<String, String> FACET_JAVA_VERSION_MAPPING; static { ROO_JAVA_VERSION_MAPPING = new HashMap<String, String>(); ROO_JAVA_VERSION_MAPPING.put("1.5", "5"); ROO_JAVA_VERSION_MAPPING.put("1.6", "6"); ROO_JAVA_VERSION_MAPPING.put("1.7", "7"); ROO_JAVA_VERSION_MAPPING.put("1.8", "8"); FACET_JAVA_VERSION_MAPPING = new HashMap<String, String>(); FACET_JAVA_VERSION_MAPPING.put("1.5", "5.0"); FACET_JAVA_VERSION_MAPPING.put("1.6", "6.0"); FACET_JAVA_VERSION_MAPPING.put("1.7", "7.0"); FACET_JAVA_VERSION_MAPPING.put("1.8", "8.0"); } private static final String CLASSPATH_FILE = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<classpath>\n" + " <classpathentry kind=\"src\" output=\"target/classes\" path=\"src/main/java\"/>\n" + " <classpathentry excluding=\"**\" kind=\"src\" output=\"target/classes\" path=\"src/main/resources\"/>\n" + " <classpathentry kind=\"src\" output=\"target/test-classes\" path=\"src/test/java\"/>\n" + " <classpathentry kind=\"con\" path=\"org.eclipse.jdt.launching.JRE_CONTAINER\"/>\n" + " <classpathentry kind=\"output\" path=\"target/classes\"/>\n" + "</classpath>\n" + ""; private NewRooProjectWizardPageOne projectPage; private NewRooProjectWizardPageTwo shellPage; public NewRooProjectWizard() { super(); setWindowTitle("New Roo Project"); setDefaultPageImageDescriptor(RooUiActivator.getImageDescriptor("icons/full/wizban/roo_wizban.png")); setNeedsProgressMonitor(true); } @Override protected void finishPage(IProgressMonitor monitor) throws InterruptedException, CoreException { } @Override public boolean performFinish() { URI tempLocation = projectPage.getProjectLocationURI(); if (tempLocation == null) { tempLocation = ResourcesPlugin.getWorkspace().getRoot().getLocationURI(); } if (tempLocation == null) { tempLocation = ResourcesPlugin.getWorkspace().getRoot().getRawLocationURI(); } final URI location = tempLocation; final String rooInstall = projectPage.getRooInstallName(); final boolean useDefault = projectPage.useDefaultRooInstall(); final DependencyManagement dependencyManagement = projectPage.getDependencyManagement(); final String packagingProvider = projectPage.getPackagingProvider(); WorkspaceModifyOperation operation = new WorkspaceModifyOperation() { @Override protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException { monitor.beginTask("Creating Roo project: ", 6); monitor.subTask("loading Spring Roo"); IRooInstall install = (useDefault ? RooCoreActivator.getDefault().getInstallManager() .getDefaultRooInstall() : RooCoreActivator.getDefault().getInstallManager().getRooInstall( rooInstall)); monitor.worked(1); Bootstrap bootstrap = null; try { // Create project location monitor.subTask("creating project location"); File projectFile = new File(new File(location), projectPage.getProjectName()); if (!projectFile.exists()) { projectFile.mkdirs(); } monitor.worked(2); monitor.subTask("starting Spring Roo shell"); String javaVersion = JavaCore.getOption("org.eclipse.jdt.core.compiler.compliance"); String rooJavaVersion = (ROO_JAVA_VERSION_MAPPING.containsKey(javaVersion) ? ROO_JAVA_VERSION_MAPPING .get(javaVersion) : "8"); // Create Roo project by launching Roo and invoking the // create project command String projectLocation = projectFile.getCanonicalPath(); bootstrap = new Bootstrap(null, projectLocation, install.getHome(), install.getVersion(), new ProjectRefresher(null)); // Init Roo shell bootstrap.start(new StyledTextAppender(shellPage.getRooShell()), projectPage.getProjectName()); monitor.worked(3); ProjectType type = projectPage.getProjectType(); // Command used to create new project String createCommand = type.getCommand(); // If maven project will be generated using Spring Roo 2.0+, is necessary to add // setup instruction on command if(createCommand.equals("project") && !install.getVersion().startsWith("1")){ createCommand = createCommand.concat(" setup"); } // Create project monitor.subTask(String.format("execute Spring Roo '%s' command", type.getCommand())); StringBuilder builder = new StringBuilder(); builder.append(createCommand); builder.append(" --topLevelPackage ").append(projectPage.getPackageName()); if (type == ProjectType.PROJECT) { builder.append(" --projectName ").append("\"").append(projectPage.getProjectName()).append("\""); builder.append(" --java ").append(rooJavaVersion); if (RooUiUtil.isRoo120OrGreater(install)) { builder.append(" --packaging ").append(packagingProvider); } } else if(type == ProjectType.MULTIMODULE_STANDARD){ builder.append(" --projectName ").append("\"").append(projectPage.getProjectName()).append("\""); builder.append(" --java ").append(rooJavaVersion); builder.append(" --multimodule STANDARD"); } else if(type == ProjectType.MULTIMODULE_BASIC){ builder.append(" --projectName ").append("\"").append(projectPage.getProjectName()).append("\""); builder.append(" --java ").append(rooJavaVersion); builder.append(" --multimodule BASIC"); } else if(type == ProjectType.ADDON_SUITE){ builder.append(" --projectName ").append("\"").append(projectPage.getProjectName()).append("\""); builder.append(" --description \"").append(projectPage.getDescription()).append("\""); }else{ builder.append(" --description \"").append(projectPage.getDescription()).append("\""); } final String commandString = builder.toString(); Display.getDefault().asyncExec(new Runnable() { public void run() { shellPage.getRooShell().append(commandString + StyledTextAppender.NL); } }); bootstrap.execute(commandString); // Shutdown Roo bootstrap.shutdown(); bootstrap = null; monitor.worked(4); // Write our own .classpath file if M2E can't provide one for us if (!DependencyManagementUtils.IS_M2ECLIPSE_PRESENT) { monitor.subTask("configuring Eclipse project meta data"); // Setup Eclipse metadata File classpathDescriptor = new File(projectFile, ".classpath"); FileWriter writer = new FileWriter(classpathDescriptor); if (type == ProjectType.PROJECT) { // For now, only Java projects & web projects if (!RooUiUtil.isRoo120OrGreater(install) || "jar".equalsIgnoreCase(packagingProvider) || "war".equalsIgnoreCase(packagingProvider)) { writer.write(CLASSPATH_FILE); } } else { // Add-on projects writer.write(CLASSPATH_FILE); } writer.flush(); writer.close(); } monitor.subTask("importing project into workspace"); IWorkspace workspace = ResourcesPlugin.getWorkspace(); IProject project = workspace.getRoot().getProject(projectPage.getProjectName()); IProjectDescription desc = workspace.newProjectDescription(projectPage.getProjectName()); if (projectPage.isExternalProject()) { desc.setLocation(new Path(projectLocation)); } project.create(desc, new NullProgressMonitor()); project.open(0, new NullProgressMonitor()); project.setDescription(desc, new NullProgressMonitor()); // ROO-3726: Also check MULTIMODULE projects if (type == ProjectType.PROJECT || type == ProjectType.MULTIMODULE_STANDARD || type == ProjectType.MULTIMODULE_BASIC) { if (!RooUiUtil.isRoo120OrGreater(install) || "jar".equalsIgnoreCase(packagingProvider) || "war".equalsIgnoreCase(packagingProvider)) { // For now, only Java projects & web projects SpringCoreUtils.addProjectBuilder(project, "org.eclipse.ajdt.core.ajbuilder", new NullProgressMonitor()); SpringCoreUtils.addProjectBuilder(project, SpringCore.BUILDER_ID, new NullProgressMonitor()); SpringCoreUtils.addProjectNature(project, JavaCore.NATURE_ID, new NullProgressMonitor()); SpringCoreUtils.addProjectNature(project, "org.eclipse.ajdt.ui.ajnature", new NullProgressMonitor()); } SpringCoreUtils.addProjectNature(project, SpringCore.NATURE_ID, new NullProgressMonitor()); SpringCoreUtils.addProjectNature(project, RooCoreActivator.NATURE_ID, new NullProgressMonitor()); } else { // Add-ons SpringCoreUtils.addProjectBuilder(project, JavaCore.BUILDER_ID, new NullProgressMonitor()); SpringCoreUtils.addProjectNature(project, JavaCore.NATURE_ID, new NullProgressMonitor()); SpringCoreUtils.addProjectBuilder(project, SpringCore.BUILDER_ID, new NullProgressMonitor()); SpringCoreUtils.addProjectNature(project, SpringCore.NATURE_ID, new NullProgressMonitor()); } SpringCorePreferences.getProjectPreferences(project, RooCoreActivator.PLUGIN_ID).putBoolean( RooCoreActivator.PROJECT_PROPERTY_ID, useDefault); SpringCorePreferences.getProjectPreferences(project, RooCoreActivator.PLUGIN_ID).putString( RooCoreActivator.ROO_INSTALL_PROPERTY, rooInstall); configureProjectUi(project); if (DependencyManagementUtils.IS_M2ECLIPSE_PRESENT) { DependencyManagementUtils.installDependencyManagement(project, dependencyManagement); } // ROO-3726: If project type is MULTIMODULE_BASIC or MULTIMODULE_STANDARD, also import modules List<IProject> modules = new ArrayList<IProject>(); if(type == ProjectType.MULTIMODULE_BASIC){ // Import application module project IProject applicationModuleProject = workspace.getRoot().getProject(project.getName().concat(".").concat("application")); IProjectDescription applicationModuleDescription = workspace.newProjectDescription(project.getName().concat(".").concat("application")); applicationModuleDescription.setLocation(new Path(projectLocation + "/application")); applicationModuleProject.create(applicationModuleDescription, new NullProgressMonitor()); applicationModuleProject.open(0, new NullProgressMonitor()); applicationModuleProject.setDescription(applicationModuleDescription, new NullProgressMonitor()); modules.add(applicationModuleProject); }else if(type == ProjectType.MULTIMODULE_STANDARD){ // Import model module project IProject modelModuleProject = workspace.getRoot().getProject(project.getName().concat(".").concat("model")); IProjectDescription modelModuleDescription = workspace.newProjectDescription(project.getName().concat(".").concat("model")); modelModuleDescription.setLocation(new Path(projectLocation + "/model")); modelModuleProject.create(modelModuleDescription, new NullProgressMonitor()); modelModuleProject.open(0, new NullProgressMonitor()); modelModuleProject.setDescription(modelModuleDescription, new NullProgressMonitor()); modules.add(modelModuleProject); // Import repository module project IProject repositoryModuleProject = workspace.getRoot().getProject(project.getName().concat(".").concat("repository")); IProjectDescription repositoryModuleDescription = workspace.newProjectDescription(project.getName().concat(".").concat("repository")); repositoryModuleDescription.setLocation(new Path(projectLocation + "/repository")); repositoryModuleProject.create(repositoryModuleDescription, new NullProgressMonitor()); repositoryModuleProject.open(0, new NullProgressMonitor()); repositoryModuleProject.setDescription(repositoryModuleDescription, new NullProgressMonitor()); modules.add(repositoryModuleProject); // Import service-api module project IProject serviceApiModuleProject = workspace.getRoot().getProject(project.getName().concat(".").concat("service-api")); IProjectDescription serviceApiModuleDescription = workspace.newProjectDescription(project.getName().concat(".").concat("service-api")); serviceApiModuleDescription.setLocation(new Path(projectLocation + "/service-api")); serviceApiModuleProject.create(serviceApiModuleDescription, new NullProgressMonitor()); serviceApiModuleProject.open(0, new NullProgressMonitor()); serviceApiModuleProject.setDescription(serviceApiModuleDescription, new NullProgressMonitor()); modules.add(serviceApiModuleProject); // Import service-impl module project IProject serviceImplModuleProject = workspace.getRoot().getProject(project.getName().concat(".").concat("service-impl")); IProjectDescription serviceApiImplDescription = workspace.newProjectDescription(project.getName().concat(".").concat("service-impl")); serviceApiImplDescription.setLocation(new Path(projectLocation + "/service-impl")); serviceImplModuleProject.create(serviceApiImplDescription, new NullProgressMonitor()); serviceImplModuleProject.open(0, new NullProgressMonitor()); serviceImplModuleProject.setDescription(serviceApiImplDescription, new NullProgressMonitor()); modules.add(serviceImplModuleProject); // Import integration module project IProject integrationModuleProject = workspace.getRoot().getProject(project.getName().concat(".").concat("integration")); IProjectDescription integrationModuleDescription = workspace.newProjectDescription(project.getName().concat(".").concat("integration")); integrationModuleDescription.setLocation(new Path(projectLocation + "/integration")); integrationModuleProject.create(integrationModuleDescription, new NullProgressMonitor()); integrationModuleProject.open(0, new NullProgressMonitor()); integrationModuleProject.setDescription(integrationModuleDescription, new NullProgressMonitor()); modules.add(integrationModuleProject); // Import application module project IProject applicationModuleProject = workspace.getRoot().getProject(project.getName().concat(".").concat("application")); IProjectDescription applicationModuleDescription = workspace.newProjectDescription(project.getName().concat(".").concat("application")); applicationModuleDescription.setLocation(new Path(projectLocation + "/application")); applicationModuleProject.create(applicationModuleDescription, new NullProgressMonitor()); applicationModuleProject.open(0, new NullProgressMonitor()); applicationModuleProject.setDescription(applicationModuleDescription, new NullProgressMonitor()); modules.add(applicationModuleProject); } // ROO-3726: If some modules have been imported, configure them. for(IProject module : modules){ SpringCoreUtils.addProjectNature(module, SpringCore.NATURE_ID, new NullProgressMonitor()); configureProjectUi(module); if (DependencyManagementUtils.IS_M2ECLIPSE_PRESENT) { DependencyManagementUtils.installDependencyManagement(module, dependencyManagement); } } new OpenShellJob(project).schedule(); monitor.worked(6); monitor.done(); } catch (Throwable e) { SpringCore.log(e); } finally { if (bootstrap != null) { // Shutdown Roo try { bootstrap.shutdown(); } catch (Throwable e) { } } } } }; try { getContainer().run(true, true, operation); } catch (InvocationTargetException e) { SpringCore.log(e); } catch (InterruptedException e) { SpringCore.log(e); } return true; } @Override public IJavaElement getCreatedElement() { return null; } @Override public void addPages() { projectPage = new NewRooProjectWizardPageOne(); addPage(projectPage); shellPage = new NewRooProjectWizardPageTwo(); addPage(shellPage); } private void configureProjectUi(final IProject project) { Display.getDefault().asyncExec(new Runnable() { public void run() { if (projectPage.getWorkingSets().length > 0) { PlatformUI.getWorkbench().getWorkingSetManager().addToWorkingSets(project, projectPage.getWorkingSets()); } BasicNewResourceWizard.selectAndReveal(project, PlatformUI.getWorkbench().getActiveWorkbenchWindow()); } }); } public enum ProjectType { PROJECT, MULTIMODULE_STANDARD, MULTIMODULE_BASIC, ADDON_SIMPLE, ADDON_ADVANCED, ADDON_SUITE; public String getCommand() { if (this == PROJECT || this == MULTIMODULE_STANDARD || this == MULTIMODULE_BASIC) { return "project"; } else if (this == ADDON_SIMPLE) { return "addon create simple"; } else if (this == ADDON_ADVANCED) { return "addon create advanced"; }else if (this == ADDON_SUITE){ return "addon create suite"; } return ""; } public String getDisplayString() { if (this == PROJECT) { return "Standard"; } else if (this == MULTIMODULE_STANDARD) { return "Multimodule Standard"; } else if (this == MULTIMODULE_BASIC) { return "Multimodule Basic"; } else if (this == ADDON_SIMPLE) { return "Add-on simple"; } else if (this == ADDON_ADVANCED) { return "Add-on advanced"; }else if (this == ADDON_SUITE){ return "Roo Add-on Suite"; } return null; } public static ProjectType fromDisplayString(String display) { if (display.equals("Standard")) { return PROJECT; } else if (display.equals("Multimodule Standard")) { return MULTIMODULE_STANDARD; } else if (display.equals("Multimodule Basic")) { return MULTIMODULE_BASIC; } else if (display.equals("Add-on simple")) { return ADDON_SIMPLE; } else if (display.equals("Add-on advanced")) { return ADDON_ADVANCED; }else if (display.equals("Roo Add-on Suite")){ return ADDON_SUITE; } return null; } } }