diff options
author | Tomasz Zarna | 2011-02-22 16:50:58 +0000 |
---|---|---|
committer | Tomasz Zarna | 2011-02-22 16:50:58 +0000 |
commit | e84b9443d953fa1b0a72fc3d49e5a4a04c2114b6 (patch) | |
tree | 9a035245fe7bca0559ce6d957f70bc1ca5f3dbd2 /bundles/org.eclipse.team.core/src/org | |
parent | 6f0c2d32b065cc58829803e09272e60981d93486 (diff) | |
download | eclipse.platform.team-e84b9443d953fa1b0a72fc3d49e5a4a04c2114b6.tar.gz eclipse.platform.team-e84b9443d953fa1b0a72fc3d49e5a4a04c2114b6.tar.xz eclipse.platform.team-e84b9443d953fa1b0a72fc3d49e5a4a04c2114b6.zip |
bug 330490: API and UI to configure SCM URLs for import -- Team part
Diffstat (limited to 'bundles/org.eclipse.team.core/src/org')
8 files changed, 495 insertions, 2 deletions
diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/ScmUrlImportDescription.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/ScmUrlImportDescription.java new file mode 100644 index 000000000..34d29ffcd --- /dev/null +++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/ScmUrlImportDescription.java @@ -0,0 +1,99 @@ +/******************************************************************************* + * Copyright (c) 2011 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.team.core; + +import java.net.URI; +import java.util.HashMap; + +/** + * Describes how a bundle import will be executed. A bundle importer delegate + * creates bundle import descriptions when it validates bundle manifests for + * importing. The result, a set of bundle import descriptions is then passed to + * TeamUI, which basing on the info from the descriptions instantiate and + * initialize IScmUrlImportWizardPage pages. The pages can be used to alter the + * default import configuration e.g. for bundles stored in a CVS repository the + * user may want to check out HEAD rather than a specific version. + * <p> + * <strong>EXPERIMENTAL</strong>. This class has been added as part of a work in + * progress. There is no guarantee that this API will work or that it will + * remain the same. Please do not use this API without consulting with the Team + * team. + * + * @since 3.6 + */ +public class ScmUrlImportDescription { + private String url; + private String project; + private HashMap properties; + + public ScmUrlImportDescription(String url, String project) { + this.url = url; + this.project = project; + } + + /** + * @return project name + */ + public String getProject() { + return project; + } + + /** + * SCM URL + * + * @return a string representation of the SCM URL + */ + public String getUrl() { + return url; + } + + public URI getUri() { + return URI.create(url.replaceAll("\"", "")); //$NON-NLS-1$//$NON-NLS-2$ + } + + public void setUrl(String url) { + this.url = url; + } + + /** + * Sets or removes a client property. + * + * @param key + * property key + * @param value + * property value or <code>null</code> to remove the property + */ + public synchronized void setProperty(String key, Object value) { + if (properties == null) { + properties = new HashMap(); + } + if (value == null) { + properties.remove(key); + } else { + properties.put(key, value); + } + + } + + /** + * Returns the specified client property, or <code>null</code> if none. + * + * @param key + * property key + * @return property value or <code>null</code> + */ + public synchronized Object getProperty(String key) { + if (properties == null) { + return null; + } + return properties.get(key); + } +} diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/Team.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/Team.java index 1def5fd34..188d28588 100644 --- a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/Team.java +++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/Team.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2010 IBM Corporation and others. + * Copyright (c) 2000, 2011 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 @@ -18,8 +18,10 @@ import org.eclipse.core.resources.*; import org.eclipse.core.runtime.*; import org.eclipse.core.runtime.Preferences.PropertyChangeEvent; import org.eclipse.core.runtime.content.IContentType; +import org.eclipse.team.core.importing.provisional.IBundleImporter; import org.eclipse.team.core.mapping.IStorageMerger; import org.eclipse.team.internal.core.*; +import org.eclipse.team.internal.core.importing.BundleImporterExtension; /** * The Team class provides a global point of reference for the global ignore set @@ -63,6 +65,8 @@ public final class Team { private final static FileContentManager fFileContentManager; + private static List fBundleImporters; + static { fFileContentManager= new FileContentManager(); } @@ -523,4 +527,31 @@ public final class Team { public IStorageMerger createStorageMerger(String extension) { return createMerger(extension); } + + /** + * Returns the available bundle importers. + * + * <p> + * <strong>EXPERIMENTAL</strong>. This interface has been added as part of a + * work in progress. There is no guarantee that this API will work or that + * it will remain the same. Please do not use this API without consulting + * with the Team team. + * </p> + * + * @return IBundleImporter[] returns the available bundle importers + * @since 3.6 + */ + public synchronized static IBundleImporter[] getBundleImporters() { + if (fBundleImporters == null) { + fBundleImporters = new ArrayList(); + IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(TeamPlugin.EXTENSION_POINT_BUNDLE_IMPORTERS); + if (point != null) { + IConfigurationElement[] infos = point.getConfigurationElements(); + for (int i = 0; i < infos.length; i++) { + fBundleImporters.add(new BundleImporterExtension(infos[i])); + } + } + } + return (IBundleImporter[]) fBundleImporters.toArray(new IBundleImporter[fBundleImporters.size()]); + } } diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/importing/provisional/BundleImporterDelegate.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/importing/provisional/BundleImporterDelegate.java new file mode 100644 index 000000000..64805d6a7 --- /dev/null +++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/importing/provisional/BundleImporterDelegate.java @@ -0,0 +1,105 @@ +/******************************************************************************* + * Copyright (c) 2011 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.team.core.importing.provisional; + +import java.util.*; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.*; +import org.eclipse.osgi.util.ManifestElement; +import org.eclipse.team.core.*; +import org.eclipse.team.internal.core.TeamPlugin; +import org.osgi.framework.BundleException; +import org.osgi.framework.Constants; + +/** + * Abstract implementation of {@link IBundleImporterDelegate}. It is recommended + * to subclass this class rather than implementing IBundleImporterDelegate + * directly when providing importer delegates. + * <p> + * <strong>EXPERIMENTAL</strong>. This interface has been added as part of a + * work in progress. There is no guarantee that this API will work or that it + * will remain the same. Please do not use this API without consulting with the + * Team team. + * </p> + * + * @since 3.6 + */ +public abstract class BundleImporterDelegate implements IBundleImporterDelegate { + + private static final String ATTR_PROJECT = "project"; //$NON-NLS-1$ + + public static final String ECLIPSE_SOURCE_REFERENCES = "Eclipse-SourceReferences"; //$NON-NLS-1$ + + protected abstract Set getSupportedValues(); + + protected abstract RepositoryProviderType getProviderType(); + + /* (non-Javadoc) + * @see org.eclipse.pde.core.project.IBundleImporterDelegate#validateImport(java.util.Map[]) + */ + public ScmUrlImportDescription[] validateImport(Map[] manifests) { + ScmUrlImportDescription[] results = new ScmUrlImportDescription[manifests.length]; + if (getProviderType() != null) { + for (int i = 0; i < manifests.length; i++) { + Map manifest = manifests[i]; + String value = (String) manifest.get(ECLIPSE_SOURCE_REFERENCES); + if (value != null && value.length() > 8) { + String prefix = value.substring(0, 8); + if (getSupportedValues().contains(prefix)) { + try { + ManifestElement[] elements = ManifestElement.parseHeader(ECLIPSE_SOURCE_REFERENCES, value); + for (int j = 0; j < elements.length; j++) { + ManifestElement element = elements[j]; + String url = element.toString(); + String project = element.getAttribute(ATTR_PROJECT); + if (project == null) { + String bsn = (String) manifests[i].get(Constants.BUNDLE_SYMBOLICNAME); + if (bsn != null) { + ManifestElement[] bsnElement = ManifestElement.parseHeader(Constants.BUNDLE_SYMBOLICNAME, bsn); + project = bsnElement[0].getValue(); + } + } + results[i] = new ScmUrlImportDescription(url, project); + } + } catch (BundleException e) { + TeamPlugin.log(IStatus.ERROR, "An exception occured while parsing a manifest header", e);//$NON-NLS-1$ + } + } + } + } + } + return results; + } + + /* (non-Javadoc) + * @see org.eclipse.pde.core.importing.IBundleImporterDelegate#performImport(org.eclipse.pde.core.importing.BundleImportDescription[], org.eclipse.core.runtime.IProgressMonitor) + */ + public IProject[] performImport(ScmUrlImportDescription[] descriptions, IProgressMonitor monitor) throws CoreException { + List references = new ArrayList(); + ProjectSetCapability psfCapability = getProviderType().getProjectSetCapability(); + IProject[] result = null; + if (psfCapability != null) { + // collect and validate all header values + for (int i = 0; i < descriptions.length; i++) { + ScmUrlImportDescription description = (ScmUrlImportDescription) descriptions[i]; + references.add(psfCapability.asReference(description.getUri(), description.getProject())); + } + // create projects + if (!references.isEmpty()) { + SubMonitor subMonitor = SubMonitor.convert(monitor, references.size()); + result = psfCapability.addToWorkspace((String[]) references.toArray(new String[references.size()]), new ProjectSetSerializationContext(), subMonitor); + subMonitor.done(); + } + } + return result; + } +} diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/importing/provisional/IBundleImporter.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/importing/provisional/IBundleImporter.java new file mode 100644 index 000000000..d370fbe2f --- /dev/null +++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/importing/provisional/IBundleImporter.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * Copyright (c) 2011 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.team.core.importing.provisional; + + +/** + * A bundle importer represents an instance of a bundle importer extension. + * Clients contributing a bundle importer extension contribute an implementation + * of {@link IBundleImporterDelegate} rather than this interface. + * <p> + * Clients contributing a bundle importer extension are intended to implement + * {@link IBundleImporterDelegate}. + * </p> + * <p> + * <strong>EXPERIMENTAL</strong>. This interface has been added as part of a + * work in progress. There is no guarantee that this API will work or that it + * will remain the same. Please do not use this API without consulting with the + * Team team. + * </p> + * + * @since 3.6 + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. + */ +public interface IBundleImporter extends IBundleImporterDelegate { + + /** + * Returns this impoter's unique identifier. + * + * @return identifier + */ + public String getId(); + + /** + * Returns a short description of this importer, or <code>null</code> if unspecified. + * + * @return description or <code>null</code> + */ + public String getDescription(); + + /** + * Returns a human readable name for this importer. + * + * @return name + */ + public String getName(); +} diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/importing/provisional/IBundleImporterDelegate.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/importing/provisional/IBundleImporterDelegate.java new file mode 100644 index 000000000..38eb22531 --- /dev/null +++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/importing/provisional/IBundleImporterDelegate.java @@ -0,0 +1,83 @@ +/******************************************************************************* + * Copyright (c) 2011 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.team.core.importing.provisional; + +import java.util.Map; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.core.ScmUrlImportDescription; + +/** + * A bundle importer delegate is contributed by a bundle importer extension and + * is capable of importing projects into the workspace from a repository based + * on bundle manifest entries. + * <p> + * Following is an example extension: + * + * <pre> + * <extension point="org.eclipse.team.core.bundleImporters"> + * <importer + * id="com.example.ExampleIdentifier" + * class="com.example.ExampleBundleImporterDelegate"> + * </importer> + * </extension> + * </pre> + * + * </p> + * <p> + * Clients contributing bundle importer extensions are intended to implement + * this interface. They can also subclass {@link BundleImporterDelegate}. + * </p> + * <p> + * <strong>EXPERIMENTAL</strong>. This interface has been added as part of a + * work in progress. There is no guarantee that this API will work or that it + * will remain the same. Please do not use this API without consulting with the + * Team team. + * </p> + * + * @since 3.6 + * @noextend This interface is not intended to be extended by clients. + */ +public interface IBundleImporterDelegate { + + /** + * Returns an array of objects describing how each given bundle (manifest + * headers and values) can be imported into a workspace project. A + * <code>null</code> entry in the returned array indicates the corresponding + * bundle cannot be imported by this delegate. + * + * @param manifests + * array of maps containing manifest headers and values of the + * associated bundles + * @return array of bundle import descriptions that may contain + * <code>null</code> entries + */ + public ScmUrlImportDescription[] validateImport(Map[] manifests); + + /** + * Imports bundles into the workspace creating a project for each import + * description. Reports progress to the given monitor, if not + * <code>null</code>. + * + * @param descriptions + * description of bundles to import + * @param monitor + * progress monitor or <code>null</code> + * @return collection of projects created in the workspace or + * <code>null</code> if none + * @throws CoreException + * if unable to import projects + */ + public IProject[] performImport(ScmUrlImportDescription[] descriptions, + IProgressMonitor monitor) throws CoreException; +} diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/importing/provisional/package.html b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/importing/provisional/package.html new file mode 100644 index 000000000..de35fa2d6 --- /dev/null +++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/importing/provisional/package.html @@ -0,0 +1,23 @@ +<!doctype html public "-//w3c//dtd html 4.0 transitional//en"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> + <meta name="Author" content="IBM"> + <title>Package-level Javadoc</title> +</head> +<body> +Application programming interfaces for importing projects into the workspace. +<h2> +Package Specification</h2> +<p> +Provides support for importing projects into the workspace from a repository. +</p> +<p> +A bundle manifest may contain information identifying source code for the bundle +or a project in a repository associated with the bundle. Clients may contribute +implementations of <code>org.eclipse.team.core.importing.provisional.IBundleImporter</code> +to the <code>org.eclipse.team.core.bundleImporters</code> extension point to participate +in the import of bundles into workspace projects based on bundle manifests. +</p> +</body> +</html> diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/TeamPlugin.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/TeamPlugin.java index 4c729c20d..aa898e74f 100644 --- a/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/TeamPlugin.java +++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/TeamPlugin.java @@ -55,7 +55,10 @@ final public class TeamPlugin extends Plugin { // The id used to associate a provider with a project public final static QualifiedName PROVIDER_PROP_KEY = new QualifiedName("org.eclipse.team.core", "repository"); //$NON-NLS-1$ //$NON-NLS-2$ - + + // The id for the Bundle Import extension point + public static final String EXTENSION_POINT_BUNDLE_IMPORTERS = ID + ".bundleImporters"; //$NON-NLS-1$ + // The one and only plug-in instance private static TeamPlugin plugin; diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/importing/BundleImporterExtension.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/importing/BundleImporterExtension.java new file mode 100644 index 000000000..eb27bb5fc --- /dev/null +++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/importing/BundleImporterExtension.java @@ -0,0 +1,94 @@ +/******************************************************************************* + * Copyright (c) 2011 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.team.internal.core.importing; + +import java.util.Map; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.*; +import org.eclipse.team.core.ScmUrlImportDescription; +import org.eclipse.team.core.importing.provisional.IBundleImporter; +import org.eclipse.team.core.importing.provisional.IBundleImporterDelegate; +import org.eclipse.team.internal.core.TeamPlugin; + +/** + * A bundle importer extension. + * + * @since 3.7 + */ +public class BundleImporterExtension implements IBundleImporter { + + private IBundleImporterDelegate delegate; + private IConfigurationElement element; + + /** + * Constructs a bundle importer extension on the given element. + * + * @param element contribution + */ + public BundleImporterExtension(IConfigurationElement element) { + this.element = element; + } + + /* (non-Javadoc) + * @see org.eclipse.pde.core.project.IBundleImporterDelegate#validateImport(java.util.Map[]) + */ + public ScmUrlImportDescription[] validateImport(Map[] manifests) { + try { + return getDelegate().validateImport(manifests); + } catch (CoreException e) { + TeamPlugin.log(e); + return null; + } + } + + /** + * Returns underlying delegate. + * + * @return delegate + * @exception CoreException if unable to instantiate delegate + */ + private synchronized IBundleImporterDelegate getDelegate() throws CoreException { + if (delegate == null) { + delegate = (IBundleImporterDelegate) element.createExecutableExtension("class"); //$NON-NLS-1$ + } + return delegate; + } + + /* (non-Javadoc) + * @see org.eclipse.pde.core.importing.IBundleImporterDelegate#performImport(org.eclipse.pde.core.importing.BundleImportDescription[], org.eclipse.core.runtime.IProgressMonitor) + */ + public IProject[] performImport(ScmUrlImportDescription[] descriptions, IProgressMonitor monitor) throws CoreException { + return getDelegate().performImport(descriptions, monitor); + } + + /* (non-Javadoc) + * @see org.eclipse.pde.core.project.IBundleImporter#getId() + */ + public String getId() { + return element.getAttribute("id"); //$NON-NLS-1$ + } + + /* (non-Javadoc) + * @see org.eclipse.pde.core.project.IBundleImporter#getDescription() + */ + public String getDescription() { + return element.getAttribute("description"); //$NON-NLS-1$ + } + + /* (non-Javadoc) + * @see org.eclipse.pde.core.project.IBundleImporter#getName() + */ + public String getName() { + return element.getAttribute("name"); //$NON-NLS-1$ + } + +} |