package fr.inria.diverse.k3.ui.wizards; import java.io.File; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Locale; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.Wizard; import org.eclipse.pde.internal.ui.PDEPlugin; import org.eclipse.pde.internal.ui.elements.ElementList; import org.eclipse.pde.ui.IPluginContentWizard; import org.eclipse.swt.graphics.Image; import org.eclipse.ui.INewWizard; import org.eclipse.ui.IWorkbench; import fr.inria.diverse.commons.eclipse.pde.java.JavaNameHelper; import fr.inria.diverse.commons.eclipse.pde.manifest.ManifestChanger; import fr.inria.diverse.commons.eclipse.pde.wizards.pages.pde.AbstractNewProjectWizardWithTemplates; import fr.inria.diverse.commons.eclipse.pde.wizards.pages.pde.TemplateListSelectionPage; import fr.inria.diverse.commons.eclipse.pde.wizards.pages.pde.WizardElement; import fr.inria.diverse.commons.eclipse.pde.wizards.pages.pde.ui.BaseProjectWizardFields; import fr.inria.diverse.commons.eclipse.pde.wizards.pages.pde.ui.IProjectContentWizard; import fr.inria.diverse.commons.eclipse.pde.wizards.pages.pde.ui.ProjectTemplateApplicationOperation; import fr.inria.diverse.commons.eclipse.resources.IFileUtils; import fr.inria.diverse.commons.eclipse.resources.IFolderUtils; import fr.inria.diverse.commons.eclipse.resources.ProjectDescriptor; import fr.inria.diverse.k3.ui.Activator; import fr.inria.diverse.k3.ui.tools.GenerateGenModelCode; import fr.inria.diverse.k3.ui.tools.K3FileTemplates; import fr.inria.diverse.k3.ui.tools.K3SampleFilesTemplates; import fr.inria.diverse.k3.ui.tools.ToolsString; import fr.inria.diverse.k3.ui.tools.classpath.ManageClasspath; import fr.inria.diverse.k3.ui.tools.classpath.ManageClasspathMaven; import fr.inria.diverse.k3.ui.tools.classpath.ManageClasspathPlugin; import fr.inria.diverse.k3.ui.tools.classpath.ManageClasspathStandAlone; import fr.inria.diverse.k3.ui.wizards.pages.NewK3ProjectWizardFields; import fr.inria.diverse.k3.ui.wizards.pages.NewK3ProjectCustomWizardPage; import fr.inria.diverse.k3.ui.wizards.pages.NewK3ProjectWizardPage; public class NewK3ProjectWizard extends AbstractNewProjectWizardWithTemplates implements INewWizard { protected NewK3ProjectWizardFields context; protected NewK3ProjectWizardPage projectPage; //WizardPageCustomNewProjectK3Plugin projectPageCustom = new WizardPageCustomNewProjectK3Plugin(this.context); public NewK3ProjectWizard() { context = new NewK3ProjectWizardFields(); } @Override public void addPages() { projectPage = new NewK3ProjectWizardPage(this.context); addPage(projectPage); addPage(getTemplateListSelectionPage(context)); } @Override public void init(IWorkbench workbench, IStructuredSelection selection) { // TODO Auto-generated method stub } @Override public boolean performFinish() { try { IWorkspace workspace = ResourcesPlugin.getWorkspace(); final IProjectDescription description = workspace.newProjectDescription(this.context.projectName); if (!this.context.projectLocation.equals(workspace.getRoot().getLocation().toOSString())) description.setLocation(new Path(this.context.projectLocation)); final IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(this.context.projectName); IWorkspaceRunnable operation = new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { project.create(description, monitor); project.open(monitor); addKermetaNatureToProject(project); configureProject(project, monitor); // launch the template IProjectContentWizard contentWizard = templateSelectionPage.getSelectedWizard(); try { getContainer().run(false, true, new ProjectTemplateApplicationOperation(context, project, contentWizard)); } catch (InvocationTargetException e) { Activator.logErrorMessage(e.getMessage(), e); } catch (InterruptedException e) { Activator.logErrorMessage(e.getMessage(), e); } //setClassPath(project, monitor); project.refreshLocal(IResource.DEPTH_INFINITE, monitor); } }; ResourcesPlugin.getWorkspace().run(operation, null); } catch (Exception exception) { Activator.logErrorMessage(exception.getMessage(), exception); return false; } return true; } @Override public boolean isHelpAvailable() { return true; } public void addKermetaNatureToProject(IProject project) { IProjectDescription description; try { description = project.getDescription(); if (!description.hasNature("fr.inria.diverse.k3.ui.k3Nature")){ addNature(description, "fr.inria.diverse.k3.ui.k3Nature"); } if (!description.hasNature("org.eclipse.jdt.core.javanature")){ addNature(description, "org.eclipse.jdt.core.javanature"); } if(!description.hasNature("org.eclipse.xtext.ui.shared.xtextNature")){ addNature(description, "org.eclipse.xtext.ui.shared.xtextNature"); } if((this.context.kindsOfProject == NewK3ProjectWizardFields.KindsOfProject.PLUGIN) && (!description.hasNature("org.eclipse.pde.PluginNature"))){ addNature(description, "org.eclipse.pde.PluginNature"); } if((this.context.kindsOfProject == NewK3ProjectWizardFields.KindsOfProject.MAVEN) && (!description.hasNature("org.eclipse.m2e.core.maven2Nature"))){ addNature(description, "org.eclipse.m2e.core.maven2Nature"); } project.setDescription(description, null); } catch (CoreException e) { Activator.logErrorMessage(e.getMessage(), e); } } public void configureProject(IProject project, IProgressMonitor monitor) { try { ManageClasspath classpath; IProjectDescription description; description = project.getDescription(); addNature(description, "fr.inria.diverse.k3.ui.k3Nature"); addNature(description, "org.eclipse.jdt.core.javanature"); addNature(description, "org.eclipse.xtext.ui.shared.xtextNature"); String sourceFolderName; switch(this.context.kindsOfProject){ case MAVEN: sourceFolderName= "src/main/java/"; break; default: sourceFolderName= "src/"; } createSettingsResourcePrefs(project, monitor); IFolderUtils.createFolder(sourceFolderName + getContextNamePackage().replaceAll("\\.", "/"), project, monitor); /* if(context.ecoreIFile != null){ createProjectWithEcore(monitor, sourceFolderName); } else { if(context.useEMF){ createMiniEcoreAspectSampleXtend(project, monitor, sourceFolderName); } else{ createMiniAspectSampleXtend(project, monitor, sourceFolderName); } } */ switch (this.context.kindsOfProject) { case STANDALONE : IFileUtils.unZip(project, new ProjectDescriptor("fr.inria.diverse.k3.ui","zips/k3.zip")); IFileUtils.unZip(project, new ProjectDescriptor("fr.inria.diverse.k3.ui","zips/xtend.zip")); if(context.useEMF) IFileUtils.unZip(project, new ProjectDescriptor("fr.inria.diverse.k3.ui","zips/emf.zip")); classpath = new ManageClasspathStandAlone("lib"); classpath.setClasspath(project, monitor); break; case PLUGIN : classpath = new ManageClasspathPlugin(this.context.useSLE); addNature(description, "org.eclipse.pde.PluginNature"); configurePluginProject(project, monitor); classpath.setClasspath(project, monitor); if (context.useSLE) { classpath.setClasspath(project, monitor); } break; case MAVEN : classpath = new ManageClasspathMaven(); addNature(description, "org.eclipse.m2e.core.maven2Nature"); createMavenFile(project, monitor, false); classpath.setClasspath(project, monitor); break; } project.setDescription(description, monitor); } catch (Exception e) { Activator.logErrorMessage(e.getMessage(), e); } } private void configurePluginProject (IProject project, IProgressMonitor monitor) { try { createManifestFile(project, monitor); ManifestChanger manifestChanger = new ManifestChanger(project.getFile("META-INF/MANIFEST.MF")); manifestChanger.addPluginDependency("org.eclipse.xtend.lib", "2.6.0", false, true); manifestChanger.addPluginDependency("org.eclipse.xtext.xbase.lib", "2.6.0", false, true); manifestChanger.addPluginDependency("com.google.guava", "0.0.0", false, true); if(context.useEMF){ manifestChanger.addPluginDependency("org.eclipse.emf.ecore.xmi", "2.8.0", true, true); manifestChanger.addPluginDependency("org.eclipse.emf.ecore", "2.8.0", true, true); manifestChanger.addPluginDependency("org.eclipse.emf.common", "2.8.0", true, true); if(context.ecoreIFile != null ){ manifestChanger.addPluginDependency(context.ecoreIFile.getProject().getName(),"0.0.0", true, true); } if(context.useSLE) { manifestChanger.addPluginDependency("fr.inria.diverse.k3.sle.lib", "3.0.0", true, true); } } manifestChanger.commit(); createPlugInFile(project, monitor); createBuildProperties(project, monitor); } catch (Exception e) { Activator.logErrorMessage(e.getMessage(), e); } } public static void addNature(IProjectDescription description, String nature) { String[] natures = description.getNatureIds(); String[] newNatures = new String[natures.length + 1]; System.arraycopy(natures, 0, newNatures, 0, natures.length); newNatures[natures.length] = nature; description.setNatureIds(newNatures); } private void createManifestFile(IProject project, IProgressMonitor monitor) throws Exception { IFolder metaInf = project.getFolder("META-INF"); metaInf.create(false, true, monitor); String path = "META-INF/MANIFEST.MF"; IContainer currentContainer = project; IFile file = currentContainer.getFile(new Path(path)); String contents = K3FileTemplates.manifestMFPlugin(this.context.projectName, new ArrayList<String>(), new ArrayList<String>()); IFileUtils.writeInFile(file, contents, monitor); } private void createBuildProperties(IProject project, IProgressMonitor monitor) throws Exception { String path = "build.properties"; IContainer currentContainer = project; IFile file = currentContainer.getFile(new Path(path)); String contents = K3SampleFilesTemplates.buildProperties(); IFileUtils.writeInFile(file, contents, monitor); } private void createSettingsResourcePrefs(IProject project, IProgressMonitor monitor) throws Exception { IFolder settings = project.getFolder(".settings"); settings.create(false, true, monitor); String path = ".settings/org.eclipse.core.resources.prefs"; IContainer currentContainer = project; IFile file = currentContainer.getFile(new Path(path)); String contents = K3SampleFilesTemplates.eclipseResourcePrefs(); IFileUtils.writeInFile(file, contents, monitor); } private void createPlugInFile(IProject project,IProgressMonitor monitor) throws Exception { String path = "/plugin.xml"; IContainer currentContainer = project; IFile file = currentContainer.getFile(new Path(path)); String contents = K3FileTemplates.pluginbasisXML(); IFileUtils.writeInFile(file, contents, monitor); } private void createMavenFile(IProject project,IProgressMonitor monitor, Boolean bEcoreProject) throws Exception { String path = "/pom.xml"; IContainer currentContainer = project; IFile file = currentContainer.getFile(new Path(path)); String contents = ""; if(!bEcoreProject) { if(this.context.ecoreIFile != null) { contents = K3SampleFilesTemplates.pomXmlK3Ecore(this.context.projectName, "GroupID", "ArtifactID", "0.0.1-SNAPSHOT", this.context.ecoreIFile.getName() + ".metamodel", this.context.ecoreIFile.getName() + ".metamodel", "0.0.1-SNAPSHOT"); }else { contents = K3SampleFilesTemplates.pomXmlK3(this.context.projectName, "GroupID", "ArtifactID", "0.0.1-SNAPSHOT"); } } else { contents = K3SampleFilesTemplates.pomXmlMetamodel(this.context.ecoreIFile.getName() + ".metamodel", this.context.ecoreIFile.getName() + ".metamodel", this.context.ecoreIFile.getName() + ".metamodel", "0.0.1-SNAPSHOT"); } IFileUtils.writeInFile(file, contents, monitor); } /* private void createDefaultKmt(IProject project,IProgressMonitor monitor, String sourceFolderName) throws CoreException{ String path = sourceFolderName + this.context.namePackage + "/HelloEcore.xtend"; IContainer currentContainer = project; IFile file = currentContainer.getFile(new Path(path)); String contents = K3SampleFilesTemplates.getFileTypeK3(this.context.namePackage, "HelloEcore"); FileUtils.writeInFile(file, contents, monitor); } private void createMiniEcoreAspectSampleXtend(IProject project,IProgressMonitor monitor, String sourceFolderName) throws CoreException{ IContainer currentContainer = project; IFile file = currentContainer.getFile(new Path(sourceFolderName + this.context.namePackage + "/SampleEcoreMain.xtend")); String contents = K3SampleFilesTemplates.get_MiniAspectSample_SampleEcoreMain_xtend(this.context.namePackage); FileUtils.writeInFile(file, contents, monitor); // second file of the sample file = currentContainer.getFile(new Path(sourceFolderName + this.context.namePackage + "/SampleEcoreAspect.xtend")); contents = K3SampleFilesTemplates.get_MiniAspectSample_SampleAnnotateEcoreAspect_xtend(this.context.namePackage); FileUtils.writeInFile(file, contents, monitor); } private void createMiniAspectSampleXtend(IProject project,IProgressMonitor monitor, String sourceFolderName) throws CoreException{ IContainer currentContainer = project; IFile file = currentContainer.getFile(new Path(sourceFolderName + this.context.namePackage + "/SampleMain.xtend")); String contents = K3SampleFilesTemplates.get_MiniAspectSample_SampleMain_xtend(this.context.namePackage); FileUtils.writeInFile(file, contents, monitor); // second file of the sample file = currentContainer.getFile(new Path(sourceFolderName + this.context.namePackage + "/SampleXMLFileAspect.xtend")); contents = K3SampleFilesTemplates.get_MiniAspectSample_SampleXMLFileAspect_xtend(this.context.namePackage); FileUtils.writeInFile(file, contents, monitor); } private void createK3SLEStub(IProject project,IProgressMonitor monitor, String sourceFolderName) throws CoreException{ String mmName = this.context.ecoreIFile.getName().substring(0, this.context.ecoreIFile.getName().indexOf(".")); String ecorePlatformPath = this.context.ecoreIFile.toString().replaceFirst("L", "platform:/resource"); String path = sourceFolderName + this.context.namePackage + "/" + mmName + ".k3sle"; IContainer currentContainer = project; IFile file = currentContainer.getFile(new Path(path)); String contents = K3SampleFilesTemplates.getK3SLEStub(this.context.namePackage, ecorePlatformPath, mmName); FileUtils.writeInFile(file, contents, monitor); } */ public NewK3ProjectWizardFields getContext() { return context; } /* public boolean createProjectWithEcore(IProgressMonitor monitor, String sourceFolderName) { boolean returnVal = true; updateBasePackageFromGenModel(this.context); if (this.context.indexTransfomation != 0) { k3.language.aspectgenerator.AspectGenerator.aspectGenerate ( context.basePackage, "File:///"+this.context.locationProject, this.context.nameProject, this.context.operationName, "File:///"+this.context.ecoreIFile.getLocation().toOSString(), this.context.listNewClass, this.context.operationParams); } if (this.context.useSLE){ try { final IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(this.context.nameProject); IFolderUtils.createFolder(sourceFolderName + getContextNamePackage(), project, monitor); createK3SLEStub(project, monitor, sourceFolderName); } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return returnVal; } */ public void addNatureToProject(IProject project, Boolean tabNature[]) { IProjectDescription description; try { description = project.getDescription(); if (!tabNature[0] && !description.hasNature("fr.inria.diverse.k3.ui.k3Nature")){ addNature(description, "fr.inria.diverse.k3.ui.k3Nature"); } if (!tabNature[1] && !description.hasNature("org.eclipse.jdt.core.javanature")){ addNature(description, "org.eclipse.jdt.core.javanature"); } if(!tabNature[2] && !description.hasNature("org.eclipse.xtext.ui.shared.xtextNature")){ addNature(description, "org.eclipse.xtext.ui.shared.xtextNature"); } if(!tabNature[3] && (!description.hasNature("org.eclipse.pde.PluginNature"))){ addNature(description, "org.eclipse.pde.PluginNature"); } if(!tabNature[4] && (!description.hasNature("org.eclipse.m2e.core.maven2Nature"))){ addNature(description, "org.eclipse.m2e.core.maven2Nature"); } project.setDescription(description, null); } catch (CoreException e) { Activator.logErrorMessage(e.getMessage(), e); } } private String getContextNamePackage() { if(this.context.namePackage == null || this.context.namePackage.isEmpty()){ // create a name from the project name return JavaNameHelper.getFormattedPackageName(context.projectName); } else { return this.context.namePackage; } } public NewK3ProjectWizardPage getPageProject() { return this.projectPage; } /* public void updateBasePackageFromGenModel(NewK3ProjectWizardFields context) { GenerateGenModelCode genmodel = new GenerateGenModelCode(); String basePackage; if(genmodel.existGenModel(context)) { basePackage = genmodel.getBasePackage(context.genModelFile); if (basePackage != null) context.basePackage = new ToolsString().generateListPackage(basePackage, (byte)46); } }*/ @Override public String getTargetPluginId() { return Activator.PLUGIN_ID; } }