rmannibucau commented on code in PR #34:
URL: https://github.com/apache/geronimo-xbean/pull/34#discussion_r1045282353


##########
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:
   > start from beginning FAILS, start from end SUCCEEDS
   
   For your test case but you can have the opposite case as well.
   This is why I insist to test the file presence as a validation.
   With such validation, we just need to decide if we start from start or end 
to find `!`.
   Since the 99% of cases is there is no `!` in folders - JVM does not support 
it properly, there are numerous bugs on JDK bugtracker about that - it is 
likely saner to start from the beginning and keep consistent with the current 
behavior.



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

Reply via email to