Java tutorial
/******************************************************************************* * Copyright (c) 2000, 2005 IBM Corporation and others. 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: IBM Corporation - initial API and implementation ******************************************************************************/ package org.eclipse.ajdt.examples; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.util.zip.ZipFile; import org.eclipse.ajdt.examples.util.ZipFileWrapper; import org.eclipse.ajdt.core.buildpath.BuildConfigurationUtils; import org.eclipse.core.resources.ICommand; 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.IWorkspaceRoot; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.ui.dialogs.IOverwriteQuery; import org.eclipse.ui.wizards.datatransfer.ImportOperation; import org.eclipse.ui.wizards.datatransfer.ZipFileStructureProvider; public class AspectJExampleCreationOperation implements IRunnableWithProgress { private IResource fElementToOpen; private AspectJExampleCreationWizardPage[] fPages; private IOverwriteQuery fOverwriteQuery; /** * Constructor for ExampleProjectCreationOperation */ public AspectJExampleCreationOperation(AspectJExampleCreationWizardPage[] pages, IOverwriteQuery overwriteQuery) { fElementToOpen = null; fPages = pages; fOverwriteQuery = overwriteQuery; } /* * @see IRunnableWithProgress#run(IProgressMonitor) */ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { if (monitor == null) { monitor = new NullProgressMonitor(); } try { monitor.beginTask(AspectJExampleMessages.getString("ExampleProjectCreationOperation.op_desc"), //$NON-NLS-1$ fPages.length); IWorkspaceRoot root = AspectJExamplePlugin.getWorkspace().getRoot(); for (int i = 0; i < fPages.length; i++) { createProject(root, fPages[i], new SubProgressMonitor(monitor, 1)); } } finally { monitor.done(); } } public IResource getElementToOpen() { return fElementToOpen; } private void createProject(IWorkspaceRoot root, AspectJExampleCreationWizardPage page, IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { IConfigurationElement desc = page.getConfigurationElement(); IConfigurationElement[] imports = desc.getChildren("import"); //$NON-NLS-1$ IConfigurationElement[] natures = desc.getChildren("nature"); //$NON-NLS-1$ IConfigurationElement[] references = desc.getChildren("references"); //$NON-NLS-1$ int nImports = (imports == null) ? 0 : imports.length; int nNatures = (natures == null) ? 0 : natures.length; int nReferences = (references == null) ? 0 : references.length; monitor.beginTask(AspectJExampleMessages.getString("ExampleProjectCreationOperation.op_desc_proj"), //$NON-NLS-1$ nImports + 1); String name = page.getName(); String[] natureIds = new String[nNatures]; for (int i = 0; i < nNatures; i++) { natureIds[i] = natures[i].getAttribute("id"); //$NON-NLS-1$ } IProject[] referencedProjects = new IProject[nReferences]; for (int i = 0; i < nReferences; i++) { referencedProjects[i] = root.getProject(references[i].getAttribute("id")); //$NON-NLS-1$ } IProject proj = configNewProject(root, name, natureIds, referencedProjects, monitor); for (int i = 0; i < nImports; i++) { doImports(proj, imports[i], new SubProgressMonitor(monitor, 1)); } String open = desc.getAttribute("open"); //$NON-NLS-1$ if (open != null && open.length() > 0) { IResource fileToOpen = proj.findMember(new Path(open)); if (fileToOpen != null) { fElementToOpen = fileToOpen; } } // apply active build configuration String buildConfig = desc.getAttribute("build"); //$NON-NLS-1$ if (buildConfig != null) { IResource bcFile = proj.findMember(new Path(buildConfig)); if ((bcFile != null) && (bcFile.getType() == IResource.FILE)) { BuildConfigurationUtils.applyBuildConfiguration((IFile) bcFile); } } } private IProject configNewProject(IWorkspaceRoot root, String name, String[] natureIds, IProject[] referencedProjects, IProgressMonitor monitor) throws InvocationTargetException { try { IProject project = root.getProject(name); if (!project.exists()) { project.create(null); } if (!project.isOpen()) { project.open(null); } IProjectDescription desc = project.getDescription(); desc.setLocation(null); desc.setNatureIds(natureIds); desc.setReferencedProjects(referencedProjects); project.setDescription(desc, new SubProgressMonitor(monitor, 1)); // ensure Java builder is removed desc = project.getDescription(); ICommand[] buildCommands = desc.getBuildSpec(); if (contains(buildCommands, JavaCore.BUILDER_ID)) { desc.setBuildSpec(remove(buildCommands, JavaCore.BUILDER_ID)); project.setDescription(desc, null); } return project; } catch (CoreException e) { throw new InvocationTargetException(e); } } /** * Check if the given build command list contains a given command */ private boolean contains(ICommand[] commands, String builderId) { boolean found = false; for (int i = 0; i < commands.length; i++) { if (commands[i].getBuilderName().equals(builderId)) { found = true; break; } } return found; } /** * Remove a build command from a list */ private ICommand[] remove(ICommand[] sourceCommands, String builderId) { ICommand[] newCommands = new ICommand[sourceCommands.length - 1]; int newCommandIndex = 0; for (int i = 0; i < sourceCommands.length; i++) { if (!sourceCommands[i].getBuilderName().equals(builderId)) { newCommands[newCommandIndex++] = sourceCommands[i]; } } return newCommands; } private void doImports(IProject project, IConfigurationElement curr, IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { try { IPath destPath; String name = curr.getAttribute("dest"); //$NON-NLS-1$ if (name == null || name.length() == 0) { destPath = project.getFullPath(); } else { IFolder folder = project.getFolder(name); if (!folder.exists()) { folder.create(true, true, null); } destPath = folder.getFullPath(); } String importPath = curr.getAttribute("src"); //$NON-NLS-1$ if (importPath == null) { importPath = ""; //$NON-NLS-1$ AspectJExamplePlugin.log("projectsetup descriptor: import missing"); //$NON-NLS-1$ return; } ZipFile zipFile = getZipFileFromPluginDir(importPath); importFilesFromZip(zipFile, destPath, new SubProgressMonitor(monitor, 1)); } catch (CoreException e) { throw new InvocationTargetException(e); } } private ZipFile getZipFileFromPluginDir(String pluginRelativePath) throws CoreException { try { URL starterURL = new URL(AspectJExamplePlugin.getDefault().getBundle().getEntry("/"), //$NON-NLS-1$ pluginRelativePath); //return new ZipFile(FileLocator.toFileURL(starterURL).getFile()); // Use zip file wrapper class to filter out META-INF/eclipse.inf file return new ZipFileWrapper(FileLocator.toFileURL(starterURL).getFile()); } catch (IOException e) { String message = pluginRelativePath + ": " + e.getMessage(); //$NON-NLS-1$ Status status = new Status(IStatus.ERROR, AspectJExamplePlugin.getPluginId(), IStatus.ERROR, message, e); throw new CoreException(status); } } private void importFilesFromZip(ZipFile srcZipFile, IPath destPath, IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { ZipFileStructureProvider structureProvider = new ZipFileStructureProvider(srcZipFile); ImportOperation operator = new ImportOperation(destPath, structureProvider.getRoot(), structureProvider, fOverwriteQuery); operator.run(monitor); } }