📄 uri.java
字号:
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Xalan" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation and was
* originally based on software copyright (c) 1999, Lotus
* Development Corporation., http://www.lotus.com. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.exolab.jms.net.uri;
import java.io.IOException;
import java.io.Serializable;
/**
* A class to represent a Uniform Resource Identifier (URI). This class
* is designed to handle the parsing of URIs and provide access to
* the various components (scheme, host, port, userinfo, path, query
* string and fragment) that may constitute a URI.
* <p>
* Parsing of a URI specification is done according to the URI
* syntax described in RFC 2396
* <http://www.ietf.org/rfc/rfc2396.txt?number=2396>. Every URI consists
* of a scheme, followed by a colon (':'), followed by a scheme-specific
* part. For URIs that follow the "generic URI" syntax, the scheme-
* specific part begins with two slashes ("//") and may be followed
* by an authority segment (comprised of user information, host, and
* port), path segment, query segment and fragment. Note that RFC 2396
* no longer specifies the use of the parameters segment and excludes
* the "user:password" syntax as part of the authority segment. If
* "user:password" appears in a URI, the entire user/password string
* is stored as userinfo.
* <p>
* For URIs that do not follow the "generic URI" syntax (e.g. mailto),
* the entire scheme-specific part is treated as the "path" portion
* of the URI.
* <p>
* Note that, unlike the java.net.URL class, this class does not provide
* any built-in network access functionality nor does it provide any
* scheme-specific functionality (for example, it does not know a
* default port for a specific scheme). Rather, it only knows the
* grammar and basic set of operations that can be applied to a URI.
*
* @version $Id: URI.java,v 1.1 2004/11/26 01:51:06 tanderson Exp $
*
*/
public final class URI
{
/**
* MalformedURIExceptions are thrown in the process of building a URI
* or setting fields on a URI when an operation would result in an
* invalid URI specification.
*/
public static class MalformedURIException
extends IOException
{
/**
* Constructs a <code>MalformedURIException</code> with no specified
* detail message.
*/
public MalformedURIException()
{
super();
}
/**
* Constructs a <code>MalformedURIException</code> with the
* specified detail message.
*
* @param message the detail message.
*/
public MalformedURIException( String message )
{
super( message );
}
}
/**
* reserved characters
*/
private static final String RESERVED_CHARACTERS = ";/?:@&=+$,";
/**
* URI punctuation mark characters - these, combined with
* alphanumerics, constitute the "unreserved" characters
*/
private static final String MARK_CHARACTERS = "-_.!~*'() ";
/**
* scheme can be composed of alphanumerics and these characters
*/
private static final String SCHEME_CHARACTERS = "+-.";
/**
* userinfo can be composed of unreserved, escaped and these
* characters
*/
private static final String USERINFO_CHARACTERS = ";:&=+$,";
/**
* Stores the scheme (usually the protocol) for this URI.
*/
private String _scheme = null;
/**
* If specified, stores the userinfo for this URI; otherwise null
*/
private String _userinfo = null;
/**
* If specified, stores the host for this URI; otherwise null
*/
private String _host = null;
/**
* If specified, stores the port for this URI; otherwise -1
*/
private int _port = -1;
/**
* If specified, stores the path for this URI; otherwise null
*/
private String _path = null;
/**
* If specified, stores the query string for this URI; otherwise
* null.
*/
private String _queryString = null;
/**
* If specified, stores the fragment for this URI; otherwise null
*/
private String _fragment = null;
/**
* Indicate whether in DEBUG mode
*/
private static boolean DEBUG = false;
/**
* Construct a new and uninitialized URI.
*/
public URI()
{
}
/**
* Construct a new URI from another URI. All fields for this URI are
* set equal to the fields of the URI passed in.
*
* @param other the URI to copy (cannot be null)
*/
public URI( URI other)
{
initialize( other );
}
/**
* Construct a new URI from a URI specification string. If the
* specification follows the "generic URI" syntax, (two slashes
* following the first colon), the specification will be parsed
* accordingly - setting the scheme, userinfo, host,port, path, query
* string and fragment fields as necessary. If the specification does
* not follow the "generic URI" syntax, the specification is parsed
* into a scheme and scheme-specific part (stored as the path) only.
*
* @param uriSpec the URI specification string (cannot be null or empty)
* @throws MalformedURIException uriSpec violates any syntax rules
*/
public URI( String uriSpec )
throws MalformedURIException
{
this( (URI) null, uriSpec);
}
/**
* Construct a new URI from a base URI and a URI specification string.
* The URI specification string may be a relative URI.
*
* @param base the base URI (cannot be null if uriSpec is null or empty)
* @param uriSpec the URI specification string (cannot be null or empty
* if base is null)
* @throws MalformedURIException uriSpec violates any syntax rules
*/
public URI( URI base, String uriSpec)
throws MalformedURIException
{
initialize( base, uriSpec );
}
/**
* Construct a new URI that does not follow the generic URI syntax.
* Only the scheme and scheme-specific part (stored as the path) are
* initialized.
*
* @param scheme the URI scheme (cannot be null or empty)
* @param schemeSpecificPart the scheme-specific part (cannot be
* null or empty)
* @throws MalformedURIException scheme violates any syntax rules
*/
public URI( String scheme, String schemeSpecificPart )
throws MalformedURIException
{
if ( scheme == null || scheme.trim().length() == 0 )
throw new MalformedURIException( "Argument scheme is null or an empty string" );
if ( schemeSpecificPart == null || schemeSpecificPart.trim().length() == 0 )
throw new MalformedURIException( "Argument schemeSpecificPart is null or an empty string" );
setScheme( scheme );
setPath( schemeSpecificPart );
}
/**
* Construct a new URI that follows the generic URI syntax from its
* component parts. Each component is validated for syntax and some
* basic semantic checks are performed as well. See the individual
* setter methods for specifics.
*
* @param scheme the URI scheme (cannot be null or empty)
* @param host the hostname or IPv4 address for the URI
* @param path the URI path - if the path contains '?' or '#',
* then the query string and/or fragment will be set from the path;
* however, if the query and fragment are specified both in the path
* and as separate parameters, an exception is thrown
* @param queryString the URI query string (cannot be specified
* if path is null)
* @param fragment the URI fragment (cannot be specified if path is null)
* @throws MalformedURIException Any of the parameters violates
* syntax rules or semantic rules
*/
public URI( String scheme, String host, String path,
String queryString, String fragment )
throws MalformedURIException
{
this( scheme, null, host, -1, path, queryString, fragment );
}
/**
* Construct a new URI that follows the generic URI syntax from its
* component parts. Each component is validated for syntax and some
* basic semantic checks are performed as well. See the individual
* setter methods for specifics.
*
* @param scheme the URI scheme (cannot be null or empty)
* @param userinfo the URI userinfo (cannot be specified if host is null)
* @param host the hostname or IPv4 address for the URI
* @param port the URI port (may be -1 for "unspecified"; cannot
* be specified if host is null)
* @param path the URI path - if the path contains '?' or '#',
* then the query string and/or fragment will be set from the path;
* however, if the query and fragment are specified both in the path
* and as separate parameters, an exception is thrown
* @param queryString the URI query string (cannot be specified
* if path is null)
* @param fragment the URI fragment (cannot be specified if path is null)
* @throws MalformedURIException Any of the parameters violates
* syntax rules or semantic rules
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -