package aQute.bnd.jpm;
import java.io.File;
import java.util.HashSet;
import java.util.Set;
import java.util.SortedSet;
import java.util.concurrent.Semaphore;
import aQute.bnd.service.RepositoryPlugin;
import aQute.bnd.service.RepositoryPlugin.DownloadListener;
import aQute.bnd.version.Version;
public class Crawler extends Thread {
boolean quit;
private Repository repository;
private Set<String> dls = new HashSet<>();
private Set<String> fails = new HashSet<>();
private Semaphore throttle = new Semaphore(2);
public Crawler(Repository repository) {
super(repository.getName());
super.setDaemon(true);
this.repository = repository;
}
public void run() {
outer: while (!quit)
try {
if (!repository.offline) {
for (String bsn : repository.list(null)) {
SortedSet<Version> versions = repository.versions(bsn);
for (Version version : versions) {
final String key = bsn + "-" + version;
if (dls.contains(key))
continue;
throttle.acquire();
DownloadListener dl = new RepositoryPlugin.DownloadListener() {
@Override
public void success(File file) throws Exception {
throttle.release();
dls.remove(key);
}
@Override
public void failure(File file, String reason) throws Exception {
throttle.release();
fails.add(key);
dls.remove(key);
}
@Override
public boolean progress(File file, int percentage) throws Exception {
return false;
}
};
if (!dls.contains(key)) {
dls.add(key);
repository.get(bsn, version, null, dl);
}
if (interrupted())
continue outer;
if (repository.offline)
continue outer;
}
}
}
Thread.sleep(500000);
} catch (Exception e) {
e.printStackTrace();
try {
Thread.sleep(5000);
} catch (InterruptedException e1) {}
}
}
public void close() {
quit = true;
interrupt();
}
public void refresh() {
interrupt();
}
}