blob: 42a1f53dc92833ab5968619908238b9e619a1ac6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2015 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 - Initial API and implementation
* Red Hat Inc. - Bug 460967
******************************************************************************/
package org.eclipse.equinox.internal.p2.publisher.ant;
import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import org.apache.tools.ant.Task;
import org.eclipse.core.runtime.*;
import org.eclipse.equinox.internal.p2.artifact.repository.CompositeArtifactRepository;
import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper;
import org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepository;
import org.eclipse.equinox.internal.p2.publisher.Messages;
import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.equinox.p2.core.ProvisionException;
import org.eclipse.equinox.p2.metadata.IArtifactKey;
import org.eclipse.equinox.p2.publisher.*;
import org.eclipse.equinox.p2.query.IQueryResult;
import org.eclipse.equinox.p2.query.QueryUtil;
import org.eclipse.equinox.p2.repository.artifact.ArtifactKeyQuery;
import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository;
import org.eclipse.osgi.util.NLS;
import org.eclipse.pde.internal.publishing.Activator;
public abstract class AbstractPublishTask extends Task {
protected static final String ANT_PROPERTY_PREFIX = "${"; //$NON-NLS-1$
/**
* Support nested repository elements that looking something like
* <repo location="file:/foo" metadata="true" artifact="true" />
* Both metadata and artifact are optional:
* 1) if neither are set, the repo is used for both metadata and artifacts
* 2) if only one is true, the repo is that type and not the other
*/
static public class RepoEntry {
private URI repoLocation;
private Boolean metadata = null;
private Boolean artifact = null;
/**
* If not set, default is true if we aren't set as an artifact repo
*/
public boolean isMetadataRepository() {
if (metadata != null)
return metadata.booleanValue();
return !Boolean.TRUE.equals(artifact);
}
/**
* If not set, default is true if we aren't set as a metadata repo
*/
public boolean isArtifactRepository() {
if (artifact != null)
return artifact.booleanValue();
return !Boolean.TRUE.equals(metadata);
}
public URI getRepositoryLocation() {
return repoLocation;
}
public void setLocation(String location) {
try {
repoLocation = URIUtil.fromString(location);
} catch (URISyntaxException e) {
throw new IllegalArgumentException("Repository location (" + location + ") must be a URL."); //$NON-NLS-1$ //$NON-NLS-2$
}
}
public void setMetadata(boolean metadata) {
this.metadata = Boolean.valueOf(metadata);
}
public void setArtifact(boolean artifact) {
this.artifact = Boolean.valueOf(artifact);
}
}
protected boolean compress = false;
protected boolean reusePackedFiles = false;
protected boolean append = true;
protected boolean publish = true;
protected String source = null;
protected URI metadataLocation;
protected String metadataRepoName;
protected URI artifactLocation;
protected String artifactRepoName;
protected PublisherInfo provider = null;
protected List<RepoEntry> contextRepositories = new ArrayList<RepoEntry>();
protected IProvisioningAgent getProvisioningAgent() {
return ServiceHelper.getService(Activator.getContext(), IProvisioningAgent.class);
}
protected IStatus createConfigurationEror(String message) {
return new Status(IStatus.ERROR, "org.eclipse.equinox.p2.publisher", message); //$NON-NLS-1$
}
private boolean isEmpty(IArtifactRepository repo) {
IQueryResult<IArtifactKey> result = repo.query(QueryUtil.createLimitQuery(ArtifactKeyQuery.ALL_KEYS, 1), null);
return result.isEmpty();
}
protected void initializeRepositories(PublisherInfo info) throws ProvisionException {
if (artifactLocation != null) {
IArtifactRepository repo = Publisher.createArtifactRepository(getProvisioningAgent(), artifactLocation, artifactRepoName, compress, reusePackedFiles);
if (!append && !isEmpty(repo)) {
File repoLocation = URIUtil.toFile(artifactLocation);
if (repoLocation != null && source != null) {
if (repoLocation.isFile())
repoLocation = repoLocation.getParentFile();
if (repoLocation.equals(new File(source)))
throw new IllegalArgumentException(NLS.bind(Messages.exception_artifactRepoNoAppendDestroysInput, URIUtil.toUnencodedString(artifactLocation)));
}
repo.removeAll(new NullProgressMonitor());
}
info.setArtifactRepository(repo);
} else if ((info.getArtifactOptions() & IPublisherInfo.A_PUBLISH) > 0)
throw new ProvisionException(createConfigurationEror(Messages.exception_noArtifactRepo));
if (metadataLocation == null)
throw new ProvisionException(createConfigurationEror(Messages.exception_noMetadataRepo));
info.setMetadataRepository(Publisher.createMetadataRepository(getProvisioningAgent(), metadataLocation, metadataRepoName, append, compress));
if (contextRepositories.size() > 0) {
CompositeMetadataRepository contextMetadata = CompositeMetadataRepository.createMemoryComposite(getProvisioningAgent());
CompositeArtifactRepository contextArtifact = CompositeArtifactRepository.createMemoryComposite(getProvisioningAgent());
for (RepoEntry entry : contextRepositories) {
if (contextMetadata != null && entry.isMetadataRepository())
contextMetadata.addChild(entry.getRepositoryLocation());
if (contextArtifact != null && entry.isArtifactRepository())
contextArtifact.addChild(entry.getRepositoryLocation());
}
if (contextMetadata != null && contextMetadata.getChildren().size() > 0)
info.setContextMetadataRepository(contextMetadata);
if (contextArtifact != null && contextArtifact.getChildren().size() > 0)
info.setContextArtifactRepository(contextArtifact);
}
}
protected PublisherInfo getInfo() {
if (provider == null)
provider = new PublisherInfo();
if (publish)
provider.setArtifactOptions(provider.getArtifactOptions() | IPublisherInfo.A_PUBLISH);
return provider;
}
public void setCompress(String value) {
compress = Boolean.parseBoolean(value);
}
public void setReusePackedFiles(String value) {
reusePackedFiles = Boolean.parseBoolean(value);
}
public void setAppend(String value) {
append = Boolean.parseBoolean(value);
}
public void setPublishArtifacts(String value) {
publish = Boolean.parseBoolean(value);
}
public void setArtifactRepository(String location) {
try {
artifactLocation = URIUtil.fromString(location);
} catch (URISyntaxException e) {
throw new IllegalArgumentException("Artifact repository location (" + location + ") must be a URL."); //$NON-NLS-1$//$NON-NLS-2$
}
}
public void setArtifactRepositoryName(String value) {
artifactRepoName = value;
}
public void setMetadataRepository(String location) {
try {
metadataLocation = URIUtil.fromString(location);
} catch (URISyntaxException e) {
throw new IllegalArgumentException("Metadata repository location (" + location + ") must be a URL."); //$NON-NLS-1$ //$NON-NLS-2$
}
}
public void setMetadataRepositoryName(String value) {
metadataRepoName = value;
}
public void setRepository(String location) {
setArtifactRepository(location);
setMetadataRepository(location);
}
public void setRepositoryName(String name) {
setArtifactRepositoryName(name);
setMetadataRepositoryName(name);
}
// nested <contextRepository/> elements
public void addConfiguredContextRepository(RepoEntry repo) {
contextRepositories.add(repo);
}
}