blob: 1915ad01a1a566e88affcdca9ad0ba8dd7ebb28f [file] [log] [blame]
/*******************************************************************************
* 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 {@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 (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;
}
@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 (int i = 0; i < descriptions.length; i++) {
ScmUrlImportDescription description = 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(references.toArray(new String[references.size()]), new ProjectSetSerializationContext(), subMonitor);
subMonitor.done();
}
}
return result;
}
}