blob: 2ad1cb778bdcfe4807c781a3abe518a97caf5591 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 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
* Red Hat Inc. - Bug 460967
*******************************************************************************/
package org.eclipse.equinox.p2.internal.repository.tools.tasks;
import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.*;
import org.apache.tools.ant.*;
import org.apache.tools.ant.types.FileSet;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.URIUtil;
import org.eclipse.equinox.internal.p2.artifact.repository.Activator;
import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper;
import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.equinox.p2.internal.repository.tools.*;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.query.IQuery;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
import org.eclipse.osgi.util.NLS;
public abstract class AbstractRepositoryTask extends Task {
protected static final String ANT_PREFIX = "${"; //$NON-NLS-1$
protected AbstractApplication application;
protected List<IUDescription> iuTasks = new ArrayList<>();
protected List<FileSet> sourceRepos = new ArrayList<>();
protected List<DestinationRepository> destinations = new ArrayList<>();
protected void addMetadataSourceRepository(URI repoLocation, boolean optional) {
RepositoryDescriptor source = new RepositoryDescriptor();
source.setLocation(repoLocation);
source.setKind(RepositoryDescriptor.KIND_METADATA);
source.setOptional(optional);
application.addSource(source);
}
protected void addArtifactSourceRepository(URI repoLocation, boolean optional) {
RepositoryDescriptor source = new RepositoryDescriptor();
source.setLocation(repoLocation);
source.setKind(RepositoryDescriptor.KIND_ARTIFACT);
source.setOptional(optional);
application.addSource(source);
}
/*
* Create an object to hold IU information since the user specified an "iu" sub-element.
*/
public Object createIu() {
IUDescription iu = new IUDescription();
iuTasks.add(iu);
return iu;
}
/*
* If the repositories are co-located then the user just has to set one
* argument to specify both the artifact and metadata repositories.
*/
public void setSource(String location) {
RepositoryDescriptor source = new RepositoryDescriptor();
try {
source.setLocation(URIUtil.fromString(location));
application.addSource(source);
} catch (URISyntaxException e) {
throw new BuildException(e);
}
}
/*
* If the repositories are co-located then the user just has to set one
* argument to specify both the artifact and metadata repositories.
*/
public void setDestination(String location) {
// TODO depreciate
DestinationRepository dest = new DestinationRepository();
dest.setLocation(location);
destinations.add(dest);
application.addDestination(dest.getDescriptor());
}
public DestinationRepository createDestination() {
// TODO depreciate
DestinationRepository destination = new DestinationRepository();
destinations.add(destination);
application.addDestination(destination.getDescriptor());
return destination;
}
/*
* Add a repository to mirror into
*/
public DestinationRepository createRepository() {
DestinationRepository destination = new DestinationRepository();
destinations.add(destination);
application.addDestination(destination.getDescriptor());
return destination;
}
/*
* Return the provisioning agent. Throw an exception if it cannot be obtained.
*/
public static IProvisioningAgent getAgent() throws BuildException {
IProvisioningAgent agent = ServiceHelper.getService(Activator.getContext(), IProvisioningAgent.class);
if (agent == null)
throw new BuildException(Messages.no_provisioning_agent);
return agent;
}
/*
* Add source repositories to mirror from
*/
public void addConfiguredSource(RepositoryList sourceList) {
for (DestinationRepository repo : sourceList.getRepositoryList()) {
application.addSource(repo.getDescriptor());
}
for (FileSet fileSet : sourceList.getFileSetList()) {
sourceRepos.add(fileSet);
// Added to the application later through prepareSourceRepos
}
}
/*
* If the user specified some source repositories via sub-elements
* then add them to the transformer for consideration.
*/
protected void prepareSourceRepos() {
if (sourceRepos == null || sourceRepos.isEmpty())
return;
for (Iterator<FileSet> iter = sourceRepos.iterator(); iter.hasNext();) {
RepositoryFileSet fileset = (RepositoryFileSet) iter.next();
if (fileset.getRepoLocation() != null) {
if (!fileset.getRepoLocation().startsWith(ANT_PREFIX)) {
if (fileset.isArtifact())
addArtifactSourceRepository(fileset.getRepoLocationURI(), fileset.isOptional());
if (fileset.isMetadata())
addMetadataSourceRepository(fileset.getRepoLocationURI(), fileset.isOptional());
}
} else if (fileset.getDir() != null) {
DirectoryScanner scanner = fileset.getDirectoryScanner(getProject());
String[][] elements = new String[][] {scanner.getIncludedDirectories(), scanner.getIncludedFiles()};
for (int i = 0; i < 2; i++) {
for (String element : elements[i]) {
File file = new File(fileset.getDir(), element);
URI uri = file.toURI();
if (file.isFile() && file.getName().endsWith(".zip")) { //$NON-NLS-1$
uri = URIUtil.toJarURI(uri, null);
}
if (fileset.isBoth()) {
addArtifactSourceRepository(uri, fileset.isOptional());
addMetadataSourceRepository(uri, fileset.isOptional());
} else if (fileset.isArtifact())
addArtifactSourceRepository(uri, fileset.isOptional());
else if (fileset.isMetadata())
addMetadataSourceRepository(uri, fileset.isOptional());
else
throw new BuildException(NLS.bind(Messages.unknown_repository_type, uri));
}
}
}
}
sourceRepos.clear();
}
protected List<IInstallableUnit> prepareIUs() {
if (iuTasks == null || iuTasks.isEmpty())
return null;
IMetadataRepository repository = application.getCompositeMetadataRepository();
List<IInstallableUnit> result = new ArrayList<>();
for (IUDescription iu : iuTasks) {
IQuery<IInstallableUnit> iuQuery = iu.createQuery();
Iterator<IInstallableUnit> queryResult = repository.query(iuQuery, null).iterator();
if (iu.isRequired() && !queryResult.hasNext())
throw new BuildException(NLS.bind(Messages.AbstractRepositoryTask_unableToFind, iu.toString()));
while (queryResult.hasNext())
result.add(queryResult.next());
}
return result;
}
protected void log(IStatus status) {
try {
new AntMirrorLog(this).log(status);
} catch (NoSuchMethodException e) {
// Shouldn't occur
}
}
}