aoqi@0: /* aoqi@0: * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. aoqi@0: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@0: * aoqi@0: * This code is free software; you can redistribute it and/or modify it aoqi@0: * under the terms of the GNU General Public License version 2 only, as aoqi@0: * published by the Free Software Foundation. Oracle designates this aoqi@0: * particular file as subject to the "Classpath" exception as provided aoqi@0: * by Oracle in the LICENSE file that accompanied this code. aoqi@0: * aoqi@0: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: * version 2 for more details (a copy is included in the LICENSE file that aoqi@0: * accompanied this code). aoqi@0: * aoqi@0: * You should have received a copy of the GNU General Public License version aoqi@0: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@0: * aoqi@0: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: * or visit www.oracle.com if you need additional information or have any aoqi@0: * questions. aoqi@0: */ aoqi@0: aoqi@0: /** aoqi@0: * aoqi@0: * @author SAAJ RI Development Team aoqi@0: */ aoqi@0: package com.sun.xml.internal.messaging.saaj.soap.ver1_1; aoqi@0: aoqi@0: import java.util.Iterator; aoqi@0: import java.util.Locale; aoqi@0: import java.util.logging.Logger; aoqi@0: import java.util.logging.Level; aoqi@0: aoqi@0: import javax.xml.namespace.QName; aoqi@0: import javax.xml.soap.SOAPElement; aoqi@0: import javax.xml.soap.SOAPFaultElement; aoqi@0: import javax.xml.soap.SOAPException; aoqi@0: import javax.xml.soap.SOAPConstants; aoqi@0: import javax.xml.soap.Name; aoqi@0: import javax.xml.soap.Name; aoqi@0: aoqi@0: import com.sun.xml.internal.messaging.saaj.soap.SOAPDocument; aoqi@0: import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl; aoqi@0: import com.sun.xml.internal.messaging.saaj.soap.impl.*; aoqi@0: import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl; aoqi@0: import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants; aoqi@0: import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl; aoqi@0: aoqi@0: aoqi@0: public class Fault1_1Impl extends FaultImpl { aoqi@0: aoqi@0: protected static final Logger log = aoqi@0: Logger.getLogger( aoqi@0: LogDomainConstants.SOAP_VER1_1_DOMAIN, aoqi@0: "com.sun.xml.internal.messaging.saaj.soap.ver1_1.LocalStrings"); aoqi@0: aoqi@0: public Fault1_1Impl(SOAPDocumentImpl ownerDocument, String prefix) { aoqi@0: super(ownerDocument, NameImpl.createFault1_1Name(prefix)); aoqi@0: } aoqi@0: aoqi@0: protected NameImpl getDetailName() { aoqi@0: return NameImpl.createDetail1_1Name(); aoqi@0: } aoqi@0: aoqi@0: protected NameImpl getFaultCodeName() { aoqi@0: return NameImpl.createFromUnqualifiedName("faultcode"); aoqi@0: } aoqi@0: aoqi@0: protected NameImpl getFaultStringName() { aoqi@0: return NameImpl.createFromUnqualifiedName("faultstring"); aoqi@0: } aoqi@0: aoqi@0: protected NameImpl getFaultActorName() { aoqi@0: return NameImpl.createFromUnqualifiedName("faultactor"); aoqi@0: } aoqi@0: aoqi@0: protected DetailImpl createDetail() { aoqi@0: return new Detail1_1Impl( aoqi@0: ((SOAPDocument) getOwnerDocument()).getDocument()); aoqi@0: } aoqi@0: aoqi@0: protected FaultElementImpl createSOAPFaultElement(String localName) { aoqi@0: return new FaultElement1_1Impl( aoqi@0: ((SOAPDocument) getOwnerDocument()).getDocument(), aoqi@0: localName); aoqi@0: } aoqi@0: aoqi@0: protected void checkIfStandardFaultCode(String faultCode, String uri) aoqi@0: throws SOAPException { aoqi@0: // SOAP 1.1 doesn't seem to mandate using faultcode from a particular aoqi@0: // set of values. aoqi@0: // Also need to be backward compatible. aoqi@0: } aoqi@0: aoqi@0: protected void finallySetFaultCode(String faultcode) throws SOAPException { aoqi@0: this.faultCodeElement.addTextNode(faultcode); aoqi@0: } aoqi@0: aoqi@0: public String getFaultCode() { aoqi@0: if (this.faultCodeElement == null) aoqi@0: findFaultCodeElement(); aoqi@0: return this.faultCodeElement.getValue(); aoqi@0: } aoqi@0: aoqi@0: public Name getFaultCodeAsName() { aoqi@0: aoqi@0: String faultcodeString = getFaultCode(); aoqi@0: if (faultcodeString == null) { aoqi@0: return null; aoqi@0: } aoqi@0: int prefixIndex = faultcodeString.indexOf(':'); aoqi@0: if (prefixIndex == -1) { aoqi@0: // Not a valid SOAP message, but we return the unqualified name aoqi@0: // anyway since some apps do not strictly conform to SOAP aoqi@0: // specs. A message that does not contain a aoqi@0: // element itself is also not valid in which case we return aoqi@0: // null instead of throwing an exception so this is consistent. aoqi@0: return NameImpl.createFromUnqualifiedName(faultcodeString); aoqi@0: } aoqi@0: aoqi@0: // Get the prefix and map it to a namespace name (AKA namespace URI) aoqi@0: String prefix = faultcodeString.substring(0, prefixIndex); aoqi@0: if (this.faultCodeElement == null) aoqi@0: findFaultCodeElement(); aoqi@0: String nsName = this.faultCodeElement.getNamespaceURI(prefix); aoqi@0: return NameImpl.createFromQualifiedName(faultcodeString, nsName); aoqi@0: } aoqi@0: aoqi@0: public QName getFaultCodeAsQName() { aoqi@0: String faultcodeString = getFaultCode(); aoqi@0: if (faultcodeString == null) { aoqi@0: return null; aoqi@0: } aoqi@0: if (this.faultCodeElement == null) aoqi@0: findFaultCodeElement(); aoqi@0: return convertCodeToQName(faultcodeString, this.faultCodeElement); aoqi@0: } aoqi@0: aoqi@0: public void setFaultString(String faultString) throws SOAPException { aoqi@0: aoqi@0: if (this.faultStringElement == null) aoqi@0: findFaultStringElement(); aoqi@0: aoqi@0: if (this.faultStringElement == null) aoqi@0: this.faultStringElement = addSOAPFaultElement("faultstring"); aoqi@0: else { aoqi@0: this.faultStringElement.removeContents(); aoqi@0: //this.faultStringElement.removeAttributeNS("http://www.w3.org/XML/1998/namespace", "lang"); aoqi@0: this.faultStringElement.removeAttribute("xml:lang"); aoqi@0: } aoqi@0: aoqi@0: this.faultStringElement.addTextNode(faultString); aoqi@0: } aoqi@0: aoqi@0: public String getFaultString() { aoqi@0: if (this.faultStringElement == null) aoqi@0: findFaultStringElement(); aoqi@0: return this.faultStringElement.getValue(); aoqi@0: aoqi@0: } aoqi@0: aoqi@0: public Locale getFaultStringLocale() { aoqi@0: if (this.faultStringElement == null) aoqi@0: findFaultStringElement(); aoqi@0: if (this.faultStringElement != null) { aoqi@0: String xmlLangAttr = aoqi@0: this.faultStringElement.getAttributeValue( aoqi@0: NameImpl.createFromUnqualifiedName("xml:lang")); aoqi@0: if (xmlLangAttr != null) aoqi@0: return xmlLangToLocale(xmlLangAttr); aoqi@0: } aoqi@0: return null; aoqi@0: } aoqi@0: aoqi@0: public void setFaultString(String faultString, Locale locale) aoqi@0: throws SOAPException { aoqi@0: setFaultString(faultString); aoqi@0: this.faultStringElement.addAttribute( aoqi@0: NameImpl.createFromTagName("xml:lang"), aoqi@0: localeToXmlLang(locale)); aoqi@0: } aoqi@0: aoqi@0: protected boolean isStandardFaultElement(String localName) { aoqi@0: if (localName.equalsIgnoreCase("detail") || aoqi@0: localName.equalsIgnoreCase("faultcode") || aoqi@0: localName.equalsIgnoreCase("faultstring") || aoqi@0: localName.equalsIgnoreCase("faultactor")) { aoqi@0: return true; aoqi@0: } aoqi@0: return false; aoqi@0: } aoqi@0: aoqi@0: public void appendFaultSubcode(QName subcode) { aoqi@0: log.log( aoqi@0: Level.SEVERE, aoqi@0: "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1", aoqi@0: "appendFaultSubcode"); aoqi@0: throw new UnsupportedOperationException("Not supported in SOAP 1.1"); aoqi@0: } aoqi@0: aoqi@0: public void removeAllFaultSubcodes() { aoqi@0: log.log( aoqi@0: Level.SEVERE, aoqi@0: "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1", aoqi@0: "removeAllFaultSubcodes"); aoqi@0: throw new UnsupportedOperationException("Not supported in SOAP 1.1"); aoqi@0: } aoqi@0: aoqi@0: public Iterator getFaultSubcodes() { aoqi@0: log.log( aoqi@0: Level.SEVERE, aoqi@0: "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1", aoqi@0: "getFaultSubcodes"); aoqi@0: throw new UnsupportedOperationException("Not supported in SOAP 1.1"); aoqi@0: } aoqi@0: aoqi@0: public String getFaultReasonText(Locale locale) { aoqi@0: log.log( aoqi@0: Level.SEVERE, aoqi@0: "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1", aoqi@0: "getFaultReasonText"); aoqi@0: throw new UnsupportedOperationException("Not supported in SOAP 1.1"); aoqi@0: } aoqi@0: aoqi@0: public Iterator getFaultReasonTexts() { aoqi@0: log.log( aoqi@0: Level.SEVERE, aoqi@0: "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1", aoqi@0: "getFaultReasonTexts"); aoqi@0: throw new UnsupportedOperationException("Not supported in SOAP 1.1"); aoqi@0: } aoqi@0: aoqi@0: public Iterator getFaultReasonLocales() { aoqi@0: log.log( aoqi@0: Level.SEVERE, aoqi@0: "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1", aoqi@0: "getFaultReasonLocales"); aoqi@0: throw new UnsupportedOperationException("Not supported in SOAP 1.1"); aoqi@0: } aoqi@0: aoqi@0: public void addFaultReasonText(String text, java.util.Locale locale) aoqi@0: throws SOAPException { aoqi@0: log.log( aoqi@0: Level.SEVERE, aoqi@0: "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1", aoqi@0: "addFaultReasonText"); aoqi@0: throw new UnsupportedOperationException("Not supported in SOAP 1.1"); aoqi@0: } aoqi@0: aoqi@0: public String getFaultRole() { aoqi@0: log.log( aoqi@0: Level.SEVERE, aoqi@0: "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1", aoqi@0: "getFaultRole"); aoqi@0: throw new UnsupportedOperationException("Not supported in SOAP 1.1"); aoqi@0: } aoqi@0: aoqi@0: public void setFaultRole(String uri) { aoqi@0: log.log( aoqi@0: Level.SEVERE, aoqi@0: "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1", aoqi@0: "setFaultRole"); aoqi@0: throw new UnsupportedOperationException("Not supported in SOAP 1.1"); aoqi@0: } aoqi@0: aoqi@0: public String getFaultNode() { aoqi@0: log.log( aoqi@0: Level.SEVERE, aoqi@0: "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1", aoqi@0: "getFaultNode"); aoqi@0: throw new UnsupportedOperationException("Not supported in SOAP 1.1"); aoqi@0: } aoqi@0: aoqi@0: public void setFaultNode(String uri) { aoqi@0: log.log( aoqi@0: Level.SEVERE, aoqi@0: "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1", aoqi@0: "setFaultNode"); aoqi@0: throw new UnsupportedOperationException("Not supported in SOAP 1.1"); aoqi@0: } aoqi@0: aoqi@0: protected QName getDefaultFaultCode() { aoqi@0: return new QName(SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE, "Server"); aoqi@0: } aoqi@0: aoqi@0: public SOAPElement addChildElement(SOAPElement element) aoqi@0: throws SOAPException { aoqi@0: String localName = element.getLocalName(); aoqi@0: if ("Detail".equalsIgnoreCase(localName)) { aoqi@0: if (hasDetail()) { aoqi@0: log.severe("SAAJ0305.ver1_2.detail.exists.error"); aoqi@0: throw new SOAPExceptionImpl("Cannot add Detail, Detail already exists"); aoqi@0: } aoqi@0: } aoqi@0: return super.addChildElement(element); aoqi@0: } aoqi@0: aoqi@0: protected FaultElementImpl createSOAPFaultElement(QName qname) { aoqi@0: return new FaultElement1_1Impl( aoqi@0: ((SOAPDocument) getOwnerDocument()).getDocument(), aoqi@0: qname); aoqi@0: } aoqi@0: aoqi@0: protected FaultElementImpl createSOAPFaultElement(Name qname) { aoqi@0: return new FaultElement1_1Impl( aoqi@0: ((SOAPDocument) getOwnerDocument()).getDocument(), aoqi@0: (NameImpl)qname); aoqi@0: } aoqi@0: aoqi@0: public void setFaultCode(String faultCode, String prefix, String uri) aoqi@0: throws SOAPException { aoqi@0: if (prefix == null || "".equals(prefix)) { aoqi@0: if (uri != null && !"".equals(uri)) { aoqi@0: prefix = getNamespacePrefix(uri); aoqi@0: if (prefix == null || "".equals(prefix)) { aoqi@0: prefix = "ns0"; aoqi@0: } aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: if (this.faultCodeElement == null) aoqi@0: findFaultCodeElement(); aoqi@0: aoqi@0: if (this.faultCodeElement == null) aoqi@0: this.faultCodeElement = addFaultCodeElement(); aoqi@0: else aoqi@0: this.faultCodeElement.removeContents(); aoqi@0: aoqi@0: if (uri == null || "".equals(uri)) { aoqi@0: if (prefix != null && !"".equals("prefix")) { aoqi@0: uri = this.faultCodeElement.getNamespaceURI(prefix); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: if (uri == null || "".equals(uri)) { aoqi@0: if (prefix != null && !"".equals(prefix)) { aoqi@0: //cannot allow an empty URI for a non-Empty prefix aoqi@0: log.log(Level.SEVERE, "SAAJ0307.impl.no.ns.URI", new Object[]{prefix + ":" + faultCode}); aoqi@0: throw new SOAPExceptionImpl("Empty/Null NamespaceURI specified for faultCode \"" + prefix + ":" + faultCode + "\""); aoqi@0: } else { aoqi@0: uri = ""; aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: checkIfStandardFaultCode(faultCode, uri); aoqi@0: ((FaultElementImpl) this.faultCodeElement).ensureNamespaceIsDeclared(prefix, uri); aoqi@0: aoqi@0: if (prefix == null || "".equals(prefix)) { aoqi@0: finallySetFaultCode(faultCode); aoqi@0: } else { aoqi@0: finallySetFaultCode(prefix + ":" + faultCode); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: private boolean standardFaultCode(String faultCode) { aoqi@0: if (faultCode.equals("VersionMismatch") || faultCode.equals("MustUnderstand") aoqi@0: || faultCode.equals("Client") || faultCode.equals("Server")) { aoqi@0: return true; aoqi@0: } aoqi@0: if (faultCode.startsWith("VersionMismatch.") || faultCode.startsWith("MustUnderstand.") aoqi@0: || faultCode.startsWith("Client.") || faultCode.startsWith("Server.")) { aoqi@0: return true; aoqi@0: } aoqi@0: return false; aoqi@0: } aoqi@0: aoqi@0: public void setFaultActor(String faultActor) throws SOAPException { aoqi@0: if (this.faultActorElement == null) aoqi@0: findFaultActorElement(); aoqi@0: if (this.faultActorElement != null) aoqi@0: this.faultActorElement.detachNode(); aoqi@0: if (faultActor == null) aoqi@0: return; aoqi@0: this.faultActorElement = aoqi@0: createSOAPFaultElement(getFaultActorName()); aoqi@0: this.faultActorElement.addTextNode(faultActor); aoqi@0: if (hasDetail()) { aoqi@0: insertBefore(this.faultActorElement, this.detail); aoqi@0: return; aoqi@0: } aoqi@0: addNode(this.faultActorElement); aoqi@0: aoqi@0: } aoqi@0: }