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 }