summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2004-03-11 23:29:47 +0000
committerMark Wielaard <mark@klomp.org>2004-03-11 23:29:47 +0000
commitfb1bd5a2c69a74dd259a34fe12e5f09529af77d9 (patch)
tree4d34b57b690f8fe9e7ab04c29cbe0dd3e30152a1
parent77ceb1ba1d86e2849a434eebd8febe091f029037 (diff)
downloadclasspath-fb1bd5a2c69a74dd259a34fe12e5f09529af77d9.tar.gz
2004-03-11 Ito Kazumitsu <ito.kazumitsu@hitachi-cable.co.jp>
* java/net/URI.java (toURL): Implemented. 2003-03-11 Ito Kazumitsu <ito.kazumitsu@hitachi-cable.co.jp> * java/net/URI.java (URI_REGEXP) updated to contain scheme specific part. (SCHEME_SPEC_PART_GROUP) new constant. (AUTHORITY_GROUP, PATH_GROUP, QUERY_GROUP, FRAGMENT_GROUP) updated to make room for SCHEME_SPEC_PART_GROUP. (parseURI) parse scheme specific part. (resolve, isAbsolute, isOpaque, getRawSchemeSpecificPart, getSchemeSpecificPart, getAuthority, getUserInfo, getPath, getQuery, getFragment) implemented. 2002-03-11 Dalibor Topic <robilad@kaffe.org> * libraries/javalib/java/net/URI.java partially implemented using java.util.regex. (URI_REGEXP) new constant. Used to parse URIs. (SCHEME_GROUP) new constant representing index of scheme group in parsed URI. (AUTHORITY_GROUP) new constant representing index of authority group in parsed URI. (PATH_GROUP) new constant representing index of path group in parsed URI. (QUERY_GROUP) new constant representing index of query group in parsed URI. (FRAGMENT_GROUP) new constant representing index of fragment group in parsed URI. (getURIGroup) new static utility method. (parseURI) implemented. (quote) stub for new static utility method. (quoteAuthority) stub for new static utility method. (quoteHost) stub for new static utility method. (quotePath) stub for new static utility method. (quoteUserInfo) stub for new static utility method. (URI) implemented. (create) don't throw URISyntaxException. Implemented. (toString) implemented.
-rw-r--r--ChangeLog42
-rw-r--r--java/net/URI.java273
2 files changed, 295 insertions, 20 deletions
diff --git a/ChangeLog b/ChangeLog
index 45832f807..d1c83248f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,45 @@
+2004-03-11 Ito Kazumitsu <ito.kazumitsu@hitachi-cable.co.jp>
+
+ * java/net/URI.java (toURL): Implemented.
+
+2003-03-11 Ito Kazumitsu <ito.kazumitsu@hitachi-cable.co.jp>
+
+ * java/net/URI.java
+ (URI_REGEXP) updated to contain scheme specific part.
+ (SCHEME_SPEC_PART_GROUP) new constant.
+ (AUTHORITY_GROUP, PATH_GROUP, QUERY_GROUP, FRAGMENT_GROUP)
+ updated to make room for SCHEME_SPEC_PART_GROUP.
+ (parseURI) parse scheme specific part.
+ (resolve, isAbsolute, isOpaque, getRawSchemeSpecificPart,
+ getSchemeSpecificPart, getAuthority, getUserInfo, getPath,
+ getQuery, getFragment) implemented.
+
+2002-03-11 Dalibor Topic <robilad@kaffe.org>
+
+ * libraries/javalib/java/net/URI.java
+ partially implemented using java.util.regex.
+ (URI_REGEXP) new constant. Used to parse URIs.
+ (SCHEME_GROUP) new constant representing index of scheme group
+ in parsed URI.
+ (AUTHORITY_GROUP) new constant representing index of authority
+ group in parsed URI.
+ (PATH_GROUP) new constant representing index of path group in
+ parsed URI.
+ (QUERY_GROUP) new constant representing index of query group in
+ parsed URI.
+ (FRAGMENT_GROUP) new constant representing index of fragment
+ group in parsed URI.
+ (getURIGroup) new static utility method.
+ (parseURI) implemented.
+ (quote) stub for new static utility method.
+ (quoteAuthority) stub for new static utility method.
+ (quoteHost) stub for new static utility method.
+ (quotePath) stub for new static utility method.
+ (quoteUserInfo) stub for new static utility method.
+ (URI) implemented.
+ (create) don't throw URISyntaxException. Implemented.
+ (toString) implemented.
+
2004-03-11 Dalibor Topic <robilad@kaffe.org>
Reported by: Adam Heath <doogie@debian.org>
diff --git a/java/net/URI.java b/java/net/URI.java
index 34d212f99..a2f77a460 100644
--- a/java/net/URI.java
+++ b/java/net/URI.java
@@ -1,5 +1,5 @@
/* URI.java - An URI class
- Copyright (C) 2002 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -41,9 +41,13 @@ import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
/**
- * @author Michael Koch <konqueror@gmx.de>
+ * @author Ito Kazumitsu (ito.kazumitsu@hitachi-cable.co.jp)
+ * @author Dalibor Topic (robilad@kaffe.org)
+ * @author Michael Koch (konqueror@gmx.de)
* @since 1.4
*/
public final class URI
@@ -51,7 +55,45 @@ public final class URI
{
static final long serialVersionUID = -6052424284110960213L;
- String string;
+ /**
+ * Regular expression for parsing URIs.
+ *
+ * Taken from RFC 2396, Appendix B.
+ * This expression doesn't parse IPv6 addresses.
+ */
+ private static final String URI_REGEXP =
+ "^(([^:/?#]+):)?((//([^/?#]*))?([^?#]*)(\\?([^#]*))?)?(#(.*))?";
+
+ /**
+ * Index of scheme component in parsed URI.
+ */
+ private static final int SCHEME_GROUP = 2;
+
+ /**
+ * Index of scheme-specific-part in parsed URI.
+ */
+ private static final int SCHEME_SPEC_PART_GROUP = 3;
+
+ /**
+ * Index of authority component in parsed URI.
+ */
+ private static final int AUTHORITY_GROUP = 5;
+
+ /**
+ * Index of path component in parsed URI.
+ */
+ private static final int PATH_GROUP = 6;
+
+ /**
+ * Index of query component in parsed URI.
+ */
+ private static final int QUERY_GROUP = 8;
+
+ /**
+ * Index of fragment component in parsed URI.
+ */
+ private static final int FRAGMENT_GROUP = 10;
+
private String scheme;
private String schemeSpecificPart;
private String authority;
@@ -72,11 +114,117 @@ public final class URI
{
}
+ private static String getURIGroup (Matcher match, int group) {
+ String matched = match.group(group);
+ return matched.length() == 0 ? null : matched;
+ }
+
+ /**
+ * Sets fields of this URI by parsing the given string.
+ *
+ * @param str The string to parse
+ *
+ * @exception URISyntaxException If the given string violates RFC 2396
+ */
private void parseURI (String str)
throws URISyntaxException
{
+ Pattern pattern = Pattern.compile(URI_REGEXP);
+ Matcher matcher = pattern.matcher(str);
+ if (matcher.matches())
+ {
+ scheme = getURIGroup(matcher, SCHEME_GROUP);
+ schemeSpecificPart = getURIGroup(matcher, SCHEME_SPEC_PART_GROUP);
+ authority = getURIGroup(matcher, AUTHORITY_GROUP);
+ path = getURIGroup(matcher, PATH_GROUP);
+ query = getURIGroup(matcher, QUERY_GROUP);
+ fragment = getURIGroup(matcher, FRAGMENT_GROUP);
+ }
+ else
+ throw new URISyntaxException(str,
+ "doesn't match URI regular expression");
+ }
+
+ /**
+ * Quote characters illegal in URIs in given string.
+ *
+ * Replace illegal characters by encoding their UTF-8
+ * representation as "%" + hex code for each resulting
+ * UTF-8 character.
+ *
+ * @param str The string to quote
+ *
+ * @return The quoted string.
+ */
+ private static String quote (String str) {
+ // FIXME: unimplemented.
+ return str;
+ }
+
+ /**
+ * Quote characters illegal in URI authorities in given string.
+ *
+ * Replace illegal characters by encoding their UTF-8
+ * representation as "%" + hex code for each resulting
+ * UTF-8 character.
+ *
+ * @param str The string to quote
+ *
+ * @return The quoted string.
+ */
+ private static String quoteAuthority (String str) {
+ // FIXME: unimplemented.
+ return str;
}
-
+
+ /**
+ * Quote characters illegal in URI hosts in given string.
+ *
+ * Replace illegal characters by encoding their UTF-8
+ * representation as "%" + hex code for each resulting
+ * UTF-8 character.
+ *
+ * @param str The string to quote
+ *
+ * @return The quoted string.
+ */
+ private static String quoteHost (String str) {
+ // FIXME: unimplemented.
+ return str;
+ }
+
+ /**
+ * Quote characters illegal in URI paths in given string.
+ *
+ * Replace illegal characters by encoding their UTF-8
+ * representation as "%" + hex code for each resulting
+ * UTF-8 character.
+ *
+ * @param str The string to quote
+ *
+ * @return The quoted string.
+ */
+ private static String quotePath (String str) {
+ // FIXME: unimplemented.
+ return str;
+ }
+
+ /**
+ * Quote characters illegal in URI user infos in given string.
+ *
+ * Replace illegal characters by encoding their UTF-8
+ * representation as "%" + hex code for each resulting
+ * UTF-8 character.
+ *
+ * @param str The string to quote
+ *
+ * @return The quoted string.
+ */
+ private static String quoteUserInfo (String str) {
+ // FIXME: unimplemented.
+ return str;
+ }
+
/**
* Creates an URI from the given string
*
@@ -88,6 +236,7 @@ public final class URI
public URI (String str)
throws URISyntaxException
{
+ parseURI(str);
}
/**
@@ -107,6 +256,16 @@ public final class URI
String path, String query, String fragment)
throws URISyntaxException
{
+ this((scheme == null ? "" : scheme + ":" )
+ + (userInfo == null && host == null && port == -1 ? "" : "//")
+ + (userInfo == null ? "" : quoteUserInfo(userInfo) + "@")
+ + (host == null ? "" : quoteHost(host))
+ + (port == -1 ? "" : ":" + String.valueOf(port))
+ + (path == null ? "" : quotePath(path))
+ + (query == null ? "" : "?" + quote(query))
+ + (fragment == null ? "" : "#" + quote(fragment)));
+
+ parseServerAuthority();
}
/**
@@ -116,7 +275,7 @@ public final class URI
* @param authority The authority
* @param path The apth
* @param query The query
- * @param fragment The fragmen
+ * @param fragment The fragment
*
* @exception URISyntaxException If the given string violates RFC 2396
*/
@@ -124,6 +283,11 @@ public final class URI
String fragment)
throws URISyntaxException
{
+ this((scheme == null ? "" : scheme + ":")
+ + (authority == null ? "" : "//" + quoteAuthority(authority))
+ + (path == null ? "" : quotePath(path))
+ + (query == null ? "" : "?" + quote(query))
+ + (fragment == null ? "" : "#" + quote(fragment)));
}
/**
@@ -139,6 +303,7 @@ public final class URI
public URI (String scheme, String host, String path, String fragment)
throws URISyntaxException
{
+ this(scheme, null, host, -1, path, null, fragment);
}
/**
@@ -153,6 +318,9 @@ public final class URI
public URI (String scheme, String ssp, String fragment)
throws URISyntaxException
{
+ this((scheme == null ? "" : scheme + ":")
+ + (ssp == null ? "" : quote(ssp))
+ + (fragment == null ? "" : "#" + quote(fragment)));
}
/**
@@ -165,7 +333,15 @@ public final class URI
*/
public static URI create (String str)
{
- return null;
+ try
+ {
+ return new URI(str);
+ }
+ catch(URISyntaxException e)
+ {
+ throw (IllegalArgumentException)
+ new IllegalArgumentException().initCause(e);
+ }
}
/**
@@ -193,13 +369,57 @@ public final class URI
*
* @param uri The URI to resolve against this URI
*
- * @return The resulting URI
+ * @return The resulting URI, or null when it couldn't be resolved
+ * for some reason.
*
* @exception NullPointerException If uri is null
*/
public URI resolve (URI uri)
{
- return null;
+ if (uri.isAbsolute())
+ return uri;
+ if (uri.isOpaque())
+ return uri;
+
+ String scheme = uri.getScheme();
+ String schemeSpecificPart = uri.getSchemeSpecificPart();
+ String authority = uri.getAuthority();
+ String path = uri.getPath();
+ String query = uri.getQuery();
+ String fragment = uri.getFragment();
+
+ try
+ {
+ if (fragment != null &&
+ path != null && path.equals("") &&
+ scheme == null && authority == null && query == null)
+ return new URI(this.scheme, this.schemeSpecificPart, fragment);
+
+ if (authority == null)
+ {
+ authority = this.authority;
+ if (path == null)
+ path = "";
+ if (!(path.startsWith("/")))
+ {
+ StringBuffer basepath = new StringBuffer(this.path);
+ int i = this.path.lastIndexOf('/');
+
+ if (i >= 0)
+ basepath.delete(i+1, basepath.length());
+
+ basepath.append(path);
+ path = basepath.toString();
+ // FIXME We must normalize the path here.
+ // Normalization process omitted.
+ }
+ }
+ return new URI(this.scheme, authority, path, query, fragment);
+ }
+ catch (URISyntaxException e)
+ {
+ return null;
+ }
}
/**
@@ -216,7 +436,7 @@ public final class URI
public URI resolve (String str)
throws IllegalArgumentException
{
- return null;
+ return resolve(create(str));
}
/**
@@ -243,7 +463,10 @@ public final class URI
public URL toURL ()
throws IllegalArgumentException, MalformedURLException
{
- return null;
+ if (isAbsolute())
+ return new URL(this.toString());
+
+ throw new IllegalArgumentException("not absolute");
}
/**
@@ -259,7 +482,7 @@ public final class URI
*/
public boolean isAbsolute ()
{
- return false;
+ return (scheme != null);
}
/**
@@ -267,7 +490,7 @@ public final class URI
*/
public boolean isOpaque ()
{
- return false;
+ return ((scheme != null) && !(schemeSpecificPart.startsWith("/")));
}
/**
@@ -276,7 +499,7 @@ public final class URI
*/
public String getRawSchemeSpecificPart ()
{
- return null;
+ return schemeSpecificPart;
}
/**
@@ -284,7 +507,8 @@ public final class URI
*/
public String getSchemeSpecificPart ()
{
- return null;
+ // FIXME: unimplemented.
+ return schemeSpecificPart;
}
/**
@@ -300,7 +524,8 @@ public final class URI
*/
public String getAuthority ()
{
- return null;
+ // FIXME: unimplemented.
+ return authority;
}
/**
@@ -316,7 +541,8 @@ public final class URI
*/
public String getUserInfo ()
{
- return null;
+ // FIXME: unimplemented.
+ return userInfo;
}
/**
@@ -348,7 +574,8 @@ public final class URI
*/
public String getPath ()
{
- return null;
+ // FIXME: unimplemented.
+ return path;
}
/**
@@ -364,7 +591,8 @@ public final class URI
*/
public String getQuery ()
{
- return null;
+ // FIXME: unimplemented.
+ return query;
}
/**
@@ -380,7 +608,8 @@ public final class URI
*/
public String getFragment ()
{
- return null;
+ // FIXME: unimplemented.
+ return fragment;
}
/**
@@ -419,7 +648,11 @@ public final class URI
*/
public String toString ()
{
- return "";
+ return (getScheme() == null ? "" : getScheme() + ":")
+ + (getRawAuthority() == null ? "" : "//" + getRawAuthority())
+ + (getRawPath() == null ? "" : getRawPath())
+ + (getRawQuery() == null ? "" : "?" + getRawQuery())
+ + (getRawFragment() == null ? "" : "#" + getRawFragment());
}
/**