summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManuel Doninger2012-04-16 03:23:18 (EDT)
committer Steffen Pingel2012-04-16 03:23:18 (EDT)
commita59f2f3798a0864a5b600d4bba64a6e92bfc46e5 (patch)
tree0f54d693ef5a194b43efd0175f8b11706f2259ce
parentc385e7ff9fe91c07dc34c48ebf57c89780666c29 (diff)
downloadorg.eclipse.mylyn.versions-a59f2f3798a0864a5b600d4bba64a6e92bfc46e5.zip
org.eclipse.mylyn.versions-a59f2f3798a0864a5b600d4bba64a6e92bfc46e5.tar.gz
org.eclipse.mylyn.versions-a59f2f3798a0864a5b600d4bba64a6e92bfc46e5.tar.bz2
NEW - bug 376271: [api] provide import and export functionality for team
project sets (PSF files) https://bugs.eclipse.org/bugs/show_bug.cgi?id=376271
-rw-r--r--org.eclipse.mylyn.versions.core/src/org/eclipse/mylyn/versions/core/ProjectSetConverter.java177
1 files changed, 177 insertions, 0 deletions
diff --git a/org.eclipse.mylyn.versions.core/src/org/eclipse/mylyn/versions/core/ProjectSetConverter.java b/org.eclipse.mylyn.versions.core/src/org/eclipse/mylyn/versions/core/ProjectSetConverter.java
new file mode 100644
index 0000000..141ecf6
--- /dev/null
+++ b/org.eclipse.mylyn.versions.core/src/org/eclipse/mylyn/versions/core/ProjectSetConverter.java
@@ -0,0 +1,177 @@
+/*******************************************************************************
+ * 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ * Manuel Doninger - fixes for bug 376271
+ *******************************************************************************/
+
+package org.eclipse.mylyn.versions.core;
+
+import java.io.BufferedWriter;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.XmlMemento;
+import org.eclipse.mylyn.internal.versions.core.ScmInternal;
+import org.eclipse.team.core.ProjectSetCapability;
+import org.eclipse.team.core.RepositoryProvider;
+import org.eclipse.team.core.RepositoryProviderType;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * Provides support for importing and exporting team project sets.
+ *
+ * @author Manuel Doninger
+ */
+public class ProjectSetConverter {
+
+ /**
+ * Returns a team project set for <code>projects</code>.
+ *
+ * @param projects
+ * the projects to include
+ * @return an XML document
+ * @throws CoreException
+ * indicates that the team project set could not be created
+ */
+ public static ByteArrayOutputStream exportProjectSet(List<IProject> projects) throws CoreException {
+ Map<String, Set<IProject>> map = new HashMap<String, Set<IProject>>();
+ for (IProject project : projects) {
+ RepositoryProvider provider = RepositoryProvider.getProvider(project);
+ if (provider != null) {
+ String id = provider.getID();
+ Set<IProject> list = map.get(id);
+ if (list == null) {
+ list = new TreeSet<IProject>(new Comparator<IProject>() {
+ public int compare(IProject o1, IProject o2) {
+ return o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase());
+ }
+ });
+ map.put(id, list);
+ }
+ list.add(project);
+ }
+ }
+
+ BufferedWriter writer = null;
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ try {
+ writer = new BufferedWriter(new OutputStreamWriter(output, "UTF-8")); //$NON-NLS-1$
+
+ XmlMemento xmlMemento = getXMLMementoRoot();
+ Iterator<String> it = map.keySet().iterator();
+ while (it.hasNext()) {
+ String id = it.next();
+ XmlMemento memento = xmlMemento.createChild("provider"); //$NON-NLS-1$
+ memento.putString("id", id); //$NON-NLS-1$
+ Set<IProject> list = map.get(id);
+ IProject[] projectArray = list.toArray(new IProject[list.size()]);
+ RepositoryProviderType providerType = RepositoryProviderType.getProviderType(id);
+ ProjectSetCapability serializer = providerType.getProjectSetCapability();
+ ProjectSetCapability.ensureBackwardsCompatible(providerType, serializer);
+ if (serializer != null) {
+ String[] references = serializer.asReference(projectArray, null, null);
+ for (String reference : references) {
+ XmlMemento proj = memento.createChild("project"); //$NON-NLS-1$
+ proj.putString("reference", reference); //$NON-NLS-1$
+ }
+ }
+ }
+
+ xmlMemento.save(writer);
+ return output;
+ } catch (Exception e) {
+ throw new CoreException(new Status(IStatus.ERROR, ScmInternal.ID_PLUGIN,
+ "Unexpected error exporting project sets.", e)); //$NON-NLS-1$
+ } finally {
+ if (writer != null) {
+ try {
+ writer.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns a list of project names referenced in the team project set <code>input</code> for the provider
+ * <code>prooviderType</code>.
+ *
+ * @throws CoreException
+ */
+ public static List<String> readProjectReferences(InputStream input, RepositoryProviderType providerType)
+ throws CoreException {
+ try {
+ List<String> referenceStrings = new ArrayList<String>();
+ XmlMemento[] providers = importProjectSet(input);
+ for (XmlMemento provider : providers) {
+ if (provider.getString("id").equals(providerType.getID())) { //$NON-NLS-1$
+ XmlMemento[] projects = provider.getChildren("project"); //$NON-NLS-1$
+ for (XmlMemento project : projects) {
+ referenceStrings.add(project.getString("reference")); //$NON-NLS-1$
+ }
+ }
+ }
+ return referenceStrings;
+ } catch (Exception e) {
+ throw new CoreException(new Status(IStatus.ERROR, ScmInternal.ID_PLUGIN,
+ "Unexpected error reading project sets.", e)); //$NON-NLS-1$
+ }
+ }
+
+ private static XmlMemento getXMLMementoRoot() throws ParserConfigurationException {
+ Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
+ Element element = document.createElement("psf"); //$NON-NLS-1$
+ element.setAttribute("version", "2.0"); //$NON-NLS-1$ //$NON-NLS-2$
+ document.appendChild(element);
+ return new XmlMemento(document, element);
+ }
+
+ private static XmlMemento[] importProjectSet(InputStream input) throws UnsupportedEncodingException,
+ InvocationTargetException {
+ XmlMemento xmlMemento = parseStream(input);
+ return xmlMemento.getChildren("provider"); //$NON-NLS-1$
+ }
+
+ private static XmlMemento parseStream(InputStream input) throws InvocationTargetException,
+ UnsupportedEncodingException {
+ InputStreamReader reader = new InputStreamReader(input, "UTF-8"); //$NON-NLS-1$
+ try {
+ return XmlMemento.createReadRoot(reader);
+ } finally {
+ try {
+ reader.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ }
+
+}