Hi,

When combining jar urls people might use relative paths using .., but
jar files don't handle paths using .. (or .) so we need to flatten it
beforehand. This patch does that.

    2006-11-07  Mark Wielaard  <[EMAIL PROTECTED]>
        
    * gnu/java/net/protocol/jar/Handler.java (parseURL): Flatten jar
    path.
    (flat): New method.

This also makes the HTMLDemo work out of the box from the examples.zip.
That is a nice Demo so try it out! :)
jamvm -cp examples/examples.zip gnu.classpath.examples.swing.HtmlDemo

Cheers,

Mark
Index: gnu/java/net/protocol/jar/Handler.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/net/protocol/jar/Handler.java,v
retrieving revision 1.12
diff -u -r1.12 Handler.java
--- gnu/java/net/protocol/jar/Handler.java	2 Jul 2005 20:32:13 -0000	1.12
+++ gnu/java/net/protocol/jar/Handler.java	7 Nov 2006 23:03:57 -0000
@@ -1,5 +1,5 @@
 /* gnu.java.net.protocol.jar.Handler - jar protocol handler for java.net
-   Copyright (C) 1999, 2002, 2003, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2002, 2003, 2005, 2006 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -45,6 +45,9 @@
 import java.net.URL;
 import java.net.URLConnection;
 import java.net.URLStreamHandler;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.StringTokenizer;
 
 /**
  * @author Kresten Krab Thorup ([EMAIL PROTECTED])
@@ -114,7 +117,7 @@
               file = file.substring(0, idx + 1) + url_string;
           }
         
-        setURL (url, "jar", url.getHost(), url.getPort(), file, null);
+        setURL (url, "jar", url.getHost(), url.getPort(), flat(file), null);
         return;
       }
 
@@ -149,6 +152,45 @@
   }
 
   /**
+   * Makes the given jar url string 'flat' by removing any . and .. from
+   * jar file path because ZipFile entries can only handle flat paths.
+   * Inside jar files '/' is always the path separator.
+   */
+  private static String flat(String url_string)
+  {
+    int jar_stop = url_string.indexOf("!/");
+    String jar_path = url_string.substring(jar_stop + 1, url_string.length());
+
+    if (jar_path.indexOf("/.") < 0)
+      return url_string;
+
+    ArrayList tokens = new ArrayList();
+    StringTokenizer st = new StringTokenizer(jar_path, "/");
+    while (st.hasMoreTokens())
+      {
+	String token = st.nextToken();
+        if (token.equals("."))
+          continue;
+        else if (token.equals(".."))
+	  {
+	    if (! tokens.isEmpty())
+	      tokens.remove(tokens.size() - 1);
+	  }
+        else 
+	  tokens.add(token);
+      }
+
+    StringBuffer path = new StringBuffer(url_string.length());
+    path.append(url_string.substring(0, jar_stop + 1));
+
+    Iterator it = tokens.iterator();
+    while (it.hasNext())
+      path.append('/').append(it.next());
+
+    return path.toString();
+  }
+
+  /**
    * This method converts a Jar URL object into a String.
    *
    * @param url The URL object to convert

Reply via email to