jaxws/src/java.xml.soap/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/Fault1_1Impl.java
changeset 28641 6b05689b7445
parent 28640 01e4ca94fb0d
parent 28505 7574ac3bb6c1
child 28642 a42fefc69922
equal deleted inserted replaced
28640:01e4ca94fb0d 28641:6b05689b7445
     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 /**
       
    27 *
       
    28 * @author SAAJ RI Development Team
       
    29 */
       
    30 package com.sun.xml.internal.messaging.saaj.soap.ver1_1;
       
    31 
       
    32 import java.util.Iterator;
       
    33 import java.util.Locale;
       
    34 import java.util.logging.Logger;
       
    35 import java.util.logging.Level;
       
    36 
       
    37 import javax.xml.namespace.QName;
       
    38 import javax.xml.soap.SOAPElement;
       
    39 import javax.xml.soap.SOAPFaultElement;
       
    40 import javax.xml.soap.SOAPException;
       
    41 import javax.xml.soap.SOAPConstants;
       
    42 import javax.xml.soap.Name;
       
    43 import javax.xml.soap.Name;
       
    44 
       
    45 import com.sun.xml.internal.messaging.saaj.soap.SOAPDocument;
       
    46 import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl;
       
    47 import com.sun.xml.internal.messaging.saaj.soap.impl.*;
       
    48 import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl;
       
    49 import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants;
       
    50 import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl;
       
    51 
       
    52 
       
    53 public class Fault1_1Impl extends FaultImpl {
       
    54 
       
    55     protected static final Logger log =
       
    56         Logger.getLogger(
       
    57             LogDomainConstants.SOAP_VER1_1_DOMAIN,
       
    58             "com.sun.xml.internal.messaging.saaj.soap.ver1_1.LocalStrings");
       
    59 
       
    60     public Fault1_1Impl(SOAPDocumentImpl ownerDocument, String prefix) {
       
    61        super(ownerDocument, NameImpl.createFault1_1Name(prefix));
       
    62     }
       
    63 
       
    64     protected NameImpl getDetailName() {
       
    65         return NameImpl.createDetail1_1Name();
       
    66     }
       
    67 
       
    68     protected NameImpl getFaultCodeName() {
       
    69         return NameImpl.createFromUnqualifiedName("faultcode");
       
    70     }
       
    71 
       
    72     protected NameImpl getFaultStringName() {
       
    73         return NameImpl.createFromUnqualifiedName("faultstring");
       
    74     }
       
    75 
       
    76     protected NameImpl getFaultActorName() {
       
    77         return NameImpl.createFromUnqualifiedName("faultactor");
       
    78     }
       
    79 
       
    80     protected DetailImpl createDetail() {
       
    81         return new Detail1_1Impl(
       
    82                        ((SOAPDocument) getOwnerDocument()).getDocument());
       
    83     }
       
    84 
       
    85     protected FaultElementImpl createSOAPFaultElement(String localName) {
       
    86         return new FaultElement1_1Impl(
       
    87                        ((SOAPDocument) getOwnerDocument()).getDocument(),
       
    88                        localName);
       
    89     }
       
    90 
       
    91     protected void checkIfStandardFaultCode(String faultCode, String uri)
       
    92         throws SOAPException {
       
    93         // SOAP 1.1 doesn't seem to mandate using faultcode from a particular
       
    94         // set of values.
       
    95         // Also need to be backward compatible.
       
    96     }
       
    97 
       
    98     protected void finallySetFaultCode(String faultcode) throws SOAPException {
       
    99         this.faultCodeElement.addTextNode(faultcode);
       
   100     }
       
   101 
       
   102     public String getFaultCode() {
       
   103         if (this.faultCodeElement == null)
       
   104             findFaultCodeElement();
       
   105         return this.faultCodeElement.getValue();
       
   106     }
       
   107 
       
   108     public Name getFaultCodeAsName() {
       
   109 
       
   110         String faultcodeString = getFaultCode();
       
   111         if (faultcodeString == null) {
       
   112             return null;
       
   113         }
       
   114         int prefixIndex = faultcodeString.indexOf(':');
       
   115         if (prefixIndex == -1) {
       
   116             // Not a valid SOAP message, but we return the unqualified name
       
   117             // anyway since some apps do not strictly conform to SOAP
       
   118             // specs.  A message that does not contain a <faultcode>
       
   119             // element itself is also not valid in which case we return
       
   120             // null instead of throwing an exception so this is consistent.
       
   121             return NameImpl.createFromUnqualifiedName(faultcodeString);
       
   122         }
       
   123 
       
   124         // Get the prefix and map it to a namespace name (AKA namespace URI)
       
   125         String prefix = faultcodeString.substring(0, prefixIndex);
       
   126         if (this.faultCodeElement == null)
       
   127             findFaultCodeElement();
       
   128         String nsName = this.faultCodeElement.getNamespaceURI(prefix);
       
   129         return NameImpl.createFromQualifiedName(faultcodeString, nsName);
       
   130     }
       
   131 
       
   132     public QName getFaultCodeAsQName() {
       
   133         String faultcodeString = getFaultCode();
       
   134         if (faultcodeString == null) {
       
   135             return null;
       
   136         }
       
   137         if (this.faultCodeElement == null)
       
   138             findFaultCodeElement();
       
   139         return convertCodeToQName(faultcodeString, this.faultCodeElement);
       
   140     }
       
   141 
       
   142     public void setFaultString(String faultString) throws SOAPException {
       
   143 
       
   144         if (this.faultStringElement == null)
       
   145             findFaultStringElement();
       
   146 
       
   147         if (this.faultStringElement == null)
       
   148             this.faultStringElement = addSOAPFaultElement("faultstring");
       
   149         else {
       
   150             this.faultStringElement.removeContents();
       
   151             //this.faultStringElement.removeAttributeNS("http://www.w3.org/XML/1998/namespace", "lang");
       
   152             this.faultStringElement.removeAttribute("xml:lang");
       
   153         }
       
   154 
       
   155         this.faultStringElement.addTextNode(faultString);
       
   156     }
       
   157 
       
   158     public String getFaultString() {
       
   159         if (this.faultStringElement == null)
       
   160             findFaultStringElement();
       
   161         return this.faultStringElement.getValue();
       
   162 
       
   163     }
       
   164 
       
   165     public Locale getFaultStringLocale() {
       
   166         if (this.faultStringElement == null)
       
   167             findFaultStringElement();
       
   168         if (this.faultStringElement != null) {
       
   169             String xmlLangAttr =
       
   170                 this.faultStringElement.getAttributeValue(
       
   171                     NameImpl.createFromUnqualifiedName("xml:lang"));
       
   172             if (xmlLangAttr != null)
       
   173                 return xmlLangToLocale(xmlLangAttr);
       
   174         }
       
   175         return null;
       
   176     }
       
   177 
       
   178     public void setFaultString(String faultString, Locale locale)
       
   179         throws SOAPException {
       
   180         setFaultString(faultString);
       
   181         this.faultStringElement.addAttribute(
       
   182             NameImpl.createFromTagName("xml:lang"),
       
   183             localeToXmlLang(locale));
       
   184     }
       
   185 
       
   186     protected boolean isStandardFaultElement(String localName) {
       
   187         if (localName.equalsIgnoreCase("detail") ||
       
   188             localName.equalsIgnoreCase("faultcode") ||
       
   189             localName.equalsIgnoreCase("faultstring") ||
       
   190             localName.equalsIgnoreCase("faultactor")) {
       
   191             return true;
       
   192         }
       
   193         return false;
       
   194     }
       
   195 
       
   196     public void appendFaultSubcode(QName subcode) {
       
   197         log.log(
       
   198             Level.SEVERE,
       
   199             "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1",
       
   200             "appendFaultSubcode");
       
   201         throw new UnsupportedOperationException("Not supported in SOAP 1.1");
       
   202     }
       
   203 
       
   204     public void removeAllFaultSubcodes() {
       
   205         log.log(
       
   206             Level.SEVERE,
       
   207             "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1",
       
   208             "removeAllFaultSubcodes");
       
   209         throw new UnsupportedOperationException("Not supported in SOAP 1.1");
       
   210     }
       
   211 
       
   212     public Iterator getFaultSubcodes() {
       
   213         log.log(
       
   214             Level.SEVERE,
       
   215             "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1",
       
   216             "getFaultSubcodes");
       
   217         throw new UnsupportedOperationException("Not supported in SOAP 1.1");
       
   218     }
       
   219 
       
   220     public String getFaultReasonText(Locale locale) {
       
   221         log.log(
       
   222             Level.SEVERE,
       
   223             "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1",
       
   224             "getFaultReasonText");
       
   225         throw new UnsupportedOperationException("Not supported in SOAP 1.1");
       
   226     }
       
   227 
       
   228     public Iterator getFaultReasonTexts() {
       
   229         log.log(
       
   230             Level.SEVERE,
       
   231             "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1",
       
   232             "getFaultReasonTexts");
       
   233         throw new UnsupportedOperationException("Not supported in SOAP 1.1");
       
   234     }
       
   235 
       
   236     public Iterator getFaultReasonLocales() {
       
   237         log.log(
       
   238             Level.SEVERE,
       
   239             "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1",
       
   240             "getFaultReasonLocales");
       
   241         throw new UnsupportedOperationException("Not supported in SOAP 1.1");
       
   242     }
       
   243 
       
   244     public void addFaultReasonText(String text, java.util.Locale locale)
       
   245         throws SOAPException {
       
   246         log.log(
       
   247             Level.SEVERE,
       
   248             "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1",
       
   249             "addFaultReasonText");
       
   250         throw new UnsupportedOperationException("Not supported in SOAP 1.1");
       
   251     }
       
   252 
       
   253     public String getFaultRole() {
       
   254         log.log(
       
   255             Level.SEVERE,
       
   256             "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1",
       
   257             "getFaultRole");
       
   258         throw new UnsupportedOperationException("Not supported in SOAP 1.1");
       
   259     }
       
   260 
       
   261     public void setFaultRole(String uri) {
       
   262         log.log(
       
   263             Level.SEVERE,
       
   264             "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1",
       
   265             "setFaultRole");
       
   266         throw new UnsupportedOperationException("Not supported in SOAP 1.1");
       
   267     }
       
   268 
       
   269     public String getFaultNode() {
       
   270         log.log(
       
   271             Level.SEVERE,
       
   272             "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1",
       
   273             "getFaultNode");
       
   274         throw new UnsupportedOperationException("Not supported in SOAP 1.1");
       
   275     }
       
   276 
       
   277     public void setFaultNode(String uri) {
       
   278         log.log(
       
   279             Level.SEVERE,
       
   280             "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1",
       
   281             "setFaultNode");
       
   282         throw new UnsupportedOperationException("Not supported in SOAP 1.1");
       
   283     }
       
   284 
       
   285     protected QName getDefaultFaultCode() {
       
   286         return new QName(SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE, "Server");
       
   287     }
       
   288 
       
   289     public SOAPElement addChildElement(SOAPElement element)
       
   290         throws SOAPException {
       
   291         String localName = element.getLocalName();
       
   292         if ("Detail".equalsIgnoreCase(localName)) {
       
   293             if (hasDetail()) {
       
   294                 log.severe("SAAJ0305.ver1_2.detail.exists.error");
       
   295                 throw new SOAPExceptionImpl("Cannot add Detail, Detail already exists");
       
   296             }
       
   297         }
       
   298         return super.addChildElement(element);
       
   299     }
       
   300 
       
   301     protected FaultElementImpl createSOAPFaultElement(QName qname) {
       
   302          return new FaultElement1_1Impl(
       
   303                        ((SOAPDocument) getOwnerDocument()).getDocument(),
       
   304                        qname);
       
   305     }
       
   306 
       
   307     protected FaultElementImpl createSOAPFaultElement(Name qname) {
       
   308          return new FaultElement1_1Impl(
       
   309                        ((SOAPDocument) getOwnerDocument()).getDocument(),
       
   310                        (NameImpl)qname);
       
   311     }
       
   312 
       
   313     public void setFaultCode(String faultCode, String prefix, String uri)
       
   314         throws SOAPException {
       
   315         if (prefix == null || "".equals(prefix)) {
       
   316             if (uri != null && !"".equals(uri)) {
       
   317                 prefix = getNamespacePrefix(uri);
       
   318                 if (prefix == null || "".equals(prefix)) {
       
   319                     prefix = "ns0";
       
   320                 }
       
   321             }
       
   322         }
       
   323 
       
   324         if (this.faultCodeElement == null)
       
   325             findFaultCodeElement();
       
   326 
       
   327         if (this.faultCodeElement == null)
       
   328             this.faultCodeElement = addFaultCodeElement();
       
   329         else
       
   330             this.faultCodeElement.removeContents();
       
   331 
       
   332         if (uri == null || "".equals(uri)) {
       
   333             if (prefix != null && !"".equals("prefix")) {
       
   334                 uri = this.faultCodeElement.getNamespaceURI(prefix);
       
   335             }
       
   336         }
       
   337 
       
   338         if (uri == null || "".equals(uri)) {
       
   339             if (prefix != null && !"".equals(prefix)) {
       
   340                 //cannot allow an empty URI for a non-Empty prefix
       
   341                 log.log(Level.SEVERE, "SAAJ0307.impl.no.ns.URI", new Object[]{prefix + ":" + faultCode});
       
   342                 throw new SOAPExceptionImpl("Empty/Null NamespaceURI specified for faultCode \"" + prefix + ":" + faultCode + "\"");
       
   343             } else {
       
   344                 uri = "";
       
   345             }
       
   346         }
       
   347 
       
   348         checkIfStandardFaultCode(faultCode, uri);
       
   349         ((FaultElementImpl) this.faultCodeElement).ensureNamespaceIsDeclared(prefix, uri);
       
   350 
       
   351         if (prefix == null || "".equals(prefix)) {
       
   352             finallySetFaultCode(faultCode);
       
   353         } else {
       
   354             finallySetFaultCode(prefix + ":" + faultCode);
       
   355         }
       
   356     }
       
   357 
       
   358     private boolean standardFaultCode(String faultCode) {
       
   359         if (faultCode.equals("VersionMismatch") || faultCode.equals("MustUnderstand")
       
   360             || faultCode.equals("Client") || faultCode.equals("Server")) {
       
   361             return true;
       
   362         }
       
   363         if (faultCode.startsWith("VersionMismatch.") || faultCode.startsWith("MustUnderstand.")
       
   364             || faultCode.startsWith("Client.") || faultCode.startsWith("Server.")) {
       
   365             return true;
       
   366         }
       
   367         return false;
       
   368     }
       
   369 
       
   370      public void setFaultActor(String faultActor) throws SOAPException {
       
   371         if (this.faultActorElement == null)
       
   372             findFaultActorElement();
       
   373         if (this.faultActorElement != null)
       
   374             this.faultActorElement.detachNode();
       
   375         if (faultActor == null)
       
   376             return;
       
   377         this.faultActorElement =
       
   378             createSOAPFaultElement(getFaultActorName());
       
   379         this.faultActorElement.addTextNode(faultActor);
       
   380         if (hasDetail()) {
       
   381             insertBefore(this.faultActorElement, this.detail);
       
   382             return;
       
   383         }
       
   384         addNode(this.faultActorElement);
       
   385 
       
   386     }
       
   387 }