001: /*
002: * The Apache Software License, Version 1.1
003: *
004: *
005: * Copyright (c) 2000-2002 The Apache Software Foundation. All rights
006: * reserved.
007: *
008: * Redistribution and use in source and binary forms, with or without
009: * modification, are permitted provided that the following conditions
010: * are met:
011: *
012: * 1. Redistributions of source code must retain the above copyright
013: * notice, this list of conditions and the following disclaimer.
014: *
015: * 2. Redistributions in binary form must reproduce the above copyright
016: * notice, this list of conditions and the following disclaimer in
017: * the documentation and/or other materials provided with the
018: * distribution.
019: *
020: * 3. The end-user documentation included with the redistribution,
021: * if any, must include the following acknowledgment:
022: * "This product includes software developed by the
023: * Apache Software Foundation (http://www.apache.org/)."
024: * Alternately, this acknowledgment may appear in the software itself,
025: * if and wherever such third-party acknowledgments normally appear.
026: *
027: * 4. The names "Xerces" and "Apache Software Foundation" must
028: * not be used to endorse or promote products derived from this
029: * software without prior written permission. For written
030: * permission, please contact apache@apache.org.
031: *
032: * 5. Products derived from this software may not be called "Apache",
033: * nor may "Apache" appear in their name, without prior written
034: * permission of the Apache Software Foundation.
035: *
036: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
037: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
038: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
039: * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
040: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
041: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
042: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
043: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
044: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
045: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
046: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
047: * SUCH DAMAGE.
048: * ====================================================================
049: *
050: * This software consists of voluntary contributions made by many
051: * individuals on behalf of the Apache Software Foundation and was
052: * originally based on software copyright (c) 1999, International
053: * Business Machines, Inc., http://www.apache.org. For more
054: * information on the Apache Software Foundation, please see
055: * <http://www.apache.org/>.
056: */
057:
058: package com.sun.xml.stream.xerces.xni;
059:
060: /**
061: * A structure that holds the components of an XML Namespaces qualified
062: * name.
063: * <p>
064: * To be used correctly, the strings must be identical references for
065: * equal strings. Within the parser, these values are considered symbols
066: * and should always be retrieved from the <code>SymbolTable</code>.
067: *
068: * @see <a href="../../../../../xerces2/com/sun/xml/stream/xerces/util/SymbolTable.html">com.sun.xml.stream.xerces.util.SymbolTable</a>
069: *
070: * @author Andy Clark, IBM
071: *
072: * @version $Id: QName.java,v 1.2 2006/04/01 06:01:45 jeffsuttor Exp $
073: */
074: public class QName implements Cloneable {
075:
076: //rawname
077: public char[] characters = null;
078: //
079: // Data
080: //
081:
082: /**
083: * The qname prefix. For example, the prefix for the qname "a:foo"
084: * is "a".
085: */
086: public String prefix;
087:
088: /**
089: * The qname localpart. For example, the localpart for the qname "a:foo"
090: * is "foo".
091: */
092: public String localpart;
093:
094: /**
095: * The qname rawname. For example, the rawname for the qname "a:foo"
096: * is "a:foo".
097: */
098: public String rawname;
099:
100: /**
101: * The URI to which the qname prefix is bound. This binding must be
102: * performed by a XML Namespaces aware processor.
103: */
104: public String uri;
105:
106: //
107: // Constructors
108: //
109:
110: /** Default constructor. */
111: public QName() {
112: clear();
113: } // <init>()
114:
115: /** Constructs a QName with the specified values. */
116: public QName(String prefix, String localpart, String rawname,
117: String uri) {
118: setValues(prefix, localpart, rawname, uri);
119: } // <init>(String,String,String,String)
120:
121: /** Constructs a copy of the specified QName. */
122: public QName(QName qname) {
123: setValues(qname);
124: } // <init>(QName)
125:
126: //
127: // Public methods
128: //
129:
130: /**
131: * Convenience method to set the values of the qname components.
132: *
133: * @param QName The qualified name to be copied.
134: */
135: public void setValues(QName qname) {
136: prefix = qname.prefix;
137: localpart = qname.localpart;
138: rawname = qname.rawname;
139: uri = qname.uri;
140: characters = qname.characters;
141: } // setValues(QName)
142:
143: /**
144: * Convenience method to set the values of the qname components.
145: *
146: * @param prefix The qname prefix. (e.g. "a")
147: * @param localpart The qname localpart. (e.g. "foo")
148: * @param rawname The qname rawname. (e.g. "a:foo")
149: * @param uri The URI binding. (e.g. "http://foo.com/mybinding")
150: */
151: public void setValues(String prefix, String localpart,
152: String rawname, String uri) {
153: this .prefix = prefix;
154: this .localpart = localpart;
155: this .rawname = rawname;
156: this .uri = uri;
157: } // setValues(String,String,String,String)
158:
159: /** Clears the values of the qname components. */
160: public void clear() {
161: prefix = null;
162: localpart = null;
163: rawname = null;
164: uri = null;
165: } // clear()
166:
167: //
168: // Cloneable methods
169: //
170:
171: /** Returns a clone of this object. */
172: public Object clone() {
173: return new QName(this );
174: } // clone():Object
175:
176: //
177: // Object methods
178: //
179:
180: /** Returns the hashcode for this object. */
181: public int hashCode() {
182: if (uri != null) {
183: return uri.hashCode() + localpart.hashCode();
184: }
185: return rawname.hashCode();
186: } // hashCode():int
187:
188: /** Returns true if the two objects are equal. */
189: public boolean equals(Object object) {
190: if (object instanceof QName) {
191: QName qname = (QName) object;
192: if (qname.uri != null) {
193: return uri == qname.uri && localpart == qname.localpart;
194: } else if (uri == null) {
195: return rawname == qname.rawname;
196: }
197: // fall through and return not equal
198: }
199: return false;
200: } // equals(Object):boolean
201:
202: /** Returns a string representation of this object. */
203: public String toString() {
204:
205: StringBuffer str = new StringBuffer();
206: boolean comma = false;
207: if (prefix != null) {
208: str.append("prefix=\"" + prefix + '"');
209: comma = true;
210: }
211: if (localpart != null) {
212: if (comma) {
213: str.append(',');
214: }
215: str.append("localpart=\"" + localpart + '"');
216: comma = true;
217: }
218: if (rawname != null) {
219: if (comma) {
220: str.append(',');
221: }
222: str.append("rawname=\"" + rawname + '"');
223: comma = true;
224: }
225: if (uri != null) {
226: if (comma) {
227: str.append(',');
228: }
229: str.append("uri=\"" + uri + '"');
230: }
231: return str.toString();
232:
233: } // toString():String
234:
235: } // class QName
|