import gnu.java.lang.CPStringBuilder; //导入方法依赖的package包/类
/**
* Resolves the given URI against this URI
*
* @param uri The URI to resolve against this URI
*
* @return The resulting URI, or null when it couldn't be resolved
* for some reason.
*
* @throws NullPointerException if uri is null
*/
public URI resolve(URI uri)
{
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("/")))
{
CPStringBuilder basepath = new CPStringBuilder(this.path);
int i = this.path.lastIndexOf('/');
if (i >= 0)
basepath.delete(i + 1, basepath.length());
basepath.append(path);
path = normalizePath(basepath.toString());
}
}
return new URI(this.scheme, authority, path, query, fragment);
}
catch (URISyntaxException e)
{
throw (Error) new InternalError("Resolved URI variant could not "+
"be constructed").initCause(e);
}
}