diff options
author | Michael Koch <mkoch@gcc.gnu.org> | 2005-04-20 09:36:06 +0000 |
---|---|---|
committer | Michael Koch <mkoch@gcc.gnu.org> | 2005-04-20 09:36:06 +0000 |
commit | d288ff8d54dce83ba0ccea262d4da42a820a1bfc (patch) | |
tree | 1173f3fccc08f400ee2e8b8c3a6ce2507bc72af7 /libjava/java/net | |
parent | b5293f35adf7c10ba94063386e0add3837beec64 (diff) | |
download | gcc-d288ff8d54dce83ba0ccea262d4da42a820a1bfc.zip gcc-d288ff8d54dce83ba0ccea262d4da42a820a1bfc.tar.gz gcc-d288ff8d54dce83ba0ccea262d4da42a820a1bfc.tar.bz2 |
[multiple changes]
2005-04-20 Andrew John Hughes <gnu_andrew@member.fsf.org>
* java/net/URI.java:
Added class documentation.
(parseURI(String)): Only handle scheme-specific parts
if URI is not opaque. Allow for parts that can't be null.
(toString()): Output the scheme-specific part whole, rather
than as its possibly non-existent components.
2005-04-20 Jeroen Frijters <jeroen@frijters.net>
* java/net/URI.java (AUTHORITY_REGEXP): Corrected regexp.
(AUTHORITY_USERINFO_GROUP,AUTHORITY_HOST_GROUP,AUTHORITY_PORT_GROUP):
Adjusted to match new regexp.
From-SVN: r98451
Diffstat (limited to 'libjava/java/net')
-rw-r--r-- | libjava/java/net/URI.java | 87 |
1 files changed, 73 insertions, 14 deletions
diff --git a/libjava/java/net/URI.java b/libjava/java/net/URI.java index 23e3e7c..95577fc 100644 --- a/libjava/java/net/URI.java +++ b/libjava/java/net/URI.java @@ -46,12 +46,67 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; /** + * <p> + * A URI instance represents that defined by + * <a href="http://www.ietf.org/rfc/rfc3986.txt">RFC2396</a>, + * with some deviations. + * </p> + * <p> + * At its highest level, a URI consists of: + * </p> + * <code>[<em>scheme</em><strong>:</strong>]<em>scheme-specific-part</em> + * [<strong>#</strong><em>fragment</em>]</code> + * </p> + * <p> + * where <strong>#</strong> and <strong>:</strong> are literal characters, + * and those parts enclosed in square brackets are optional. + * </p> + * <p> + * There are two main types of URI. An <em>opaque</em> URI is one + * which just consists of the above three parts, and is not further + * defined. An example of such a URI would be <em>mailto:</em> URI. + * In contrast, <em>hierarchical</em> URIs give further definition + * to the scheme-specific part, so as represent some part of a hierarchical + * structure. + * </p> + * <p> + * <code>[<strong>//</strong><em>authority</em>][<em>path</em>] + * [<strong>?</strong><em>query</em>]</code> + * </p> + * <p> + * with <strong>/</strong> and <strong>?</strong> being literal characters. + * When server-based, the authority section is further subdivided into: + * </p> + * <p> + * <code>[<em>user-info</em><strong>@</strong>]<em>host</em> + * [<strong>:</strong><em>port</em>]</code> + * </p> + * <p> + * with <strong>@</strong> and <strong>:</strong> as literal characters. + * Authority sections that are not server-based are said to be registry-based. + * </p> + * <p> + * Hierarchical URIs can be either relative or absolute. Absolute URIs + * always start with a `<strong>/</strong>', while relative URIs don't + * specify a scheme. Opaque URIs are always absolute. + * </p> + * <p> + * Each part of the URI may have one of three states: undefined, empty + * or containing some content. The former two of these are represented + * by <code>null</code> and the empty string in Java, respectively. + * The scheme-specific part may never be undefined. It also follows from + * this that the path sub-part may also not be undefined, so as to ensure + * the former. + * </p> + * * @author Ito Kazumitsu (ito.kazumitsu@hitachi-cable.co.jp) * @author Dalibor Topic (robilad@kaffe.org) * @author Michael Koch (konqueror@gmx.de) + * @author Andrew John Hughes (gnu_andrew@member.fsf.org) * @since 1.4 */ -public final class URI implements Comparable, Serializable +public final class URI + implements Comparable, Serializable { static final long serialVersionUID = -6052424284110960213L; @@ -65,7 +120,7 @@ public final class URI implements Comparable, Serializable "^(([^:/?#]+):)?((//([^/?#]*))?([^?#]*)(\\?([^#]*))?)?(#(.*))?"; private static final String AUTHORITY_REGEXP = - "^((([^?#]*)@)?([^?#:]*)(:([^?#]*)))?"; + "(([^?#]*)@)?([^?#:]*)(:([^?#]*))?"; /** * Valid characters (taken from rfc2396) @@ -115,9 +170,9 @@ public final class URI implements Comparable, Serializable */ private static final int FRAGMENT_GROUP = 10; - private static final int AUTHORITY_USERINFO_GROUP = 3; - private static final int AUTHORITY_HOST_GROUP = 4; - private static final int AUTHORITY_PORT_GROUP = 6; + private static final int AUTHORITY_USERINFO_GROUP = 2; + private static final int AUTHORITY_HOST_GROUP = 3; + private static final int AUTHORITY_PORT_GROUP = 5; private transient String scheme; private transient String rawSchemeSpecificPart; @@ -180,10 +235,14 @@ public final class URI implements Comparable, Serializable if (matcher.matches()) { scheme = getURIGroup(matcher, SCHEME_GROUP); - rawSchemeSpecificPart = getURIGroup(matcher, SCHEME_SPEC_PART_GROUP); - rawAuthority = getURIGroup(matcher, AUTHORITY_GROUP); - rawPath = getURIGroup(matcher, PATH_GROUP); - rawQuery = getURIGroup(matcher, QUERY_GROUP); + rawSchemeSpecificPart = matcher.group(SCHEME_SPEC_PART_GROUP); + schemeSpecificPart = unquote(rawSchemeSpecificPart); + if (!isOpaque()) + { + rawAuthority = getURIGroup(matcher, AUTHORITY_GROUP); + rawPath = matcher.group(PATH_GROUP); + rawQuery = getURIGroup(matcher, QUERY_GROUP); + } rawFragment = getURIGroup(matcher, FRAGMENT_GROUP); } else @@ -221,7 +280,6 @@ public final class URI implements Comparable, Serializable // We must eagerly unquote the parts, because this is the only time // we may throw an exception. - schemeSpecificPart = unquote(rawSchemeSpecificPart); authority = unquote(rawAuthority); userInfo = unquote(rawUserInfo); host = unquote(rawHost); @@ -814,14 +872,15 @@ public final class URI implements Comparable, Serializable } /** - * Returns the URI as string + * Returns the URI as a String. If the URI was created using a constructor, + * then this will be the same as the original input string. + * + * @return a string representation of the URI. */ public String toString() { return (getScheme() == null ? "" : getScheme() + ":") - + (getRawAuthority() == null ? "" : "//" + getRawAuthority()) - + (getRawPath() == null ? "" : getRawPath()) - + (getRawQuery() == null ? "" : "?" + getRawQuery()) + + getRawSchemeSpecificPart() + (getRawFragment() == null ? "" : "#" + getRawFragment()); } |