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