| /*******************************************************************************
|
| * Copyright (c) 2010-2019 Mia-Software and others.
|
| * All rights reserved. This program and the accompanying materials
|
| * are made available under the terms of the Eclipse Public License v2.0
|
| * which accompanies this distribution, and is available at
|
| * http://www.eclipse.org/legal/epl-v20.html
|
| *
|
| * Contributors:
|
| * Nicolas Bros (Mia-Software) - initial API and implementation
|
| * Nicolas Guyomar (Mia-Software) - Bug 340339 - Need some Utils class for Folder/File/Project management
|
| * Gregoire Dupe (Mia-Software) - Bug 340339 - Need some Utils class for Folder/File/Project management
|
| * Nicolas Guyomar (Mia-Software) - Bug 340681 - Facet column implementation
|
| * Nicolas Bros (Mia-Software) - Bug 380391 - PluginUtils#importPlugin should use the Bundle API
|
| * Gregoire Dupe (Mia-Software) - Bug 408344 - [Releng] Deep folders cause build break
|
| *******************************************************************************/ |
| package org.eclipse.modisco.facet.util.pde.core.internal;
|
|
|
| import java.io.ByteArrayInputStream;
|
| import java.io.FileNotFoundException;
|
| import java.io.IOException;
|
| import java.io.InputStream;
|
| import java.io.StringWriter;
|
| import java.net.URISyntaxException;
|
| import java.net.URL;
|
| import java.util.ArrayList;
|
| import java.util.Arrays;
|
| import java.util.Enumeration;
|
| import java.util.List;
|
|
|
| import javax.xml.parsers.DocumentBuilder;
|
| import javax.xml.parsers.DocumentBuilderFactory;
|
| import javax.xml.parsers.ParserConfigurationException;
|
| import javax.xml.transform.OutputKeys;
|
| import javax.xml.transform.Transformer;
|
| import javax.xml.transform.TransformerException;
|
| import javax.xml.transform.TransformerFactory;
|
| import javax.xml.transform.dom.DOMSource;
|
| import javax.xml.transform.stream.StreamResult;
|
|
|
| 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.IWorkspaceRoot;
|
| import org.eclipse.core.resources.IWorkspaceRunnable;
|
| import org.eclipse.core.resources.IncrementalProjectBuilder;
|
| import org.eclipse.core.resources.ResourcesPlugin;
|
| import org.eclipse.core.runtime.CoreException;
|
| import org.eclipse.core.runtime.IPath;
|
| import org.eclipse.core.runtime.IProgressMonitor;
|
| import org.eclipse.core.runtime.IStatus;
|
| import org.eclipse.core.runtime.MultiStatus;
|
| import org.eclipse.core.runtime.NullProgressMonitor;
|
| import org.eclipse.core.runtime.Path;
|
| import org.eclipse.core.runtime.Status;
|
| import org.eclipse.jdt.core.IClasspathEntry;
|
| import org.eclipse.jdt.core.IJavaProject;
|
| import org.eclipse.jdt.core.JavaConventions;
|
| import org.eclipse.jdt.core.JavaCore;
|
| import org.eclipse.jdt.core.JavaModelException;
|
| import org.eclipse.modisco.facet.util.core.Logger;
|
| import org.eclipse.modisco.facet.util.core.internal.exported.FileUtils;
|
| import org.eclipse.modisco.facet.util.core.internal.exported.FolderUtils;
|
| import org.eclipse.modisco.facet.util.core.internal.exported.IFilter;
|
| import org.eclipse.osgi.util.NLS;
|
| import org.eclipse.pde.core.plugin.IExtensions;
|
| import org.eclipse.pde.core.plugin.IPluginAttribute;
|
| import org.eclipse.pde.core.plugin.IPluginElement;
|
| import org.eclipse.pde.core.plugin.IPluginExtension;
|
| import org.eclipse.pde.core.plugin.IPluginModelBase;
|
| import org.eclipse.pde.core.plugin.IPluginObject;
|
| import org.eclipse.pde.core.plugin.PluginRegistry;
|
| import org.osgi.framework.Bundle;
|
| import org.w3c.dom.Attr;
|
| import org.w3c.dom.Document;
|
| import org.w3c.dom.Element;
|
| import org.w3c.dom.Node;
|
| import org.w3c.dom.Text;
|
| import org.xml.sax.SAXException;
|
|
|
| import com.ibm.icu.lang.UCharacter;
|
|
|
| public final class PluginUtils {
|
|
|
| // This class has been copied from
|
| // org.eclipse.modisco.facet.infra.common.core.internal.utils.PluginUtils
|
|
|
| private PluginUtils() {
|
| // utilities class
|
| }
|
|
|
| /**
|
| * Returns whether the given file is registered in the plugin.xml of the
|
| * given project, using the given extension point.
|
| *
|
| * @param extensionPoint
|
| * the extension point that is used to register elements of this
|
| * kind (elements must be declared with a "file" attribute)
|
| */
|
| public static boolean isRegistered(final IFile elementFile, final String extensionPoint) {
|
| final IProject project = elementFile.getProject();
|
| final IPluginModelBase pluginModel = PluginRegistry.findModel(project);
|
| boolean result = false;
|
| if (pluginModel != null) {
|
| final IExtensions extensions2 = pluginModel.getExtensions();
|
| final IPluginExtension[] extensions = extensions2.getExtensions();
|
| for (IPluginExtension pluginExtension : extensions) {
|
| if (extensionPoint.equals(pluginExtension.getPoint())) {
|
| final IPluginObject[] children = pluginExtension.getChildren();
|
| for (IPluginObject child : children) {
|
| if (child instanceof IPluginElement) {
|
| final IPluginElement pluginElement = (IPluginElement) child;
|
| final IPluginAttribute[] attributes = pluginElement.getAttributes();
|
| for (IPluginAttribute pluginAttribute : attributes) {
|
| if ("file".equalsIgnoreCase(pluginAttribute.getName())) { //$NON-NLS-1$
|
| final String strFile = pluginAttribute.getValue();
|
| if (strFile != null && strFile.length() > 0) {
|
| final IFile file = project.getFile(strFile);
|
| if (file.exists() && elementFile.equals(file)) {
|
| result = true;
|
| }
|
| }
|
| }
|
| }
|
| }
|
| }
|
| }
|
| }
|
| }
|
| return result;
|
| }
|
|
|
| /**
|
| * Registers the given file in the plugin.xml of the given project, using
|
| * the given extension point.
|
| *
|
| * @param project
|
| * the project in which the element should be registered
|
| * @param extensionToCheck
|
| * the file extension of the element that should be registered
|
| * @param extensionPoint
|
| * the extension point that is used to register elements of this
|
| * kind (elements must be declared with a "file" attribute)
|
| */
|
| /**
|
| * Registers the given file in the plugin.xml of the given project, using
|
| * the given extension point.
|
| *
|
| * @param file
|
| * the file to register
|
| * @param extensionPointId
|
| * the extension point that is used to register the file
|
| * @param elementName
|
| * the name of the XML element in which an attribute named "file"
|
| * will be set to the path of the file
|
| * @throws ParserConfigurationException
|
| * @throws IOException
|
| * @throws SAXException
|
| * @throws TransformerException
|
| * @throws CoreException
|
| */
|
| public static void register(final IFile file, final String extensionPointId,
|
| final String elementName) {
|
| if (isRegistered(file, extensionPointId)) {
|
| return;
|
| }
|
|
|
| final IPath filePath = file.getFullPath().removeFirstSegments(1);
|
| final IProject project = file.getProject();
|
|
|
| final IFile pluginXML = project.getFile("plugin.xml"); //$NON-NLS-1$
|
| if (pluginXML.exists()) {
|
| final DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
|
| DocumentBuilder docBuilder;
|
|
|
| try {
|
| docBuilder = docFactory.newDocumentBuilder();
|
| final String pluginXmlLoc = pluginXML.getLocation().toOSString();
|
| final Document doc = docBuilder.parse(pluginXmlLoc);
|
| final Element root = doc.getDocumentElement();
|
|
|
| final Text whitespace = doc.createTextNode(" "); //$NON-NLS-1$
|
| root.appendChild(whitespace);
|
|
|
| final Node extensionNode = doc.createElement("extension"); //$NON-NLS-1$
|
| final Attr pointAttr = doc.createAttribute("point"); //$NON-NLS-1$
|
| pointAttr.setValue(extensionPointId);
|
| extensionNode.getAttributes().setNamedItem(pointAttr);
|
| root.appendChild(extensionNode);
|
|
|
| final Node elementNode = doc.createElement(elementName);
|
| final Attr fileAttr = doc.createAttribute("file"); //$NON-NLS-1$
|
| fileAttr.setValue(filePath.toString());
|
| elementNode.getAttributes().setNamedItem(fileAttr);
|
| extensionNode.appendChild(elementNode);
|
|
|
| final TransformerFactory trFactory = TransformerFactory.newInstance();
|
| final int indent = 3;
|
| trFactory.setAttribute("indent-number", Integer.valueOf(indent)); //$NON-NLS-1$
|
| final Transformer transformer = trFactory.newTransformer();
|
| transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); //$NON-NLS-1$
|
| transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
|
| final StreamResult result = new StreamResult(new StringWriter());
|
| final DOMSource source = new DOMSource(doc);
|
| transformer.transform(source, result);
|
| final String xmlString = result.getWriter().toString();
|
|
|
| final byte[] byteArray = xmlString.getBytes("UTF-8"); //$NON-NLS-1$
|
| pluginXML.setContents(new ByteArrayInputStream(byteArray), true, true,
|
| new NullProgressMonitor());
|
|
|
| } catch (Exception e) {
|
| Logger.logError(e, Activator.getDefault());
|
| }
|
| } else {
|
| try {
|
| // create plugin.xml
|
| final String template = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" //$NON-NLS-1$
|
| + "<?eclipse version=\"3.4\"?>\n" + "<plugin>\n" //$NON-NLS-1$ //$NON-NLS-2$
|
| + " <extension point=\"{0}\">\n" + " <{1} file=\"{2}\"/>\n" //$NON-NLS-1$ //$NON-NLS-2$
|
| + " </extension>\n" //$NON-NLS-1$
|
| + "</plugin>\n"; //$NON-NLS-1$
|
|
|
| final String content = NLS.bind(template, new Object[] { extensionPointId, elementName,
|
| filePath.toString() });
|
| byte[] byteArray;
|
| byteArray = content.getBytes("UTF-8"); //$NON-NLS-1$
|
| pluginXML.create(new ByteArrayInputStream(byteArray), true,
|
| new NullProgressMonitor());
|
| try {
|
| BuildPropertiesUtils.addToBuild(pluginXML);
|
| } catch (Exception e) {
|
| Logger.logError(e, "Error adding file " + pluginXML.getFullPath() //$NON-NLS-1$
|
| + " to the build.properties", null); //$NON-NLS-1$
|
| }
|
| } catch (Exception e) {
|
| Logger.logError(e, Activator.getDefault());
|
| }
|
| }
|
| }
|
|
|
| private static final String JAVA_VERSION = "JavaSE-1.8"; //$NON-NLS-1$
|
| private static final String ACTIVATOR_NAME = "Activator"; //$NON-NLS-1$
|
| private static final String MANIFEST_MF_TPL = "resources/MANIFEST.MF.template"; //$NON-NLS-1$
|
| private static final String ACTIVATOR_TPL = "resources/Activator.java.template"; //$NON-NLS-1$
|
| private static final String PDE_CLASSPATH_ID = "org.eclipse.pde.core.requiredPlugins"; //$NON-NLS-1$
|
| private static final String PLUGIN_NATURE = "org.eclipse.pde.PluginNature"; //$NON-NLS-1$
|
|
|
| private static void addPdeClassPath(final IProject project)
|
| throws JavaModelException {
|
| final IJavaProject javaProject = JavaCore.create(project);
|
| final IClasspathEntry[] oldClassPath = javaProject.getRawClasspath();
|
| for (IClasspathEntry classpathEntry : oldClassPath) {
|
| if (classpathEntry.getPath().equals(new Path(PluginUtils.PDE_CLASSPATH_ID))) {
|
| return;
|
| }
|
| }
|
| final IClasspathEntry[] newClassPath = new IClasspathEntry[oldClassPath.length + 1];
|
| System.arraycopy(oldClassPath, 0, newClassPath, 0, oldClassPath.length);
|
| newClassPath[oldClassPath.length] = JavaCore
|
| .newContainerEntry(new Path(PluginUtils.PDE_CLASSPATH_ID));
|
| javaProject.setRawClasspath(newClassPath, new NullProgressMonitor());
|
| }
|
|
|
| /**
|
| * @author Gregoire Dupe (Mia-Software) - Removing "Require-Bundle"
|
| * statement
|
| * @throws IOException
|
| */
|
| private static void createManifest(final IProject project)
|
| throws CoreException, IOException {
|
| final IFolder folder = project.getFolder("META-INF"); //$NON-NLS-1$
|
| if (!folder.exists()) {
|
| folder.create(true, true, new NullProgressMonitor());
|
| }
|
| final IFile manifestFile = folder.getFile("MANIFEST.MF"); //$NON-NLS-1$
|
| if (!manifestFile.exists()) {
|
| String template = FileUtils.getFileContents(Activator.getDefault()
|
| .getBundle(), PluginUtils.MANIFEST_MF_TPL);
|
| template = template.replace("{projectName}", project.getName()); //$NON-NLS-1$
|
| final String packageName = PluginUtils
|
| .stringToValidPackageName(project.getName());
|
| template = template.replace("{packageName}", packageName); //$NON-NLS-1$
|
| final String activator = PluginUtils
|
| .bundleActivatorQualifiedName(packageName);
|
| template = template.replace("{activator}", activator); //$NON-NLS-1$
|
| template = template.replace("{javaVersion}", //$NON-NLS-1$
|
| PluginUtils.JAVA_VERSION);
|
| final InputStream source = new ByteArrayInputStream(
|
| template.getBytes());
|
| manifestFile.create(source, true, new NullProgressMonitor());
|
| }
|
| }
|
|
|
| private static String bundleActivatorQualifiedName(final String packageName) {
|
| return packageName + '.' + PluginUtils.ACTIVATOR_NAME;
|
| }
|
|
|
| private static void createActivator(final IProject project)
|
| throws CoreException, IOException {
|
| final String packageName = PluginUtils.stringToValidPackageName(project
|
| .getName());
|
| final String qualifiedName = PluginUtils
|
| .bundleActivatorQualifiedName(packageName);
|
| final String path = qualifiedName.replaceAll("\\.", "/"); //$NON-NLS-1$ //$NON-NLS-2$
|
| final IFile activatorFile = project
|
| .getFile(new Path("src").append(path).addFileExtension("java")); //$NON-NLS-1$ //$NON-NLS-2$
|
| FolderUtils.createFolder((IFolder) activatorFile.getParent());
|
| if (!activatorFile.exists()) {
|
| final String template = FileUtils.getFileContents(Activator
|
| .getDefault().getBundle(), PluginUtils.ACTIVATOR_TPL);
|
| final String activatorContents = template.replace("{0}", packageName); //$NON-NLS-1$
|
| final InputStream source = new ByteArrayInputStream(
|
| activatorContents.getBytes());
|
| activatorFile.create(source, true, new NullProgressMonitor());
|
| }
|
| }
|
|
|
| /** Transform the given name into a valid package and bundle name */
|
| private static String stringToValidPackageName(final String name) {
|
| final StringBuilder builder = new StringBuilder();
|
| char prev = ' ';
|
| for (int i = 0; i < name.length(); i++) {
|
| final char character = name.charAt(i);
|
| if (character >= 'a' && character <= 'z' || character >= 'A'
|
| && character <= 'Z' || character == '_') {
|
| builder.append(character);
|
| prev = character;
|
| } else if (character >= '0' && character <= '9') {
|
| if (builder.length() == 0 || prev == '.') {
|
| builder.append("_"); //$NON-NLS-1$
|
| }
|
| builder.append(character);
|
| prev = character;
|
| } else if (character == '.') {
|
| if (prev == '.') {
|
| continue;
|
| }
|
| if (builder.length() == 0 || prev >= '0' && prev <= '9') {
|
| builder.append("_"); //$NON-NLS-1$
|
| }
|
| builder.append(character);
|
| prev = character;
|
| } else {
|
| builder.append("_"); //$NON-NLS-1$
|
| }
|
| }
|
|
|
| String result = builder.toString();
|
| // first letter to lowercase
|
| if (result.length() > 0 && UCharacter.isUpperCase(result.charAt(0))) {
|
| result = UCharacter.toLowerCase(result.charAt(0))
|
| + result.substring(1);
|
| }
|
|
|
| final IStatus status = JavaConventions.validatePackageName(result,
|
| JavaCore.VERSION_1_5, JavaCore.VERSION_1_5);
|
| if (!status.isOK()) {
|
| Logger.logWarning(
|
| "Couldn't make valid package name from project name: " //$NON-NLS-1$
|
| + status.getMessage(), Activator.getDefault());
|
| result = name;
|
| }
|
| return result;
|
| }
|
|
|
| private static void addPdeNature(final IProject project)
|
| throws CoreException {
|
| final String pluginNature = PluginUtils.PLUGIN_NATURE;
|
| final IProjectDescription description = project.getDescription();
|
| final String[] natures = description.getNatureIds();
|
| if (!Arrays.asList(natures).contains(pluginNature)) {
|
| String[] newNatures = new String[natures.length + 1];
|
| System.arraycopy(natures, 0, newNatures, 0, natures.length);
|
| newNatures[natures.length] = pluginNature;
|
| description.setNatureIds(newNatures);
|
| project.setDescription(description, new NullProgressMonitor());
|
| }
|
| }
|
|
|
| /**
|
| * This method transforms a Java project into a plug-in project by creating
|
| * a MANIFEST.MF and an activator and by adding a the PDE nature and the PDE
|
| * classpath.
|
| *
|
| * @param project
|
| * The project to transform in an plug-in project
|
| * @throws CoreException
|
| * @throws IOException
|
| */
|
| public static void configureAsPluginProject(final IProject project)
|
| throws CoreException, IOException {
|
| PluginUtils.addPdeNature(project);
|
| // PDE builders are automatically added when the PDE nature is added
|
| PluginUtils.addPdeClassPath(project);
|
| PluginUtils.createManifest(project);
|
| PluginUtils.createActivator(project);
|
| }
|
|
|
| /**
|
| * This method returns true if the project is a plug-in project.
|
| *
|
| * @param project
|
| * @return True if the project is a plug-in project.
|
| * @throws CoreException
|
| */
|
| public static boolean isPluginProject(final IProject project)
|
| throws CoreException {
|
| boolean result = false;
|
| if (project.isAccessible()) {
|
| result = project.getNature(PluginUtils.PLUGIN_NATURE) != null;
|
| }
|
| return result;
|
| }
|
|
|
| /**
|
| * This method returns true if the path refers a file or a folder contained
|
| * in a plug-in project.
|
| *
|
| * @param path
|
| * @return True if the path refers a file or a folder contained in a plug-in
|
| * project.
|
| * @throws CoreException
|
| */
|
| public static boolean isInPluginProject(final IPath path)
|
| throws CoreException {
|
| IProject project;
|
| if (path.segmentCount() == 1) {
|
| project = ResourcesPlugin.getWorkspace().getRoot()
|
| .getProject(path.segment(0));
|
| } else {
|
| final IFolder folder = ResourcesPlugin.getWorkspace().getRoot()
|
| .getFolder(path);
|
| project = folder.getProject();
|
| }
|
| return isPluginProject(project);
|
| }
|
|
|
| /**
|
| * This method imports a plug-in in the workspace.
|
| *
|
| * @param bundle
|
| * the bundle to import into a new project
|
| * @return the created project
|
| * @throws CoreException
|
| * in case of error
|
| */
|
| public static IProject importPlugin(final Bundle bundle) throws CoreException {
|
| return PluginUtils.importPlugin(bundle, new IFilter<String>() {
|
| public boolean filter(final String fileName) {
|
| return true;
|
| }
|
| });
|
| }
|
|
|
| /**
|
| * This method imports a plug-in in the workspace.
|
| *
|
| * @param bundle
|
| * the bundle to import into a new project
|
| * @param filter
|
| * can be used to filter out files or folders from the import
|
| * @return the created project
|
| * @throws CoreException
|
| * in case of error
|
| */
|
| public static IProject importPlugin(final Bundle bundle, final IFilter<String> filter) throws CoreException {
|
| final IProject[] project = new IProject[1];
|
| final IWorkspaceRunnable workspaceRunnable = new IWorkspaceRunnable() {
|
| public void run(final IProgressMonitor monitor) throws CoreException {
|
| project[0] = internalImportPlugin(bundle, filter);
|
| }
|
| };
|
| ResourcesPlugin.getWorkspace().run(workspaceRunnable, new NullProgressMonitor());
|
| return project[0];
|
| }
|
|
|
| /**
|
| * This method imports a plug-in in the workspace.
|
| *
|
| * @param bundle
|
| * the bundle to import into a new project
|
| * @param filter
|
| * can be used to filter out files or folders from the import
|
| * @return the created project
|
| * @throws CoreException
|
| * in case of error
|
| */
|
| protected static IProject internalImportPlugin(final Bundle bundle, final IFilter<String> filter) throws CoreException {
|
| final IProject project = createProjectWithUniqueName(bundle.getSymbolicName());
|
| final List<IStatus> errors = new ArrayList<IStatus>();
|
| final List<URL> urls = getURLsToCopy(bundle, project,
|
| "/", filter, errors); //$NON-NLS-1$
|
| for (URL url : urls) {
|
| copyUrlToFile(project, errors, url);
|
| }
|
| handleErrors(errors);
|
| project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
|
| project.build(IncrementalProjectBuilder.CLEAN_BUILD, new NullProgressMonitor());
|
| project.build(IncrementalProjectBuilder.FULL_BUILD, new NullProgressMonitor());
|
| return project;
|
| }
|
|
|
| private static void copyUrlToFile(final IProject project,
|
| final List<IStatus> errors, final URL url) throws CoreException {
|
| try {
|
| final InputStream inputStream = url.openStream();
|
| final String strSubpath = url.toString().replaceAll(
|
| "bundleentry://[^/]*/", ""); //$NON-NLS-1$ //$NON-NLS-2$
|
| final IFile file = project.getFile(new Path(strSubpath));
|
| if (file.exists()) {
|
| file.delete(true, new NullProgressMonitor());
|
| }
|
| final IContainer parent = file.getParent();
|
| if ((!parent.exists()) && parent instanceof IFolder) {
|
| createDir((IFolder) parent);
|
| }
|
| file.create(inputStream, true, new NullProgressMonitor());
|
| inputStream.close();
|
| } catch (FileNotFoundException e) {
|
| /*
|
| * gdupe> We ignore files removed during the execution of
|
| * internalImportPlugin.
|
| */
|
| String message;
|
| try {
|
| message = String.format("Ignoring the missing file %s.", //$NON-NLS-1$
|
| url.toURI());
|
| } catch (URISyntaxException e1) {
|
| message = String.format("Ignoring the missing file."); //$NON-NLS-1$
|
| }
|
| Logger.logError(message, Activator.getDefault());
|
| } catch (IOException e) {
|
| final Bundle localBundle = Activator.getDefault().getBundle();
|
| final String symbolicName = localBundle.getSymbolicName();
|
| final Status status = new Status(IStatus.ERROR, symbolicName,
|
| e.getMessage(), e);
|
| errors.add(status);
|
| }
|
| }
|
|
|
| private static void createDir(final IFolder folder) throws CoreException {
|
| final IContainer parent = folder.getParent();
|
| if ((!parent.exists()) && parent instanceof IFolder) {
|
| createDir((IFolder) parent);
|
| }
|
| folder.create(true, true, new NullProgressMonitor());
|
| }
|
| protected static void handleErrors(final List<IStatus> errors) throws CoreException {
|
| if (!errors.isEmpty()) {
|
| final IStatus[] statusArray = errors.toArray(new IStatus[errors.size()]);
|
| final IStatus status = new MultiStatus(Activator.getDefault().getBundle().getSymbolicName(),
|
| IStatus.ERROR, statusArray, "Errors importing project", new Exception()); //$NON-NLS-1$
|
| throw new CoreException(status);
|
| }
|
| }
|
|
|
| private static List<URL> getURLsToCopy(final Bundle bundle,
|
| final IProject project, final String path,
|
| final IFilter<String> filter, final List<IStatus> errors) {
|
| final List<URL> result = new ArrayList<URL>();
|
| final Enumeration<?> entryPaths = bundle.getEntryPaths(path);
|
| while (entryPaths != null && entryPaths.hasMoreElements()) {
|
| final Object nextElement = entryPaths.nextElement();
|
| if (nextElement instanceof String) {
|
| final String strSubpath = (String) nextElement;
|
| if (filter.filter(strSubpath)) {
|
| // directory
|
| if (strSubpath.endsWith("/")) { //$NON-NLS-1$
|
| final List<URL> fromSubFolder = getURLsToCopy(bundle,
|
| project, strSubpath, filter, errors);
|
| result.addAll(fromSubFolder);
|
| } else {
|
| final URL url = bundle.getEntry(strSubpath);
|
| if (url != null) {
|
| result.add(url);
|
| }
|
| }
|
| }
|
| }
|
| }
|
| return result;
|
| }
|
|
|
| protected static IProject createProjectWithUniqueName(final String baseName) throws CoreException {
|
| final IWorkspace workspace = ResourcesPlugin.getWorkspace();
|
| final IWorkspaceRoot root = workspace.getRoot();
|
| IProject project = root.getProject(baseName);
|
| if (project.exists()) {
|
| int version = 1;
|
| final int maxIter = 100;
|
| while (project.exists() && version < maxIter) {
|
| final String uniqueName = baseName + " (" + version + ')'; //$NON-NLS-1$
|
| project = root.getProject(uniqueName);
|
| version++;
|
| }
|
| }
|
| project.create(new NullProgressMonitor());
|
| project.open(new NullProgressMonitor());
|
| return project;
|
| }
|
| }
|