package fr.inria.diverse.melange.ui.wizards; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; 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.IProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.ui.INewWizard; import org.eclipse.ui.IWorkbench; 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.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.melange.ui.MelangeUiModule; import fr.inria.diverse.melange.ui.internal.MelangeActivator; import fr.inria.diverse.melange.ui.wizards.pages.NewMelangeProjectWizardFields; import fr.inria.diverse.melange.ui.wizards.pages.NewMelangeProjectWizardPage; public class NewMelangeProjectWizard extends AbstractNewProjectWizardWithTemplates implements INewWizard { protected NewMelangeProjectWizardFields context; protected NewMelangeProjectWizardPage projectPage; //WizardPageCustomNewProjectK3Plugin projectPageCustom = new WizardPageCustomNewProjectK3Plugin(this.context); public NewMelangeProjectWizard() { context = new NewMelangeProjectWizardFields(); } @Override public void addPages() { projectPage = new NewMelangeProjectWizardPage(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); addNaturesToProject(project); configureProject(project, monitor); // launch the template IProjectContentWizard contentWizard = templateSelectionPage.getSelectedWizard(); try { getContainer().run(false, true, new ProjectTemplateApplicationOperation(context, project, contentWizard)); } catch (InvocationTargetException e) { MelangeUiModule.logErrorMessage(e.getMessage(), e); } catch (InterruptedException e) { MelangeUiModule.logErrorMessage(e.getMessage(), e); } //setClassPath(project, monitor); project.refreshLocal(IResource.DEPTH_INFINITE, monitor); } }; ResourcesPlugin.getWorkspace().run(operation, null); } catch (Exception exception) { MelangeUiModule.logErrorMessage(exception.getMessage(), exception); return false; } return true; } @Override public boolean isHelpAvailable() { return true; } public void addNaturesToProject(IProject project) { IProjectDescription description; try { description = project.getDescription(); 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(!description.hasNature("org.eclipse.pde.PluginNature")){ addNature(description, "org.eclipse.pde.PluginNature"); } project.setDescription(description, null); } catch (CoreException e) { MelangeUiModule.logErrorMessage(e.getMessage(), e); } } public void configureProject(IProject project, IProgressMonitor monitor) { try { IProjectDescription description; description = project.getDescription(); addNature(description, "org.eclipse.jdt.core.javanature"); addNature(description, "org.eclipse.xtext.ui.shared.xtextNature"); //String sourceFolderName= "src/"; createSettingsResourcePrefs(project, monitor); //IFolderUtils.createFolder(sourceFolderName + context.basePackageName.replaceAll("\\.", "/"), project, monitor); IFolderUtils.createFolder("src-gen", project, monitor); addNature(description, "org.eclipse.pde.PluginNature"); createEmptyManifestFile(project, monitor); updateManifestFile(project, monitor); createPlugInFile(project, monitor); createBuildProperties(project, monitor); setClasspath(project, monitor); project.setDescription(description, monitor); } catch (Exception e) { MelangeUiModule.logErrorMessage(e.getMessage(), e); } } private void updateManifestFile (IProject project, IProgressMonitor monitor) { try { ManifestChanger manifestChanger = new ManifestChanger(project.getFile("META-INF/MANIFEST.MF")); manifestChanger.addPluginDependency("org.eclipse.xtend.lib", "2.7.0", false, true); manifestChanger.addPluginDependency("org.eclipse.xtext.xbase.lib", "2.7.0", false, true); manifestChanger.addPluginDependency("com.google.guava", "0.0.0", false, true); 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); manifestChanger.addPluginDependency("fr.inria.diverse.melange", "0.1.0", true, true); manifestChanger.addPluginDependency("fr.inria.diverse.melange.lib", "0.1.0", true, true); manifestChanger.addPluginDependency("fr.inria.diverse.melange.resource", "0.1.0", true, true); manifestChanger.addPluginDependency("fr.inria.diverse.melange.adapters", "0.1.0", true, true); manifestChanger.addPluginDependency("fr.inria.diverse.k3.al.annotationprocessor.plugin"); manifestChanger.addAttributes("Bundle-ActivationPolicy", "lazy"); manifestChanger.commit(); createPlugInFile(project, monitor); createBuildProperties(project, monitor); } catch (Exception e) { MelangeUiModule.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 createEmptyManifestFile(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 lineSeparator = System.getProperty("line.separator"); StringBuffer buffer= new StringBuffer(); buffer.append("Manifest-Version: 1.0" + lineSeparator); buffer.append("Bundle-ManifestVersion: 2" + lineSeparator); buffer.append("Bundle-Name: " + project.getName() + lineSeparator); buffer.append("Bundle-SymbolicName: " + project.getName() + "; singleton:=true" + lineSeparator); buffer.append("Bundle-Version: 1.0.0" + lineSeparator); buffer.append("Bundle-ClassPath: ." + lineSeparator); buffer.append("Bundle-RequiredExecutionEnvironment: JavaSE-1.7"+lineSeparator); IFileUtils.writeInFile(file, buffer.toString(), 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 = MelangeFilesTemplates.getBuildProperties(); 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 = MelangeFilesTemplates.getEclipseResourcePrefs(); 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 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<?eclipse version=\"3.4\"?>\n" + "<plugin>\n" + "</plugin>"; IFileUtils.writeInFile(file, contents, monitor); } public NewMelangeProjectWizardFields getContext() { return context; } 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) { MelangeUiModule.logErrorMessage(e.getMessage(), e); } } public void setClasspath (IProject project, IProgressMonitor monitor) { try { IJavaProject javaProject = (IJavaProject)project.getNature(JavaCore.NATURE_ID); IFolder sourceFolder = project.getFolder("src"); try { sourceFolder.create(true, true, monitor); } catch (Exception ex) {} ArrayList<IClasspathEntry> newClassPathArrayList = new ArrayList<IClasspathEntry>(); IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(sourceFolder); newClassPathArrayList.add( JavaCore.newSourceEntry(root.getPath())); newClassPathArrayList.add(JavaCore.newContainerEntry(new Path("org.eclipse.jdt.launching.JRE_CONTAINER"))); newClassPathArrayList.add(JavaCore.newContainerEntry(new Path("org.eclipse.pde.core.requiredPlugins"))); newClassPathArrayList.add(JavaCore.newSourceEntry(javaProject.getPackageFragmentRoot(project.getFolder("src-gen")).getPath())); // convert the array to the appropriate table IClasspathEntry[] newClassPath = new IClasspathEntry[newClassPathArrayList.size()]; javaProject.setRawClasspath(newClassPathArrayList.toArray(newClassPath), monitor); } catch (Exception e) { MelangeUiModule.logErrorMessage(e.getMessage(), e); } } public NewMelangeProjectWizardPage getPageProject() { return this.projectPage; } @Override public String getTargetPluginId() { return MelangeActivator.getInstance().getBundle().getSymbolicName(); } }