diff options
| author | Mark Wielaard <mark@klomp.org> | 2006-11-07 23:06:37 +0000 |
|---|---|---|
| committer | Mark Wielaard <mark@klomp.org> | 2006-11-07 23:06:37 +0000 |
| commit | 4f3241a137dc71a22e4a172b53433cb91665cdf6 (patch) | |
| tree | 5ef6a07907f1ae4b312aa989a305bd350da28c85 /gnu/java/net/protocol | |
| parent | 0cb19c07bcc7d2c3741d9769fa2b3f32fa8c01f8 (diff) | |
| download | classpath-4f3241a137dc71a22e4a172b53433cb91665cdf6.tar.gz | |
2006-11-07 Mark Wielaard <mark@klomp.org>
* gnu/java/net/protocol/jar/Handler.java (parseURL): Flatten jar
path.
(flat): New method.
Diffstat (limited to 'gnu/java/net/protocol')
| -rw-r--r-- | gnu/java/net/protocol/jar/Handler.java | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/gnu/java/net/protocol/jar/Handler.java b/gnu/java/net/protocol/jar/Handler.java index 316d8cb02..7c09766a5 100644 --- a/gnu/java/net/protocol/jar/Handler.java +++ b/gnu/java/net/protocol/jar/Handler.java @@ -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.MalformedURLException; 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 (krab@gnu.org) @@ -114,7 +117,7 @@ public class Handler extends URLStreamHandler 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 @@ public class Handler extends URLStreamHandler } /** + * 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 |
