1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/*
2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * The Apache Software License, Version 1.1
3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * reserved.
7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Redistribution and use in source and binary forms, with or without
9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * modification, are permitted provided that the following conditions
10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * are met:
11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 1. Redistributions of source code must retain the above copyright
13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *    notice, this list of conditions and the following disclaimer.
14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 2. Redistributions in binary form must reproduce the above copyright
16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *    notice, this list of conditions and the following disclaimer in
17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *    the documentation and/or other materials provided with the
18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *    distribution.
19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 3. The end-user documentation included with the redistribution,
21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *    if any, must include the following acknowledgment:
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *       "This product includes software developed by the
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *        Apache Software Foundation (http://www.apache.org/)."
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *    Alternately, this acknowledgment may appear in the software itself,
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *    if and wherever such third-party acknowledgments normally appear.
26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 4. The names "Axis" and "Apache Software Foundation" must
28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *    not be used to endorse or promote products derived from this
29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *    software without prior written permission. For written
30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *    permission, please contact apache@apache.org.
31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 5. Products derived from this software may not be called "Apache",
33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *    nor may "Apache" appear in their name, without prior written
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *    permission of the Apache Software Foundation.
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * SUCH DAMAGE.
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * ====================================================================
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * This software consists of voluntary contributions made by many
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * individuals on behalf of the Apache Software Foundation.  For more
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * information on the Apache Software Foundation, please see
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <http://www.apache.org/>.
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage com.kenai.jbosh;
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.io.IOException;
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.io.ObjectInputStream;
59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.io.Serializable;
60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <code>QName</code> class represents the value of a qualified name
63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * as specified in <a href="http://www.w3.org/TR/xmlschema-2/#QName">XML
64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Schema Part2: Datatypes specification</a>.
65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <p>
66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * The value of a QName contains a <b>namespaceURI</b>, a <b>localPart</b> and a <b>prefix</b>.
67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * The localPart provides the local part of the qualified name. The
68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * namespaceURI is a URI reference identifying the namespace.
69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @version 1.1
71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class QName implements Serializable {
73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /** comment/shared empty string */
75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private static final String emptyString = "".intern();
76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /** Field namespaceURI */
78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private String namespaceURI;
79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /** Field localPart */
81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private String localPart;
82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /** Field prefix */
84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private String prefix;
85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Constructor for the QName.
88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param localPart Local part of the QName
90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public QName(String localPart) {
92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this(emptyString, localPart, emptyString);
93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Constructor for the QName.
97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param namespaceURI Namespace URI for the QName
99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param localPart Local part of the QName.
100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public QName(String namespaceURI, String localPart) {
102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this(namespaceURI, localPart, emptyString);
103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Constructor for the QName.
107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param namespaceURI Namespace URI for the QName
109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param localPart Local part of the QName.
110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param prefix Prefix of the QName.
111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public QName(String namespaceURI, String localPart, String prefix) {
113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.namespaceURI = (namespaceURI == null)
114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                ? emptyString
115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                : namespaceURI.intern();
116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (localPart == null) {
117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            throw new IllegalArgumentException("invalid QName local part");
118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        } else {
119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.localPart = localPart.intern();
120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (prefix == null) {
123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            throw new IllegalArgumentException("invalid QName prefix");
124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        } else {
125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.prefix = prefix.intern();
126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Gets the Namespace URI for this QName
131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return Namespace URI
133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getNamespaceURI() {
135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return namespaceURI;
136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Gets the Local part for this QName
140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return Local part
142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getLocalPart() {
144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return localPart;
145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Gets the Prefix for this QName
149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
150d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return Prefix
151d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getPrefix() {
153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return prefix;
154d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
156d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns a string representation of this QName
158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return  a string representation of the QName
160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
161d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String toString() {
162d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
163d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return ((namespaceURI == emptyString)
164d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                ? localPart
165d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                : '{' + namespaceURI + '}' + localPart);
166d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
167d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
168d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
169d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Tests this QName for equality with another object.
170d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * <p>
171d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * If the given object is not a QName or is null then this method
172d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * returns <tt>false</tt>.
173d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * <p>
174d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * For two QNames to be considered equal requires that both
175d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * localPart and namespaceURI must be equal. This method uses
176d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * <code>String.equals</code> to check equality of localPart
177d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * and namespaceURI. Any class that extends QName is required
178d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * to satisfy this equality contract.
179d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * <p>
180d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * This method satisfies the general contract of the <code>Object.equals</code> method.
181d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
182d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param obj the reference object with which to compare
183d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
184d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return <code>true</code> if the given object is identical to this
185d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *      QName: <code>false</code> otherwise.
186d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
187d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public final boolean equals(Object obj) {
188d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
189d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (obj == this) {
190d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return true;
191d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
192d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
193d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (!(obj instanceof QName)) {
194d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return false;
195d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
196d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
197d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if ((namespaceURI == ((QName) obj).namespaceURI)
198d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                && (localPart == ((QName) obj).localPart)) {
199d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return true;
200d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
201d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
202d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return false;
203d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
204d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
205d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
206d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns a QName holding the value of the specified String.
207d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * <p>
208d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * The string must be in the form returned by the QName.toString()
209d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * method, i.e. "{namespaceURI}localPart", with the "{namespaceURI}"
210d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * part being optional.
211d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * <p>
212d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * This method doesn't do a full validation of the resulting QName.
213d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * In particular, it doesn't check that the resulting namespace URI
214d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * is a legal URI (per RFC 2396 and RFC 2732), nor that the resulting
215d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * local part is a legal NCName per the XML Namespaces specification.
216d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
217d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param s the string to be parsed
218d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @throws java.lang.IllegalArgumentException If the specified String cannot be parsed as a QName
219d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return QName corresponding to the given String
220d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
221d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public static QName valueOf(String s) {
222d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
223d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if ((s == null) || s.equals("")) {
224d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            throw new IllegalArgumentException("invalid QName literal");
225d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
226d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
227d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (s.charAt(0) == '{') {
228d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            int i = s.indexOf('}');
229d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
230d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (i == -1) {
231d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                throw new IllegalArgumentException("invalid QName literal");
232d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
233d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
234d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (i == s.length() - 1) {
235d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                throw new IllegalArgumentException("invalid QName literal");
236d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            } else {
237d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                return new QName(s.substring(1, i), s.substring(i + 1));
238d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
239d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        } else {
240d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return new QName(s);
241d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
242d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
243d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
244d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
245d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns a hash code value for this QName object. The hash code
246d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * is based on both the localPart and namespaceURI parts of the
247d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * QName. This method satisfies the  general contract of the
248d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * <code>Object.hashCode</code> method.
249d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
250d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return a hash code value for this Qname object
251d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
252d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public final int hashCode() {
253d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return namespaceURI.hashCode() ^ localPart.hashCode();
254d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
255d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
256d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
257d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Ensure that deserialization properly interns the results.
258d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param in the ObjectInputStream to be read
259d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
260d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private void readObject(ObjectInputStream in) throws
261d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            IOException, ClassNotFoundException {
262d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        in.defaultReadObject();
263d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
264d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        namespaceURI = namespaceURI.intern();
265d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        localPart = localPart.intern();
266d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        prefix = prefix.intern();
267d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
268d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
269d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
270