powerbroker commented on code in PR #34: URL: https://github.com/apache/geronimo-xbean/pull/34#discussion_r1045269988
########## xbean-finder/src/main/java/org/apache/xbean/finder/archive/JarArchive.java: ########## @@ -41,22 +43,52 @@ public class JarArchive implements Archive { private final JarFile jar; private final MJarSupport mjar = new MJarSupport(); - public JarArchive(ClassLoader loader, URL url) { + public JarArchive(ClassLoader loader, URL url){ // if (!"jar".equals(url.getProtocol())) throw new IllegalArgumentException("not a jar url: " + url); + this.loader = loader; + this.url = url; + File jf; + int idx; + + /* + * True URL.getPath(...) wiping out protocol prefixes: + * + * 1. 'jar:file:/c:/temp/...' -> 'jar' + 'file:/c:/temp/...' + * 2. 'file:/c:/temp/...' -> 'file' + '/c:/temp/...' + * + * assuming we accept 'file:/...${xxx.jar}!/' URLs + * AND 'zip:file:/...!/' would be cool too, if + * allowed by new URL(...) + */ try { - this.loader = loader; - this.url = url; - URL u = url; - - String jarPath = url.getFile(); - if (jarPath.contains("!")) { - jarPath = jarPath.substring(0, jarPath.lastIndexOf("!")); - u = new URL(jarPath); + // Underlying JarFile(...) requires RandomAccessFile, + // so only local file URLs here... + while(!"file".equalsIgnoreCase(url.getProtocol())) { + // no need here in .getQuery() tail, appended by getFile() + url = new URL(url.getPath()); } - jar = new JarFile(FileArchive.decode(u.getFile())); // no more an url - } catch (IOException e) { - throw new IllegalStateException(e); + }catch(MalformedURLException ex){ + // No more protocol(s) in path + throw new UnsupportedOperationException("Please provide 'file:/...' or 'jar:file:/...!/' URL"); + } + + // TODO: drop FileArchive.decode? + // URLDecoder.decode(url.getPath(), "UTF-8"); + String jarPath = FileArchive.decode(url.getPath()); + + while(!(jf = new File(jarPath)).exists()){ + if((idx = jarPath.lastIndexOf('!')) > 0){ Review Comment: what do you mean? start from beginning FAILS, start from end SUCCEEDS. yes, success may cost some resources, that's the price. here we (almost) always meet ! at the end, since new URL() requires it in 'jar:file:/...!/'. so, we try access file, cut ! off, and - if everything is near default scenario - meet available JAR file(even if it has !s in path or not - doesn't matter) => profit! once. things become worse when there is a tail full of !s after 'file.jar!/'. definitely non-standard case, and each extra '!' cost new String, new File and extra file system access. if i missed something...? -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: dev-unsubscr...@geronimo.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org