From 1d90145e4d497190850b3a257132c9931f2775fc Mon Sep 17 00:00:00 2001
From: Tomasz Zarna
Date: Mon, 7 Feb 2011 16:52:49 +0000
Subject: bug 330490: API and UI to configure SCM URLs for import -- Fix v03
from Ankur
---
bundles/org.eclipse.team.core/META-INF/MANIFEST.MF | 2 +
bundles/org.eclipse.team.core/build.properties | 3 +-
bundles/org.eclipse.team.core/plugin.properties | 4 +-
bundles/org.eclipse.team.core/plugin.xml | 11 +-
.../schema/bundleImporters.exsd | 156 +++++++++++++++++++++
.../eclipse/team/core/ScmUrlImportDescription.java | 35 ++++-
.../src/org/eclipse/team/core/Team.java | 22 +++
.../importing/provisional/IBundleImporter.java | 48 +++++++
.../provisional/IBundleImporterDelegate.java | 67 +++++++++
.../team/core/importing/provisional/package.html | 23 +++
.../org/eclipse/team/internal/core/TeamPlugin.java | 3 +
.../core/importing/BundleImporterExtension.java | 94 +++++++++++++
.../core/importing/CvsBundleImporterDelegate.java | 123 ++++++++++++++++
13 files changed, 583 insertions(+), 8 deletions(-)
create mode 100644 bundles/org.eclipse.team.core/schema/bundleImporters.exsd
create mode 100644 bundles/org.eclipse.team.core/src/org/eclipse/team/core/importing/provisional/IBundleImporter.java
create mode 100644 bundles/org.eclipse.team.core/src/org/eclipse/team/core/importing/provisional/IBundleImporterDelegate.java
create mode 100644 bundles/org.eclipse.team.core/src/org/eclipse/team/core/importing/provisional/package.html
create mode 100644 bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/importing/BundleImporterExtension.java
create mode 100644 bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/importing/CvsBundleImporterDelegate.java
diff --git a/bundles/org.eclipse.team.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.team.core/META-INF/MANIFEST.MF
index 97cf318db..a5bb7b70e 100644
--- a/bundles/org.eclipse.team.core/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.team.core/META-INF/MANIFEST.MF
@@ -11,6 +11,7 @@ Export-Package: org.eclipse.team.core,
org.eclipse.team.core.diff.provider,
org.eclipse.team.core.history,
org.eclipse.team.core.history.provider,
+ org.eclipse.team.core.importing.provisional;x-friends:="org.eclipse.pde.core",
org.eclipse.team.core.mapping,
org.eclipse.team.core.mapping.provider,
org.eclipse.team.core.subscribers,
@@ -18,6 +19,7 @@ Export-Package: org.eclipse.team.core,
org.eclipse.team.core.variants,
org.eclipse.team.internal.core;x-friends:="org.eclipse.team.cvs.core,org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh2,org.eclipse.team.cvs.ui,org.eclipse.team.ui",
org.eclipse.team.internal.core.history;x-friends:="org.eclipse.team.cvs.core,org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh2,org.eclipse.team.cvs.ui,org.eclipse.team.ui",
+ org.eclipse.team.internal.core.importing;x-friends:="org.eclipse.pde.core",
org.eclipse.team.internal.core.mapping;x-friends:="org.eclipse.team.cvs.core,org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh2,org.eclipse.team.cvs.ui,org.eclipse.team.ui",
org.eclipse.team.internal.core.streams;x-friends:="org.eclipse.team.cvs.core,org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh2,org.eclipse.team.cvs.ui,org.eclipse.team.ui",
org.eclipse.team.internal.core.subscribers;x-friends:="org.eclipse.team.cvs.core,org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh2,org.eclipse.team.cvs.ui,org.eclipse.team.ui"
diff --git a/bundles/org.eclipse.team.core/build.properties b/bundles/org.eclipse.team.core/build.properties
index 59273f4b2..708a62030 100644
--- a/bundles/org.eclipse.team.core/build.properties
+++ b/bundles/org.eclipse.team.core/build.properties
@@ -1,5 +1,5 @@
###############################################################################
-# Copyright (c) 2000, 2006 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
@@ -16,4 +16,5 @@ bin.includes = about.html,\
.options,\
META-INF/
source..=src/
+output.. = bin/
src.includes=about.html,schema/
diff --git a/bundles/org.eclipse.team.core/plugin.properties b/bundles/org.eclipse.team.core/plugin.properties
index 3e550aafc..497dfea6b 100644
--- a/bundles/org.eclipse.team.core/plugin.properties
+++ b/bundles/org.eclipse.team.core/plugin.properties
@@ -1,5 +1,5 @@
###############################################################################
-# Copyright (c) 2000, 2006 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,3 +18,5 @@ Repository=Repository Providers
DefaultValidator=Default File Modification Validator
StorageMergers = Storage Mergers
+expoint.bundleImporters.name = Bundle Importers
+bundleImporter.cvs = CVS Bundle Importer
diff --git a/bundles/org.eclipse.team.core/plugin.xml b/bundles/org.eclipse.team.core/plugin.xml
index 19c19023e..1d58b6d45 100644
--- a/bundles/org.eclipse.team.core/plugin.xml
+++ b/bundles/org.eclipse.team.core/plugin.xml
@@ -8,7 +8,7 @@
null
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 null
if none.
+ *
+ * @param key property key
+ * @return property value or null
+ */
+ 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..67c4275f6 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
@@ -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 fProjectFactories;
+
static {
fFileContentManager= new FileContentManager();
}
@@ -523,4 +527,22 @@ public final class Team {
public IStorageMerger createStorageMerger(String extension) {
return createMerger(extension);
}
+
+ /**
+ * @return IBundleImporter[] returns the available bundle importers
+ * @since 3.6
+ */
+ public synchronized static IBundleImporter[] getBundleImporters() {
+ if (fProjectFactories == null) {
+ fProjectFactories = 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++) {
+ fProjectFactories.add(new BundleImporterExtension(infos[i]));
+ }
+ }
+ }
+ return (IBundleImporter[]) fProjectFactories.toArray(new IBundleImporter[fProjectFactories.size()]);
+ }
}
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..c53a64ae0
--- /dev/null
+++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/importing/provisional/IBundleImporter.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * 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.
+ *
+ * Clients contributing a bundle importer extension are intended to implement + * {@link IBundleImporterDelegate}. + *
+ * @since 3.7 + * @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, ornull
if unspecified.
+ *
+ * @return description or null
+ */
+ 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..b69e40e9b
--- /dev/null
+++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/importing/provisional/IBundleImporterDelegate.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * 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.
+ * + * Following is an example extension: + *
+ * <extension point="org.eclipse.pde.core.bundleImporters"> + * <importer + * id="com.example.ExampleIdentifier" + * class="com.example.ExampleBundleImporterDelegate"> + * </importer> + * </extension> + *+ * + *
+ * Clients contributing bundle importer extensions are intended to implement this interface. + *
+ *+ * EXPERIMENTAL. 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 PDE team. + *
+ * @since 3.7 + * @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. Anull
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 null
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 null
.
+ *
+ * @param descriptions description of bundles to import
+ * @param monitor progress monitor or null
+ * @return collection of projects created in the workspace or null
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..7cecc1194
--- /dev/null
+++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/importing/provisional/package.html
@@ -0,0 +1,23 @@
+
+
+
+
+
+ +Provides support for importing projects into the workspace from a repository. +
+
+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 org.eclipse.tea,.core.importing.provisional.IBundleImporterDelegate
+to the org.eclipse.team.core.bundleImporters
extension point to participate
+in the import of bundles into workspace projects based on bundle manifests.
+
+ * scm:cvs<delimiter><method><delimiter>path_to_repository<delimiter>module_name[;tag=version][;project=name] + * scm:psf<delimiter><method><delimiter>path_to_repository<delimiter>module_name[;tag=version][;project=name] + *+ * @since 3.7 + */ +public class CvsBundleImporterDelegate implements org.eclipse.team.core.importing.provisional.IBundleImporterDelegate { + + private static Set SUPPORTED_VALUES; + + private static final String SCM = "scm:"; //$NON-NLS-1$ + private static final String CVS = "cvs"; //$NON-NLS-1$ +// private static final String PSF = "psf"; //$NON-NLS-1$ + private static final String COLON = ":"; //$NON-NLS-1$ + private static final String PIPE = "|"; //$NON-NLS-1$ + + //private static final String ATTR_TAG = "tag"; //$NON-NLS-1$ + private static final String ATTR_PROJECT = "project"; //$NON-NLS-1$ + + public static final String ECLIPSE_SOURCE_REFERENCES = "Eclipse-SourceReferences"; //$NON-NLS-1$ + + private static RepositoryProviderType CVS_PROVIDER_TYPE = RepositoryProviderType.getProviderType("org.eclipse.team.cvs.core.cvsnature"); //$NON-NLS-1$ + + static { + SUPPORTED_VALUES = new HashSet(); + SUPPORTED_VALUES.add(SCM + CVS + COLON); + SUPPORTED_VALUES.add(SCM + CVS + PIPE); +// SUPPORTED_VALUES.add(SCM + PSF + COLON); +// SUPPORTED_VALUES.add(SCM + PSF + PIPE); + } + + /* (non-Javadoc) + * @see org.eclipse.pde.core.project.IBundleImporterDelegate#validateImport(java.util.Map[]) + */ + public ScmUrlImportDescription[] validateImport(Map[] manifests) { + // TODO: this is not CVS specific, the code is the same for all providers + ScmUrlImportDescription[] results = new ScmUrlImportDescription[manifests.length]; + if (CVS_PROVIDER_TYPE != 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 (SUPPORTED_VALUES.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.getValue(); + //String tag = element.getAttribute(ATTR_TAG); + 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) { + //TODO log exception + //PDECore.log(e); + } + } + } + } + } + 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 { + // TODO: import takes places when finishing contributed pages. this method can be removed + List references = new ArrayList(); + ProjectSetCapability psfCapability = CVS_PROVIDER_TYPE.getProjectSetCapability(); + // 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()); + if (psfCapability != null) { + // TODO: specify shell + psfCapability.addToWorkspace((String[]) references.toArray(new String[references.size()]), new ProjectSetSerializationContext(), subMonitor); + } else { + //TODO: error + } + subMonitor.done(); + } + return null; + } + +} -- cgit v1.2.3