blob: a8966a41321bb2d18fd1e35f294c541d31ed8bfa [file] [log] [blame]
package aQute.bnd.filerepo;
import java.io.*;
import java.util.*;
import java.util.regex.*;
import aQute.bnd.version.*;
public class FileRepo {
File root;
Pattern REPO_FILE = Pattern.compile("([-a-zA-z0-9_\\.]+)-([0-9\\.]+|latest)\\.(jar|lib)");
public FileRepo(File root) {
this.root = root;
}
/**
* Get a list of URLs to bundles that are constrained by the bsn and
* versionRange.
*/
public File[] get(String bsn, final VersionRange versionRange) throws Exception {
//
// Check if the entry exists
//
File f = new File(root, bsn);
if (!f.isDirectory())
return null;
//
// Iterator over all the versions for this BSN.
// Create a sorted map over the version as key
// and the file as URL as value. Only versions
// that match the desired range are included in
// this list.
//
return f.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
Matcher m = REPO_FILE.matcher(name);
if (!m.matches())
return false;
if (versionRange == null)
return true;
Version v = new Version(m.group(2));
return versionRange.includes(v);
}
});
}
public List<String> list(String regex) throws Exception {
if (regex == null)
regex = ".*";
final Pattern pattern = Pattern.compile(regex);
String list[] = root.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
Matcher matcher = pattern.matcher(name);
return matcher.matches();
}
});
return Arrays.asList(list);
}
public List<Version> versions(String bsn) throws Exception {
File dir = new File(root, bsn);
final List<Version> versions = new ArrayList<Version>();
dir.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
Matcher m = REPO_FILE.matcher(name);
if (m.matches()) {
versions.add(new Version(m.group(2)));
return true;
}
return false;
}
});
return versions;
}
public File get(String bsn, VersionRange range, int strategy) throws Exception {
File[] files = get(bsn, range);
if (files == null || files.length == 0)
return null;
if (files.length == 1)
return files[0];
if (strategy < 0) {
return files[0];
}
return files[files.length - 1];
}
public File put(String bsn, Version version) throws IOException {
File dir = new File(root, bsn);
if (!dir.exists() && !dir.mkdirs()) {
throw new IOException("Could not create directory " + dir);
}
File file = new File(dir, bsn + "-" + version.getMajor() + "." + version.getMinor() + "." + version.getMicro()
+ ".jar");
return file;
}
}