blob: 8d176bd5db8a54d2dded2077a8fa7060b248718f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 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
******************************************************************************/
package org.eclipse.equinox.p2.tests;
import java.io.*;
import java.net.*;
import java.util.HashMap;
import java.util.Map;
import junit.framework.Assert;
import org.eclipse.core.runtime.*;
import org.eclipse.equinox.internal.p2.artifact.repository.ArtifactRequest;
import org.eclipse.equinox.internal.p2.artifact.repository.Transport;
import org.eclipse.equinox.p2.artifact.repository.*;
import org.eclipse.equinox.p2.artifact.repository.processing.ProcessingStepHandler;
import org.eclipse.equinox.p2.core.helpers.MultiStatus;
import org.eclipse.equinox.p2.core.repository.RepositoryCreationException;
import org.eclipse.equinox.p2.metadata.IArtifactKey;
import org.eclipse.equinox.spi.p2.artifact.repository.AbstractArtifactRepository;
/**
* A simple artifact repository implementation used for testing purposes.
* All artifacts are kept in memory.
*/
public class TestArtifactRepository extends AbstractArtifactRepository {
private static final String SCHEME = "testartifactrepo";
private static final String NAME = "ATestArtifactRepository"; //$NON-NLS-1$
private static final String TYPE = "testartifactrepo"; //$NON-NLS-1$
private static final String VERSION = "1"; //$NON-NLS-1$
private static final String PROVIDER = "org.eclipse"; //$NON-NLS-1$
private static final String DESCRIPTION = "A Test Artifact Repository"; //$NON-NLS-1$
/**
* Map of IArtifactKey -> String (location)
*/
Map keysToLocations = new HashMap();
/**
* Map of String (location) -> byte[] (contents)
*/
Map locationsToContents = new HashMap();
Transport testhandler = new Transport() {
public IStatus download(String toDownload, OutputStream target, IProgressMonitor pm) {
byte[] contents = (byte[]) locationsToContents.get(toDownload);
if (contents == null)
Assert.fail("Attempt to download missing artifact in TestArtifactRepository: " + toDownload);
try {
target.write(contents);
} catch (IOException e) {
e.printStackTrace();
Assert.fail("Unexpected exception in TestArtifactRepository" + e.getMessage());
}
return Status.OK_STATUS;
}
};
public TestArtifactRepository() {
super(NAME, TYPE, VERSION, null, DESCRIPTION, PROVIDER);
}
public void addArtifact(IArtifactKey key, byte[] contents) {
String location = key.toString();
keysToLocations.put(key, location);
locationsToContents.put(location, contents);
}
public URI getArtifact(IArtifactKey key) {
String location = (String) keysToLocations.get(key);
if (location == null)
return null;
try {
return new URI(SCHEME, location, null);
} catch (URISyntaxException e) {
Assert.fail("Invalid URI in TestArtifactRepository: " + e.getMessage());
return null;
}
}
public IArtifactKey[] getArtifactKeys() {
return (IArtifactKey[]) keysToLocations.keySet().toArray(new IArtifactKey[0]);
}
private IStatus getArtifact(ArtifactRequest request, IProgressMonitor monitor) {
request.setSourceRepository(this);
request.perform(monitor);
return request.getResult();
}
public IStatus getArtifacts(IArtifactRequest[] requests, IProgressMonitor monitor) {
SubMonitor subMonitor = SubMonitor.convert(monitor, requests.length);
try {
MultiStatus overallStatus = new MultiStatus();
for (int i = 0; i < requests.length; i++) {
overallStatus.add(getArtifact((ArtifactRequest) requests[i], subMonitor.newChild(1)));
}
return (monitor.isCanceled() ? Status.CANCEL_STATUS : overallStatus);
} finally {
subMonitor.done();
}
}
public void initialize(URL repoURL, InputStream descriptorFile) throws RepositoryCreationException {
location = repoURL;
}
public boolean contains(IArtifactDescriptor descriptor) {
return keysToLocations.get(descriptor.getArtifactKey()) != null;
}
public boolean contains(IArtifactKey key) {
return keysToLocations.get(key) != null;
}
public IStatus getArtifact(IArtifactDescriptor descriptor, OutputStream destination, IProgressMonitor monitor) {
ProcessingStepHandler handler = new ProcessingStepHandler();
destination = handler.createAndLink(descriptor.getProcessingSteps(), null, destination, monitor);
testhandler.download((String) keysToLocations.get(descriptor.getArtifactKey()), destination, monitor);
return Status.OK_STATUS;
}
public IArtifactDescriptor[] getArtifactDescriptors(IArtifactKey key) {
if (!contains(key))
return null;
return new IArtifactDescriptor[] {new ArtifactDescriptor(key)};
}
}