package aQute.bnd.repository.p2.provider;
import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;
import org.osgi.resource.Capability;
import org.osgi.resource.Requirement;
import aQute.bnd.annotation.plugin.BndPlugin;
import aQute.bnd.build.Workspace;
import aQute.bnd.http.HttpClient;
import aQute.bnd.osgi.repository.BaseRepository;
import aQute.bnd.service.Plugin;
import aQute.bnd.service.Refreshable;
import aQute.bnd.service.Registry;
import aQute.bnd.service.RegistryPlugin;
import aQute.bnd.service.RepositoryPlugin;
import aQute.bnd.version.Version;
import aQute.lib.converter.Converter;
import aQute.lib.exceptions.Exceptions;
import aQute.lib.io.IO;
import aQute.service.reporter.Reporter;
/**
* A p2 repository
*/
@BndPlugin(name = "p2", parameters = P2Config.class)
public class P2Repository extends BaseRepository implements Plugin, RegistryPlugin, RepositoryPlugin, Refreshable, Closeable {
private P2Config config;
private Registry registry;
private Workspace workspace;
private P2Indexer p2Index;
private Reporter reporter;
private String name;
@Override
public File get(String bsn, Version version, Map<String,String> properties, DownloadListener... listeners)
throws Exception {
return getP2Index().get(bsn, version, properties, listeners);
}
private synchronized P2Indexer getP2Index() {
if (p2Index != null)
return p2Index;
return p2Index = getP2Index0();
}
P2Indexer getP2Index0() {
this.workspace = registry.getPlugin(Workspace.class);
HttpClient client = registry.getPlugin(HttpClient.class);
URI url = config.url();
if (url == null)
throw new IllegalArgumentException("For a p2 repository you must set the url parameter to the repository");
try {
name = config.name(client.toName(url));
File location = workspace.getFile(config.location("cnf/cache/p2-" + name));
IO.mkdirs(location);
File indexFile = new File(location, "index.xml.gz");
return new P2Indexer(reporter, location, client, url, name);
} catch (Exception e) {
throw Exceptions.duck(e);
}
}
@Override
public boolean canWrite() {
return false;
}
@Override
public List<String> list(String pattern) throws Exception {
return getP2Index().list(pattern);
}
@Override
public SortedSet<Version> versions(String bsn) throws Exception {
return getP2Index().versions(bsn);
}
@Override
public String getName() {
return name;
}
@Override
public String getLocation() {
return getP2Index().location.getPath();
}
@Override
public void setProperties(Map<String,String> map) throws Exception {
this.config = Converter.cnv(P2Config.class, map);
this.name = this.config.name("p2-" + config.url());
}
@Override
public void setReporter(Reporter reporter) {
this.reporter = reporter;
}
@Override
public void setRegistry(Registry registry) {
this.registry = registry;
}
@Override
public boolean refresh() throws Exception {
getP2Index().refresh();
return true;
}
@Override
public Map<Requirement,Collection<Capability>> findProviders(Collection< ? extends Requirement> requirements) {
return getP2Index().getBridge().getRepository().findProviders(requirements);
}
@Override
public File getRoot() throws Exception {
return getP2Index().location;
}
@Override
public PutResult put(InputStream stream, PutOptions options) throws Exception {
throw new UnsupportedOperationException("Cannot write to a p2 repo ");
}
@Override
public void close() throws IOException {
IO.close(p2Index);
}
@Override
public String toString() {
return "P2Repository [" + getName() + "]";
}
}