+ protected String constructUrl(String baseUrl, String relativeUrl) {
+ try {
+ if (relativeUrl.indexOf('*') >= 0) {
+ if (!baseUrl.startsWith("file:"))
+ throw new IllegalArgumentException(
+ "Wildcard support only for file:, badly formatted " + baseUrl + " and " + relativeUrl);
+ Path basePath = Paths.get(new URI(baseUrl));
+ // Path basePath = Paths.get(new URI(baseUrl));
+ // int li = relativeUrl.lastIndexOf('/');
+ // String relativeDir = relativeUrl.substring(0, li);
+ // String relativeFile = relativeUrl.substring(li,
+ // relativeUrl.length());
+ String pattern = "glob:" + basePath + '/' + relativeUrl;
+ PathMatcher pm = basePath.getFileSystem().getPathMatcher(pattern);
+ SortedMap<Version, Path> res = new TreeMap<>();
+ checkDir(basePath, pm, res);
+ if (res.size() == 0)
+ throw new OsgiBootException("No file matching " + relativeUrl + " found in " + baseUrl);
+ return res.get(res.firstKey()).toUri().toString();
+ // try (DirectoryStream<Path> ds =
+ // Files.newDirectoryStream(basePath)) {
+ // Path res = null;
+ // for (Path path : ds) {
+ // if (pm.matches(path)) {
+ // if (res == null)
+ // res = path;
+ // else
+ // throw new OsgiBootException(
+ // "More than one file matching " + relativeUrl + " found in " +
+ // baseUrl);
+ // }
+ // }
+ // if (res == null)
+ // throw new OsgiBootException("No file matching " + relativeUrl
+ // + " found in " + baseUrl);
+ // return res.toUri().toURL().toString();
+ // // Iterator<Path> it = ds.iterator();
+ // // if (!it.hasNext())
+ // // throw new OsgiBootException("No file matching " +
+ // // relativeUrl + " found in " + baseUrl);
+ // // Path distributionBundlePath = it.next();
+ // // if (it.hasNext())// TODO implement version ordered
+ // // throw new OsgiBootException(
+ // // "More than one file matching " + relativeUrl + " found in
+ // // " + baseUrl);
+ // // return distributionBundlePath.toUri().toURL().toString();
+ // }
+ } else {
+ return baseUrl + relativeUrl;
+ }
+ } catch (Exception e) {
+ throw new OsgiBootException("Cannot build URL from " + baseUrl + " and " + relativeUrl, e);
+ }
+ }
+
+ private void checkDir(Path dir, PathMatcher pm, SortedMap<Version, Path> res) throws IOException {
+ try (DirectoryStream<Path> ds = Files.newDirectoryStream(dir)) {
+ for (Path path : ds) {
+ if (Files.isDirectory(path))
+ checkDir(path, pm, res);
+ else if (pm.matches(path)) {
+ String fileName = path.getFileName().toString();
+ fileName = fileName.substring(0, fileName.lastIndexOf('.'));
+ if (fileName.endsWith("-SNAPSHOT"))
+ fileName = fileName.substring(0, fileName.lastIndexOf('-')) + ".SNAPSHOT";
+ fileName = fileName.substring(fileName.lastIndexOf('-') + 1);
+ Version version = new Version(fileName);
+ res.put(version, path);
+ }
+ }
+ }
+ }
+
+ // public static void main(String[] args) {
+ // try {
+ // String baseUrl = "file:///home/mbaudier/.m2/repository/";
+ // String relativeUrl =
+ // "org/argeo/commons/org.argeo.dep.cms.node/2.1.*-SNAPSHOT/org.argeo.dep.cms.node-2.1.*-SNAPSHOT.jar";
+ // Path basePath = Paths.get(new URI(baseUrl));
+ // PathMatcher pm = basePath.getFileSystem().getPathMatcher("glob:" +
+ // relativeUrl);
+ //
+ // try (DirectoryStream<Path> ds = Files.newDirectoryStream(basePath, "**"))
+ // {
+ // for (Path path : ds) {
+ // System.out.println(path);
+ // }
+ // }
+ // } catch (Exception e) {
+ // e.printStackTrace();
+ // }
+ // }
+