Copyright (c) 2011, 2017 IBM Corporation and others.
This program and the accompanying materials
are made available under the terms of the Eclipse Public License 2.0
which accompanies this distribution, and is available at
https://www.eclipse.org/legal/epl-2.0/
SPDX-License-Identifier: EPL-2.0
Contributors:
IBM Corporation - initial API and implementation
/*******************************************************************************
* Copyright (c) 2011, 2017 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.team.core.importing.provisional;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.osgi.util.ManifestElement;
import org.eclipse.team.core.ProjectSetCapability;
import org.eclipse.team.core.ProjectSetSerializationContext;
import org.eclipse.team.core.RepositoryProviderType;
import org.eclipse.team.core.ScmUrlImportDescription;
import org.eclipse.team.internal.core.TeamPlugin;
import org.osgi.framework.BundleException;
import org.osgi.framework.Constants;
Abstract implementation of IBundleImporterDelegate
. It is recommended to subclass this class rather than implementing IBundleImporterDelegate directly when providing importer delegates.
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
Team team.
Since: 3.6
/**
* 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();
@Override
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 (ManifestElement element : elements) {
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;
}
@Override
public IProject[] performImport(ScmUrlImportDescription[] descriptions, IProgressMonitor monitor) throws CoreException {
List<String> references = new ArrayList<>();
ProjectSetCapability psfCapability = getProviderType().getProjectSetCapability();
IProject[] result = null;
if (psfCapability != null) {
// collect and validate all header values
for (ScmUrlImportDescription description : descriptions) {
references.add(psfCapability.asReference(description.getUri(), description.getProject()));
}
// create projects
if (!references.isEmpty()) {
SubMonitor subMonitor = SubMonitor.convert(monitor, references.size());
result = psfCapability.addToWorkspace(references.toArray(new String[references.size()]), new ProjectSetSerializationContext(), subMonitor);
subMonitor.done();
}
}
return result;
}
}