1 /* 2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package com.sun.xml.internal.messaging.saaj.soap.name; 27 28 import java.util.logging.Level; 29 import java.util.logging.Logger; 30 31 import javax.xml.namespace.QName; 32 import javax.xml.soap.Name; 33 import javax.xml.soap.SOAPConstants; 34 35 //import com.sun.org.apache.xerces.internal.xni.NamespaceContext; 36 import org.w3c.dom.Element; 37 import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants; 38 39 public class NameImpl implements Name { 40 public static final String XML_NAMESPACE_PREFIX = "xml"; 41 public static final String XML_SCHEMA_NAMESPACE_PREFIX = "xs"; 42 public static final String SOAP_ENVELOPE_PREFIX = "SOAP-ENV"; 43 44 public static final String XML_NAMESPACE = 45 "http://www.w3.org/XML/1998/namespace"; 46 public static final String SOAP11_NAMESPACE = 47 SOAPConstants.URI_NS_SOAP_ENVELOPE; 48 public static final String SOAP12_NAMESPACE = 49 SOAPConstants.URI_NS_SOAP_1_2_ENVELOPE; 50 public static final String XML_SCHEMA_NAMESPACE = 51 "http://www.w3.org/2001/XMLSchema"; 52 53 protected String uri = ""; 54 protected String localName = ""; 55 protected String prefix = ""; 56 private String qualifiedName = null; 57 58 protected static final Logger log = 59 Logger.getLogger(LogDomainConstants.NAMING_DOMAIN, 60 "com.sun.xml.internal.messaging.saaj.soap.name.LocalStrings"); 61 62 /** 63 * XML Information Set REC 64 * all namespace attributes (including those named xmlns, 65 * whose [prefix] property has no value) have a namespace URI of http://www.w3.org/2000/xmlns/ 66 */ 67 public final static String XMLNS_URI = "http://www.w3.org/2000/xmlns/".intern(); 68 69 protected NameImpl(String name) { 70 this.localName = name == null ? "" : name; 71 } 72 73 protected NameImpl(String name, String prefix, String uri) { 74 this.uri = uri == null ? "" : uri; 75 this.localName = name == null ? "" : name; 76 this.prefix = prefix == null ? "" : prefix; 77 78 if (this.prefix.equals("xmlns") && this.uri.equals("")) { 79 this.uri = XMLNS_URI; 80 } 81 if (this.uri.equals(XMLNS_URI) && this.prefix.equals("")) { 82 this.prefix = "xmlns"; 83 } 84 } 85 86 public static Name convertToName(QName qname) { 87 return new NameImpl(qname.getLocalPart(), 88 qname.getPrefix(), 89 qname.getNamespaceURI()); 90 } 91 92 public static QName convertToQName(Name name) { 93 return new QName(name.getURI(), 94 name.getLocalName(), 95 name.getPrefix()); 96 } 97 98 public static NameImpl createFromUnqualifiedName(String name) { 99 return new NameImpl(name); 100 } 101 102 public static Name createFromTagName(String tagName) { 103 return createFromTagAndUri(tagName, ""); 104 } 105 106 public static Name createFromQualifiedName( 107 String qualifiedName, 108 String uri) { 109 return createFromTagAndUri(qualifiedName, uri); 110 } 111 112 protected static Name createFromTagAndUri(String tagName, String uri) { 113 if (tagName == null) { 114 log.severe("SAAJ0201.name.not.created.from.null.tag"); 115 throw new IllegalArgumentException("Cannot create a name from a null tag."); 116 } 117 int index = tagName.indexOf(':'); 118 if (index < 0) { 119 return new NameImpl(tagName, "", uri); 120 } else { 121 return new NameImpl( 122 tagName.substring(index + 1), 123 tagName.substring(0, index), 124 uri); 125 } 126 } 127 128 protected static int getPrefixSeparatorIndex(String qualifiedName) { 129 int index = qualifiedName.indexOf(':'); 130 if (index < 0) { 131 log.log( 132 Level.SEVERE, 133 "SAAJ0202.name.invalid.arg.format", 134 new String[] { qualifiedName }); 135 throw new IllegalArgumentException( 136 "Argument \"" 137 + qualifiedName 138 + "\" must be of the form: \"prefix:localName\""); 139 } 140 return index; 141 } 142 143 public static String getPrefixFromQualifiedName(String qualifiedName) { 144 return qualifiedName.substring( 145 0, 146 getPrefixSeparatorIndex(qualifiedName)); 147 } 148 149 public static String getLocalNameFromQualifiedName(String qualifiedName) { 150 return qualifiedName.substring( 151 getPrefixSeparatorIndex(qualifiedName) + 1); 152 } 153 154 public static String getPrefixFromTagName(String tagName) { 155 if (isQualified(tagName)) { 156 return getPrefixFromQualifiedName(tagName); 157 } 158 return ""; 159 } 160 161 public static String getLocalNameFromTagName(String tagName) { 162 if (isQualified(tagName)) { 163 return getLocalNameFromQualifiedName(tagName); 164 } 165 return tagName; 166 } 167 168 public static boolean isQualified(String tagName) { 169 return tagName.indexOf(':') >= 0; 170 } 171 172 public static NameImpl create(String name, String prefix, String uri) { 173 if (prefix == null) 174 prefix = ""; 175 if (uri == null) 176 uri = ""; 177 if (name == null) 178 name = ""; 179 180 if (!uri.equals("") && !name.equals("")) { 181 if (uri.equals(NameImpl.SOAP11_NAMESPACE)) { 182 if (name.equalsIgnoreCase("Envelope")) 183 return createEnvelope1_1Name(prefix); 184 else if (name.equalsIgnoreCase("Header")) 185 return createHeader1_1Name(prefix); 186 else if (name.equalsIgnoreCase("Body")) 187 return createBody1_1Name(prefix); 188 else if (name.equalsIgnoreCase("Fault")) 189 return createFault1_1Name(prefix); 190 else 191 return new SOAP1_1Name(name, prefix); 192 } else if (uri.equals(SOAP12_NAMESPACE)) { 193 if (name.equalsIgnoreCase("Envelope")) 194 return createEnvelope1_2Name(prefix); 195 else if (name.equalsIgnoreCase("Header")) 196 return createHeader1_2Name(prefix); 197 else if (name.equalsIgnoreCase("Body")) 198 return createBody1_2Name(prefix); 199 else if ( 200 name.equals("Fault") 201 || name.equals("Reason") 202 || name.equals("Detail")) 203 return createFault1_2Name(name, prefix); 204 else if (name.equals("Code") || name.equals("Subcode")) 205 return createCodeSubcode1_2Name(prefix, name); 206 else 207 return new SOAP1_2Name(name, prefix); 208 } 209 210 } 211 return new NameImpl(name, prefix, uri); 212 } 213 214 public static String createQName(String prefix, String localName) { 215 if (prefix == null || prefix.equals("")) { 216 return localName; 217 } 218 return prefix + ":" + localName; 219 } 220 221 public boolean equals(Object obj) { 222 if (!(obj instanceof Name)) { 223 return false; 224 } 225 226 Name otherName = (Name) obj; 227 228 if (!uri.equals(otherName.getURI())) { 229 return false; 230 } 231 232 if (!localName.equals(otherName.getLocalName())) { 233 return false; 234 } 235 236 return true; 237 } 238 239 public int hashCode() { 240 return localName.hashCode(); 241 } 242 243 /** 244 * Get the local name part of this XML Name. 245 * 246 * @return a string for the local name. 247 */ 248 public String getLocalName() { 249 return localName; 250 } 251 252 /* getQualifiedName is inherited from QName */ 253 254 /** 255 * Returns the prefix associated with the namespace of the name. 256 * 257 * @return the prefix as a string. 258 */ 259 public String getPrefix() { 260 return prefix; 261 } 262 263 /** 264 * Returns the URI associated of the namespace. 265 * 266 * @return the uri as a string. 267 */ 268 public String getURI() { 269 return uri; 270 } 271 272 /** 273 * Returns a String version of the name suitable for use in an XML document. 274 */ 275 public String getQualifiedName() { 276 if (qualifiedName == null) { 277 if (prefix != null && prefix.length() > 0) { 278 qualifiedName = prefix + ":" + localName; 279 } else { 280 qualifiedName = localName; 281 } 282 } 283 return qualifiedName; 284 } 285 286 /** 287 * Create a name object for a SOAP1.1 Envelope. 288 */ 289 public static NameImpl createEnvelope1_1Name(String prefix) { 290 return new Envelope1_1Name(prefix); 291 } 292 293 /** 294 * Create a name object for a SOAP1.2 Envelope. 295 */ 296 public static NameImpl createEnvelope1_2Name(String prefix) { 297 return new Envelope1_2Name(prefix); 298 } 299 300 /** 301 * Create a name object for a SOAP1.1 Header. 302 */ 303 public static NameImpl createHeader1_1Name(String prefix) { 304 return new Header1_1Name(prefix); 305 } 306 307 /** 308 * Create a name object for a SOAP1.2 Header. 309 */ 310 public static NameImpl createHeader1_2Name(String prefix) { 311 return new Header1_2Name(prefix); 312 } 313 314 /** 315 * Create a name object for a SOAP1.1 Body. 316 */ 317 public static NameImpl createBody1_1Name(String prefix) { 318 return new Body1_1Name(prefix); 319 } 320 321 /** 322 * Create a name object for a SOAP1.2 Body. 323 */ 324 public static NameImpl createBody1_2Name(String prefix) { 325 return new Body1_2Name(prefix); 326 } 327 328 /** 329 * Create a name object for a SOAP1.1 Fault. 330 */ 331 public static NameImpl createFault1_1Name(String prefix) { 332 return new Fault1_1Name(prefix); 333 } 334 335 /** 336 * Create a name object for a SOAP1.2 NotUnderstood element. 337 */ 338 public static NameImpl createNotUnderstood1_2Name(String prefix) { 339 return new NotUnderstood1_2Name(prefix); 340 } 341 342 /** 343 * Create a name object for a SOAP1.2 Upgrade element. 344 */ 345 public static NameImpl createUpgrade1_2Name(String prefix) { 346 return new Upgrade1_2Name(prefix); 347 } 348 349 /** 350 * Create a name object for a SOAP1.2 SupportedEnvelope Upgrade element. 351 */ 352 public static NameImpl createSupportedEnvelope1_2Name(String prefix) { 353 return new SupportedEnvelope1_2Name(prefix); 354 } 355 356 /** 357 * Create a name object for a SOAP1.2 358 * Fault, Reason or Detail. 359 * 360 * @param localName Local Name of element 361 */ 362 public static NameImpl createFault1_2Name( 363 String localName, 364 String prefix) { 365 return new Fault1_2Name(localName, prefix); 366 } 367 368 /** 369 * Create a name object for a SOAP1.2 Fault/Code or Subcode. 370 * 371 * @param localName Either "Code" or "Subcode" 372 */ 373 public static NameImpl createCodeSubcode1_2Name( 374 String prefix, 375 String localName) { 376 return new CodeSubcode1_2Name(localName, prefix); 377 } 378 379 /** 380 * Create a name object for a SOAP1.1 Fault Detail. 381 */ 382 public static NameImpl createDetail1_1Name() { 383 return new Detail1_1Name(); 384 } 385 386 public static NameImpl createDetail1_1Name(String prefix) { 387 return new Detail1_1Name(prefix); 388 } 389 390 public static NameImpl createFaultElement1_1Name(String localName) { 391 return new FaultElement1_1Name(localName); 392 } 393 394 public static NameImpl createFaultElement1_1Name(String localName, 395 String prefix) { 396 return new FaultElement1_1Name(localName, prefix); 397 } 398 399 public static NameImpl createSOAP11Name(String string) { 400 return new SOAP1_1Name(string, null); 401 } 402 public static NameImpl createSOAP12Name(String string) { 403 return new SOAP1_2Name(string, null); 404 } 405 406 public static NameImpl createSOAP12Name(String localName, String prefix) { 407 return new SOAP1_2Name(localName, prefix); 408 } 409 410 public static NameImpl createXmlName(String localName) { 411 return new NameImpl(localName, XML_NAMESPACE_PREFIX, XML_NAMESPACE); 412 } 413 414 public static Name copyElementName(Element element) { 415 String localName = element.getLocalName(); 416 String prefix = element.getPrefix(); 417 String uri = element.getNamespaceURI(); 418 return create(localName, prefix, uri); 419 } 420 421 422 static class SOAP1_1Name extends NameImpl { 423 SOAP1_1Name(String name, String prefix) { 424 super( 425 name, 426 (prefix == null || prefix.equals("")) 427 ? NameImpl.SOAP_ENVELOPE_PREFIX 428 : prefix, 429 NameImpl.SOAP11_NAMESPACE); 430 } 431 } 432 433 static class Envelope1_1Name extends SOAP1_1Name { 434 Envelope1_1Name(String prefix) { 435 super("Envelope", prefix); 436 } 437 } 438 439 static class Header1_1Name extends SOAP1_1Name { 440 Header1_1Name(String prefix) { 441 super("Header", prefix); 442 } 443 } 444 445 static class Body1_1Name extends SOAP1_1Name { 446 Body1_1Name(String prefix) { 447 super("Body", prefix); 448 } 449 } 450 451 static class Fault1_1Name extends NameImpl { 452 Fault1_1Name(String prefix) { 453 super( 454 "Fault", 455 (prefix == null || prefix.equals("")) 456 ? SOAP_ENVELOPE_PREFIX 457 : prefix, 458 SOAP11_NAMESPACE); 459 } 460 } 461 462 static class Detail1_1Name extends NameImpl { 463 Detail1_1Name() { 464 super("detail"); 465 } 466 467 Detail1_1Name(String prefix) { 468 super("detail", prefix, ""); 469 } 470 } 471 472 static class FaultElement1_1Name extends NameImpl { 473 FaultElement1_1Name(String localName) { 474 super(localName); 475 } 476 477 FaultElement1_1Name(String localName, String prefix) { 478 super(localName, prefix, ""); 479 } 480 } 481 482 static class SOAP1_2Name extends NameImpl { 483 SOAP1_2Name(String name, String prefix) { 484 super( 485 name, 486 (prefix == null || prefix.equals("")) 487 ? SOAPConstants.SOAP_ENV_PREFIX 488 : prefix, 489 SOAP12_NAMESPACE); 490 } 491 } 492 493 static class Envelope1_2Name extends SOAP1_2Name { 494 Envelope1_2Name(String prefix) { 495 super("Envelope", prefix); 496 } 497 } 498 499 static class Header1_2Name extends SOAP1_2Name { 500 Header1_2Name(String prefix) { 501 super("Header", prefix); 502 } 503 } 504 505 static class Body1_2Name extends SOAP1_2Name { 506 Body1_2Name(String prefix) { 507 super("Body", prefix); 508 } 509 } 510 511 static class Fault1_2Name extends NameImpl { 512 Fault1_2Name(String name, String prefix) { 513 super( 514 (name == null || name.equals("")) ? "Fault" : name, 515 (prefix == null || prefix.equals("")) 516 ? SOAPConstants.SOAP_ENV_PREFIX 517 : prefix, 518 SOAP12_NAMESPACE); 519 } 520 } 521 522 static class NotUnderstood1_2Name extends NameImpl { 523 NotUnderstood1_2Name(String prefix) { 524 super( 525 "NotUnderstood", 526 (prefix == null || prefix.equals("")) 527 ? SOAPConstants.SOAP_ENV_PREFIX 528 : prefix, 529 SOAP12_NAMESPACE); 530 } 531 } 532 533 static class Upgrade1_2Name extends NameImpl { 534 Upgrade1_2Name(String prefix) { 535 super( 536 "Upgrade", 537 (prefix == null || prefix.equals("")) 538 ? SOAPConstants.SOAP_ENV_PREFIX 539 : prefix, 540 SOAP12_NAMESPACE); 541 } 542 } 543 544 static class SupportedEnvelope1_2Name extends NameImpl { 545 SupportedEnvelope1_2Name(String prefix) { 546 super( 547 "SupportedEnvelope", 548 (prefix == null || prefix.equals("")) 549 ? SOAPConstants.SOAP_ENV_PREFIX 550 : prefix, 551 SOAP12_NAMESPACE); 552 } 553 } 554 555 static class CodeSubcode1_2Name extends SOAP1_2Name { 556 CodeSubcode1_2Name(String prefix, String localName) { 557 super(prefix, localName); 558 } 559 } 560 561 }