1 /* 2 * reserved comment block 3 * DO NOT REMOVE OR ALTER! 4 */ 5 /* 6 * The Apache Software License, Version 1.1 7 * 8 * 9 * Copyright (c) 2000-2002 The Apache Software Foundation. All rights 10 * reserved. 11 * 12 * Redistribution and use in source and binary forms, with or without 13 * modification, are permitted provided that the following conditions 14 * are met: 15 * 16 * 1. Redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer. 18 * 19 * 2. Redistributions in binary form must reproduce the above copyright 20 * notice, this list of conditions and the following disclaimer in 21 * the documentation and/or other materials provided with the 22 * distribution. 23 * 24 * 3. The end-user documentation included with the redistribution, 25 * if any, must include the following acknowledgment: 26 * "This product includes software developed by the 27 * Apache Software Foundation (http://www.apache.org/)." 28 * Alternately, this acknowledgment may appear in the software itself, 29 * if and wherever such third-party acknowledgments normally appear. 30 * 31 * 4. The names "Xerces" and "Apache Software Foundation" must 32 * not be used to endorse or promote products derived from this 33 * software without prior written permission. For written 34 * permission, please contact apache@apache.org. 35 * 36 * 5. Products derived from this software may not be called "Apache", 37 * nor may "Apache" appear in their name, without prior written 38 * permission of the Apache Software Foundation. 39 * 40 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 41 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 42 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 43 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR 44 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 45 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 46 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 47 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 48 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 49 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 50 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51 * SUCH DAMAGE. 52 * ==================================================================== 53 * 54 * This software consists of voluntary contributions made by many 55 * individuals on behalf of the Apache Software Foundation and was 56 * originally based on software copyright (c) 1999, International 57 * Business Machines, Inc., http://www.apache.org. For more 58 * information on the Apache Software Foundation, please see 59 * <http://www.apache.org/>. 60 */ 61 62 package com.sun.org.apache.xerces.internal.xni; 63 64 /** 65 * A structure that holds the components of an XML Namespaces qualified 66 * name. 67 * <p> 68 * To be used correctly, the strings must be identical references for 69 * equal strings. Within the parser, these values are considered symbols 70 * and should always be retrieved from the <code>SymbolTable</code>. 71 * 72 * @see <a href="../../../../../xerces2/com/sun/org/apache/xerces/internal/util/SymbolTable.html">com.sun.org.apache.xerces.internal.util.SymbolTable</a> 73 * 74 * @author Andy Clark, IBM 75 * 76 * Better performance patch for the equals method by Daniel Petersson: refer to jaxp issue 61; 77 * == were used to compare strings 78 * @author Joe Wang, Oracle 79 * 80 * @version $Id: QName.java,v 1.6 2010/03/18 19:32:31 joehw Exp $ 81 */ 82 public class QName 83 implements Cloneable { 84 85 86 /** 87 * The qname prefix. For example, the prefix for the qname "a:foo" 88 * is "a". 89 */ 90 public String prefix; 91 92 /** 93 * The qname localpart. For example, the localpart for the qname "a:foo" 94 * is "foo". 95 */ 96 public String localpart; 97 98 /** 99 * The qname rawname. For example, the rawname for the qname "a:foo" 100 * is "a:foo". 101 */ 102 public String rawname; 103 104 /** 105 * The URI to which the qname prefix is bound. This binding must be 106 * performed by a XML Namespaces aware processor. 107 */ 108 public String uri; 109 110 // 111 // Constructors 112 // 113 114 /** Default constructor. */ 115 public QName() { 116 clear(); 117 } // <init>() 118 119 /** Constructs a QName with the specified values. */ 120 public QName(String prefix, String localpart, String rawname, String uri) { 121 setValues(prefix, localpart, rawname, uri); 122 } // <init>(String,String,String,String) 123 124 /** Constructs a copy of the specified QName. */ 125 public QName(QName qname) { 126 setValues(qname); 127 } // <init>(QName) 128 129 // 130 // Public methods 131 // 132 133 /** 134 * Convenience method to set the values of the qname components. 135 * 136 * @param QName The qualified name to be copied. 137 */ 138 public void setValues(QName qname) { 139 prefix = qname.prefix; 140 localpart = qname.localpart; 141 rawname = qname.rawname; 142 uri = qname.uri; 143 } // setValues(QName) 144 145 /** 146 * Convenience method to set the values of the qname components. 147 * 148 * @param prefix The qname prefix. (e.g. "a") 149 * @param localpart The qname localpart. (e.g. "foo") 150 * @param rawname The qname rawname. (e.g. "a:foo") 151 * @param uri The URI binding. (e.g. "http://foo.com/mybinding") 152 */ 153 public void setValues(String prefix, String localpart, String rawname, 154 String uri) { 155 this.prefix = prefix; 156 this.localpart = localpart; 157 this.rawname = rawname; 158 this.uri = uri; 159 } // setValues(String,String,String,String) 160 161 /** Clears the values of the qname components. */ 162 public void clear() { 163 prefix = null; 164 localpart = null; 165 rawname = null; 166 uri = null; 167 } // clear() 168 169 // 170 // Cloneable methods 171 // 172 173 /** Returns a clone of this object. */ 174 public Object clone() { 175 return new QName(this); 176 } // clone():Object 177 178 // 179 // Object methods 180 // 181 182 /** Returns the hashcode for this object. */ 183 public int hashCode() { 184 if (uri != null) { 185 return uri.hashCode() + 186 ((localpart != null) ? localpart.hashCode() : 0); 187 } 188 return (rawname != null) ? rawname.hashCode() : 0; 189 } // hashCode():int 190 191 /** Returns true if the two objects are equal. */ 192 public boolean equals(Object object) { 193 if (object == this) { 194 return true; 195 } 196 197 if (object != null && object instanceof QName) { 198 QName qname = (QName)object; 199 if (qname.uri != null) { 200 return qname.localpart.equals(localpart) && qname.uri.equals(uri); 201 } 202 else if (uri == null) { 203 return rawname.equals(qname.rawname); 204 } 205 // fall through and return not equal 206 } 207 return false; 208 } // equals(Object):boolean 209 210 /** Returns a string representation of this object. */ 211 public String toString() { 212 213 StringBuffer str = new StringBuffer(); 214 boolean comma = false; 215 if (prefix != null) { 216 str.append("prefix=\""+prefix+'"'); 217 comma = true; 218 } 219 if (localpart != null) { 220 if (comma) { 221 str.append(','); 222 } 223 str.append("localpart=\""+localpart+'"'); 224 comma = true; 225 } 226 if (rawname != null) { 227 if (comma) { 228 str.append(','); 229 } 230 str.append("rawname=\""+rawname+'"'); 231 comma = true; 232 } 233 if (uri != null) { 234 if (comma) { 235 str.append(','); 236 } 237 str.append("uri=\""+uri+'"'); 238 } 239 return str.toString(); 240 241 } // toString():String 242 243 } // class QName