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