[kaffe] new java.net.URI methods
Ito Kazumitsu
ito.kazumitsu@hitachi-cable.co.jp
Tue May 6 21:55:02 2003
I added new java.net.URI methods and new constructor File(URI),
which are required by recently released Saxon 7.5.
--- java/net/URI.java.orig Mon Dec 2 23:35:31 2002
+++ java/net/URI.java Wed May 7 13:36:31 2003
@@ -60,7 +60,7 @@
* This expression doesn't parse IPv6 addresses.
*/
private static final String URI_REGEXP =
- "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?";
+ "^(([^:/?#]+):)?((//([^/?#]*))?([^?#]*)(\\?([^#]*))?)?(#(.*))?";
/**
* Index of scheme component in parsed URI.
@@ -68,24 +68,29 @@
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 = 4;
+ private static final int AUTHORITY_GROUP = 5;
/**
* Index of path component in parsed URI.
*/
- private static final int PATH_GROUP = 5;
+ private static final int PATH_GROUP = 6;
/**
* Index of query component in parsed URI.
*/
- private static final int QUERY_GROUP = 7;
+ private static final int QUERY_GROUP = 8;
/**
* Index of fragment component in parsed URI.
*/
- private static final int FRAGMENT_GROUP = 9;
+ private static final int FRAGMENT_GROUP = 10;
String string;
private String scheme;
@@ -127,6 +132,7 @@
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);
@@ -369,7 +375,44 @@
*/
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();
+ // We must normalize the path here.
+ // Normalization process omitted.
+ }
+ }
+ return new URI(this.scheme, authority, path, query, fragment);
+ }
+ catch (URISyntaxException e) {
+ return null;
+ }
}
/**
@@ -386,7 +429,7 @@
public URI resolve (String str)
throws IllegalArgumentException
{
- return null;
+ return resolve(create(str));
}
/**
@@ -429,7 +472,7 @@
*/
public boolean isAbsolute ()
{
- return false;
+ return (scheme != null);
}
/**
@@ -437,7 +480,8 @@
*/
public boolean isOpaque ()
{
- return false;
+ return ((scheme != null) &&
+ !(schemeSpecificPart.startsWith("/")));
}
/**
@@ -446,7 +490,7 @@
*/
public String getRawSchemeSpecificPart ()
{
- return null;
+ return schemeSpecificPart;
}
/**
@@ -454,7 +498,8 @@
*/
public String getSchemeSpecificPart ()
{
- return null;
+ // FIXME: unimplemented.
+ return schemeSpecificPart;
}
/**
@@ -470,7 +515,8 @@
*/
public String getAuthority ()
{
- return null;
+ // FIXME: unimplemented.
+ return authority;
}
/**
@@ -486,7 +532,8 @@
*/
public String getUserInfo ()
{
- return null;
+ // FIXME: unimplemented.
+ return userInfo;
}
/**
@@ -518,7 +565,8 @@
*/
public String getPath ()
{
- return null;
+ // FIXME: unimplemented.
+ return path;
}
/**
@@ -534,7 +582,8 @@
*/
public String getQuery ()
{
- return null;
+ // FIXME: unimplemented.
+ return query;
}
/**
@@ -550,7 +599,8 @@
*/
public String getFragment ()
{
- return null;
+ // FIXME: unimplemented.
+ return fragment;
}
/**
--- java/io/File.java.orig Fri Mar 7 18:27:28 2003
+++ java/io/File.java Wed May 7 13:51:27 2003
@@ -68,6 +68,16 @@
this.path = path;
}
+public File(URI uri) {
+ if (uri == null) {
+ throw new NullPointerException();
+ }
+ this.path = uri.getPath();
+ if (this.path == null) {
+ throw new IllegalArgumentException();
+ }
+}
+
public boolean canRead() {
checkReadAccess();