| 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; |
| } |
| |
| } |