/** * <copyright> * </copyright> * * */ package org.feature.multi.perspective.mapping.viewmapping.resource.mtext.ui; /** * This class is based on: * <i>org.eclipse.gef.examples.ui.pde.internal.wizards.ProjectUnzipperNewWizard</i> * . * It is responsible for offering an example project via the new dialog of Eclipse. */ public class MtextNewProjectWizard extends org.eclipse.jface.wizard.Wizard implements org.eclipse.ui.INewWizard, org.eclipse.core.runtime.IExecutableExtension { /** * The single page provided by this base implementation. It provides all the * functionality required to capture the name and location of the target project. */ private org.eclipse.ui.dialogs.WizardNewProjectCreationPage wizardNewProjectCreationPage; /** * The name of the project creation page */ private String pageName = "New " + new org.feature.multi.perspective.mapping.viewmapping.resource.mtext.mopp.MtextMetaInformation().getSyntaxName() + " Project"; /** * The title of the project creation page */ private String pageTitle = pageName; /** * The description of the project creation page */ private String pageDescription = "Enter a name and select a location where the new project shall be created."; /** * The name of the project in the project creation page */ private String pageProjectName= ""; /** * The name of the new project zip file (relative to the UI plugin's root) */ private String newProjectZip="newProject.zip"; /** * The configuration element associated with this new project wizard */ private org.eclipse.core.runtime.IConfigurationElement config; /** * The constructor. */ public MtextNewProjectWizard() { super(); } /** * Performs the bulk of the wizard functionality: project creation, the unzip * operation and classpath update. * * @see org.eclipse.jface.wizard.Wizard#performFinish */ public boolean performFinish() { try { org.eclipse.jface.operation.IRunnableWithProgress operation = new org.eclipse.ui.actions.WorkspaceModifyOperation() { public void execute(org.eclipse.core.runtime.IProgressMonitor monitor) throws InterruptedException { try { monitor.beginTask("Creating Example Project", 120); // Create the project folder org.eclipse.core.runtime.IPath projectPath = wizardNewProjectCreationPage.getLocationPath(); String projectName = wizardNewProjectCreationPage.getProjectName(); String projectFolder = projectPath.toOSString() + java.io.File.separator + projectName; java.io.File projectFolderFile = new java.io.File(projectFolder); org.eclipse.core.resources.IWorkspace workspace = org.eclipse.core.resources.ResourcesPlugin.getWorkspace(); org.eclipse.core.resources.IProject project = workspace.getRoot().getProject(projectName); // If the project does not exist, we will create it and populate it. if (!project.exists()) { projectFolderFile.mkdirs(); monitor.worked(10); org.osgi.framework.Bundle bundle = org.eclipse.core.runtime.Platform.getBundle("org.feature.multi.perspective.mapping.viewmapping.resource.mtext.ui"); java.net.URL newProjectZipURL = bundle.getEntry(newProjectZip); if (newProjectZipURL != null) { // Copy plug-in project code extractProject(projectFolderFile, newProjectZipURL, new org.eclipse.core.runtime.SubProgressMonitor(monitor, 100)); } if (monitor.isCanceled()) { throw new InterruptedException(); } org.eclipse.core.resources.IProjectDescription desc = workspace.newProjectDescription(project.getName()); if (!projectPath.equals(workspace.getRoot().getLocation())) { desc.setLocation(new org.eclipse.core.runtime.Path(projectFolder)); } String natureID = org.feature.multi.perspective.mapping.viewmapping.resource.mtext.mopp.MtextNature.NATURE_ID; java.util.List<org.eclipse.core.resources.ICommand> buildCommands = new java.util.ArrayList<org.eclipse.core.resources.ICommand>(); for (String builderID : org.feature.multi.perspective.mapping.viewmapping.resource.mtext.mopp.MtextNature.BUILDER_IDS) { org.eclipse.core.resources.ICommand command = desc.newCommand(); command.setBuilderName(builderID); buildCommands.add(command); } desc.setNatureIds(new String[] {natureID}); desc.setBuildSpec(buildCommands.toArray(new org.eclipse.core.resources.ICommand[buildCommands.size()])); project.create(desc, monitor); // Now, we ensure that the project is open. project.open(monitor); renameProject(project, projectName); org.eclipse.core.resources.IFile defaultNewFile = project.getFile("NEW_FILE_PLACEHOLDER"); if (newProjectZipURL == null) { defaultNewFile.create(new java.io.ByteArrayInputStream(new byte[0]), true, null); } if (defaultNewFile.exists()) { org.feature.multi.perspective.mapping.viewmapping.resource.mtext.mopp.MtextMetaInformation info = new org.feature.multi.perspective.mapping.viewmapping.resource.mtext.mopp.MtextMetaInformation(); String fileName = "new_file." + info.getSyntaxName(); String content = info.getNewFileContentProvider().getNewFileContent("new_file." + info.getSyntaxName()); defaultNewFile.setContents(new java.io.ByteArrayInputStream(content.getBytes()), org.eclipse.core.resources.IFile.FORCE, null); defaultNewFile.move(project.getProjectRelativePath().append(fileName), true, null); } } monitor.worked(10); if (monitor.isCanceled()) { throw new InterruptedException(); } } catch (java.io.IOException e) { throw new RuntimeException(e); } catch (org.eclipse.core.runtime.CoreException e) { throw new RuntimeException(e); } finally { monitor.done(); } } }; getContainer().run(false, true, operation); // Set perspective org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard.updatePerspective(config); } catch (InterruptedException e) { return false; } catch (Exception e) { return false; } return true; } /** * Unzip the project archive to the specified folder * * @param projectFolderFile The folder where to unzip the project archive * @param monitor Monitor to display progress and/or cancel operation * * @throws java.io.IOException * * @throws InterruptedException * * @throws java.io.FileNotFoundException */ private void extractProject(java.io.File projectFolderFile, java.net.URL url, org.eclipse.core.runtime.IProgressMonitor monitor) throws java.io.FileNotFoundException, java.io.IOException, InterruptedException { // Get project archive java.net.URL urlZipLocal = org.eclipse.core.runtime.FileLocator.toFileURL(url); // Walk each element and unzip java.util.zip.ZipFile zipFile = new java.util.zip.ZipFile(urlZipLocal.getPath()); try { // Allow for a hundred work units monitor.beginTask("Extracting Project", zipFile.size()); unzip(zipFile, projectFolderFile, monitor); } finally { zipFile.close(); monitor.done(); } } /** * Unzips the platform formatted zip file to specified folder * * @param zipFile The platform formatted zip file * @param projectFolderFile The folder where to unzip the project archive * @param monitor Monitor to display progress and/or cancel operation * * @throws java.io.IOException * * @throws java.io.FileNotFoundException * * @throws InterruptedException */ private void unzip(java.util.zip.ZipFile zipFile, java.io.File projectFolderFile, org.eclipse.core.runtime.IProgressMonitor monitor) throws java.io.IOException, java.io.FileNotFoundException, InterruptedException { java.util.Enumeration<? extends java.util.zip.ZipEntry> e = zipFile.entries(); while (e.hasMoreElements()) { java.util.zip.ZipEntry zipEntry = (java.util.zip.ZipEntry) e.nextElement(); java.io.File file = new java.io.File(projectFolderFile, zipEntry.getName()); if (false == zipEntry.isDirectory()) { // Copy files (and make sure parent directory exist) java.io.File parentFile = file.getParentFile(); if (null != parentFile && false == parentFile.exists()) { parentFile.mkdirs(); } org.eclipse.core.runtime.Path path = new org.eclipse.core.runtime.Path(file.getPath()); if ("java".equals(path.getFileExtension())) { java.io.InputStreamReader is = null; java.io.OutputStreamWriter os = null; try { is = new java.io.InputStreamReader(zipFile.getInputStream(zipEntry), "ISO-8859-1"); os = new java.io.OutputStreamWriter(new java.io.FileOutputStream(file), org.eclipse.core.resources.ResourcesPlugin.getEncoding()); char[] buffer = new char[102400]; while (true) { int len = is.read(buffer); if (len < 0) break; os.write(buffer, 0, len); } } finally { if (null != is) { is.close(); } if (null != os) { os.close(); } } } else { java.io.InputStream is = null; java.io.OutputStream os = null; try { is = zipFile.getInputStream(zipEntry); os = new java.io.FileOutputStream(file); byte[] buffer = new byte[102400]; while (true) { int len = is.read(buffer); if (len < 0) break; os.write(buffer, 0, len); } } finally { if (null != is) { is.close(); } if (null != os) { os.close(); } } } } monitor.worked(1); if (monitor.isCanceled()) { throw new InterruptedException(); } } } /** * Renames the specified project to the specified name * * @param project Project to rename * @param projectName New name for the project * * @throws org.eclipse.core.runtime.CoreException */ private void renameProject(org.eclipse.core.resources.IProject project, String projectName) throws org.eclipse.core.runtime.CoreException { org.eclipse.core.resources.IProjectDescription description = project.getDescription(); description.setName(projectName); project.move(description, org.eclipse.core.resources.IResource.FORCE | org.eclipse.core.resources.IResource.SHALLOW, null); } /** * Creates the sole wizard page contributed by this base implementation; the * standard Eclipse WizardNewProjectCreationPage. * * @see * org.eclipse.ui.dialogs.WizardNewProjectCreationPage#org.eclipse.ui.dialogs.Wizar * dNewProjectCreationPage(String) */ public void init(org.eclipse.ui.IWorkbench workbench, org.eclipse.jface.viewers.IStructuredSelection selection) { // Set default image for all wizard pages org.eclipse.core.runtime.IPath path = new org.eclipse.core.runtime.Path("icons/new_project_wizban.gif"); org.osgi.framework.Bundle bundle = org.feature.multi.perspective.mapping.viewmapping.resource.mtext.ui.MtextUIPlugin.getDefault().getBundle(); java.net.URL url = org.eclipse.core.runtime.FileLocator.find(bundle, path, null); org.eclipse.jface.resource.ImageDescriptor descriptor = org.eclipse.jface.resource.ImageDescriptor.createFromURL(url); setDefaultPageImageDescriptor(descriptor); wizardNewProjectCreationPage = new org.eclipse.ui.dialogs.WizardNewProjectCreationPage(pageName); wizardNewProjectCreationPage.setTitle(pageTitle); wizardNewProjectCreationPage.setDescription(pageDescription); wizardNewProjectCreationPage.setInitialProjectName(pageProjectName); this.addPage(wizardNewProjectCreationPage); } public void setInitializationData(org.eclipse.core.runtime.IConfigurationElement configIn, String propertyName, Object data) throws org.eclipse.core.runtime.CoreException { config = configIn; } }