| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| package org.apache.axis2.saaj; |
| |
| import org.apache.axiom.om.OMElement; |
| import org.apache.axiom.om.OMFactory; |
| import org.apache.axiom.om.OMNamespace; |
| import org.apache.axiom.soap.SOAP11Constants; |
| import org.apache.axiom.soap.SOAP12Constants; |
| import org.apache.axiom.soap.SOAPFactory; |
| import org.apache.axiom.soap.SOAPFaultCode; |
| import org.apache.axiom.soap.SOAPFaultDetail; |
| import org.apache.axiom.soap.SOAPFaultNode; |
| import org.apache.axiom.soap.SOAPFaultReason; |
| import org.apache.axiom.soap.SOAPFaultRole; |
| import org.apache.axiom.soap.SOAPFaultSubCode; |
| import org.apache.axiom.soap.SOAPFaultText; |
| import org.apache.axiom.soap.SOAPFaultValue; |
| import org.apache.axiom.soap.SOAPVersion; |
| import org.w3c.dom.Element; |
| |
| import javax.xml.namespace.QName; |
| import javax.xml.soap.Detail; |
| import javax.xml.soap.Name; |
| import javax.xml.soap.Node; |
| import javax.xml.soap.SOAPConstants; |
| import javax.xml.soap.SOAPException; |
| import javax.xml.soap.SOAPFault; |
| import javax.xml.soap.SOAPFaultElement; |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Locale; |
| |
| public class SOAPFaultImpl extends SOAPBodyElementImpl<org.apache.axiom.soap.SOAPFault> implements SOAPFault { |
| |
| private boolean isDetailAdded; |
| private Locale faultReasonLocale; |
| private boolean defaultsSet; |
| |
| /** @param fault */ |
| public SOAPFaultImpl(org.apache.axiom.soap.SOAPFault fault) { |
| super(fault); |
| } |
| |
| void setDefaults() throws SOAPException { |
| if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP11) { |
| setFaultCode(SOAP11Constants.QNAME_SENDER_FAULTCODE); |
| } else { |
| setFaultCode(SOAP12Constants.QNAME_SENDER_FAULTCODE); |
| } |
| setFaultString("Fault string, and possibly fault code, not set"); |
| defaultsSet = true; |
| } |
| |
| void removeDefaults() { |
| if (defaultsSet) { |
| SOAPFaultReason reason = this.omTarget.getReason(); |
| if (reason != null) { |
| reason.detach(); |
| } |
| defaultsSet = false; |
| } |
| } |
| |
| /** |
| * Sets this <CODE>SOAPFault</CODE> object with the given fault code. |
| * <p/> |
| * Fault codes, which given information about the fault, are defined in the SOAP 1.1 |
| * specification. This element is mandatory in SOAP 1.1. Because the fault code is required to |
| * be a QName it is preferable to use the setFaultCode(Name)form of this method. |
| * |
| * @param faultCode - a String giving the fault code to be set. It must be of the form |
| * "prefix:localName" where the prefix has been defined in a namespace |
| * declaration. |
| * @throws SOAPException - if there was an error in adding the faultCode to the underlying XML |
| * tree. |
| * @see setFaultCode(Name), getFaultCode(),SOAPElement.addNamespaceDeclaration(String, String) |
| */ |
| public void setFaultCode(String faultCode) throws SOAPException { |
| org.apache.axiom.soap.SOAPFactory soapFactory = null; |
| SOAPFaultCode soapFaultCode = null; |
| |
| //It must be of the form "prefix:localName" where the prefix has been defined in a |
| //namespace declaration. |
| if (faultCode.indexOf(":") == -1) { |
| throw new SOAPException("faultCode must be of the form prefix:localName"); |
| } |
| // else{ |
| // String prefix,localName =""; |
| // prefix = faultCode.substring(0, faultCode.indexOf(":")); |
| // localName = faultCode.substring(faultCode.indexOf(":")+1); |
| // } |
| |
| if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP11) { |
| soapFactory = (SOAPFactory)this.omTarget.getOMFactory(); |
| soapFaultCode = soapFactory.createSOAPFaultCode(omTarget); |
| soapFaultCode.setText(faultCode); |
| } else if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP12) { |
| soapFactory = (SOAPFactory)this.omTarget.getOMFactory(); |
| soapFaultCode = soapFactory.createSOAPFaultCode(omTarget); |
| SOAPFaultValue soapFaultValue = soapFactory.createSOAPFaultValue(soapFaultCode); |
| soapFaultCode.setValue(soapFaultValue); |
| soapFaultValue.setText(faultCode); |
| } |
| |
| this.omTarget.setCode(soapFaultCode); |
| } |
| |
| /** |
| * Gets the fault code for this <CODE>SOAPFault</CODE> object. |
| * |
| * @return a <CODE>String</CODE> with the fault code |
| * @see #setFaultCode(String) setFaultCode(java.lang.String) |
| */ |
| public String getFaultCode() { |
| if (omTarget != null && omTarget.getCode() != null) { |
| if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP11) { |
| return omTarget.getCode().getText(); |
| } else if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP12) { |
| return omTarget.getCode().getValue().getText(); |
| } else { |
| return null; |
| } |
| } else { |
| return null; |
| } |
| } |
| |
| |
| /** |
| * Sets this SOAPFault object with the given fault actor.The fault actor is the recipient in the |
| * message path who caused the fault to happen. If this SOAPFault supports SOAP 1.2 then this |
| * call is equivalent to setFaultRole(String) |
| * |
| * @param faultActor - a String identifying the actor that caused this SOAPFault object |
| * @throws SOAPException - if there was an error in adding the faultActor to the underlying XML |
| * tree. |
| */ |
| public void setFaultActor(String faultActor) throws SOAPException { |
| if (this.omTarget.getRole() == null) { |
| SOAPFaultRole faultRoleImpl = ((SOAPFactory)this.omTarget.getOMFactory()).createSOAPFaultRole( |
| this.omTarget); |
| |
| faultRoleImpl.setRoleValue(faultActor); |
| this.omTarget.setRole(faultRoleImpl); |
| } else { |
| SOAPFaultRole role = this.omTarget.getRole(); |
| role.setRoleValue(faultActor); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see javax.xml.soap.SOAPFault#getFaultActor() |
| */ |
| public String getFaultActor() { |
| if (this.omTarget.getRole() != null) { |
| return this.omTarget.getRole().getRoleValue(); |
| } |
| return null; |
| } |
| |
| /** |
| * Sets the fault string for this <CODE>SOAPFault</CODE> object to the given string. |
| * |
| * @param faultString a <CODE>String</CODE> giving an explanation of the fault |
| * @throws SOAPException if there was an error in adding the <CODE>faultString</CODE> to the |
| * underlying XML tree. |
| * @see #getFaultString() getFaultString() |
| */ |
| public void setFaultString(String faultString) throws SOAPException { |
| if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP11) { |
| setFaultString(faultString, null); |
| } else if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP12) { |
| setFaultString(faultString, Locale.getDefault()); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see javax.xml.soap.SOAPFault#getFaultString() |
| */ |
| public String getFaultString() { |
| |
| if (this.omTarget.getNamespace().getNamespaceURI().equals( |
| SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI)) { |
| return this.omTarget.getReason().getText(); |
| } else { |
| if (this.omTarget.getReason() != null && this.omTarget.getReason().getFirstSOAPText() != null) |
| { |
| return this.omTarget.getReason().getFirstSOAPText().getText(); |
| } |
| } |
| return null; |
| } |
| |
| /* (non-Javadoc) |
| * @see javax.xml.soap.SOAPFault#getDetail() |
| */ |
| public Detail getDetail() { |
| return (Detail)toSAAJNode((org.w3c.dom.Node)omTarget.getDetail()); |
| } |
| |
| |
| /** |
| * Sets this SOAPFault object with the given fault code.Fault codes, which give information |
| * about the fault, are defined in the SOAP 1.1 specification. A fault code is mandatory and |
| * must be of type QName. This method provides a convenient way to set a fault code. For |
| * example, |
| * <p/> |
| * SOAPEnvelope se = ...; // Create a qualified name in the SOAP namespace with a localName // |
| * of Client. Note that prefix parameter is optional and is null // here which causes the |
| * implementation to use an appropriate prefix. Name qname = se.createName(Client, |
| * null,SOAPConstants.URI_NS_SOAP_ENVELOPE); SOAPFault fault = ...; fault.setFaultCode(qname); |
| * <p/> |
| * It is preferable to use this method over setFaultCode(String). |
| * |
| * @param faultCodeQName - a Name object giving the fault code to be set. It must be namespace |
| * qualified. |
| * @throws SOAPException - if there was an error in adding the faultcode element to the |
| * underlying XML tree. |
| */ |
| public void setFaultCode(Name faultCodeName) throws SOAPException { |
| if (faultCodeName.getURI() == null || faultCodeName.getURI().trim().length() == 0) { |
| throw new SOAPException("faultCodeQName must be namespace qualified."); |
| } |
| QName faultCodeQName = |
| new QName(faultCodeName.getURI(), faultCodeName.getLocalName(), faultCodeName.getPrefix()); |
| setFaultCode(faultCodeQName); |
| } |
| |
| /* (non-Javadoc) |
| * @see javax.xml.soap.SOAPFault#addDetail() |
| */ |
| public Detail addDetail() throws SOAPException { |
| if (isDetailAdded) { |
| throw new SOAPException("This SOAPFault already contains a Detail element. " + |
| "Please remove the existing Detail element before " + |
| "calling addDetail()"); |
| } |
| |
| SOAPFaultDetail omDetail; |
| SOAPFactory factory = (SOAPFactory)this.omTarget.getOMFactory(); |
| omDetail = factory.createSOAPFaultDetail(this.omTarget); |
| Detail saajDetail = new DetailImpl(omDetail); |
| isDetailAdded = true; |
| return saajDetail; |
| } |
| |
| /* (non-Javadoc) |
| * @see javax.xml.soap.SOAPFault#getFaultCodeAsName() |
| */ |
| public Name getFaultCodeAsName() { |
| return new PrefixedQName(getFaultCodeAsQName()); |
| } |
| |
| |
| /** |
| * Sets the fault string for this SOAPFault object to the given string. If this SOAPFault is |
| * part of a message that supports SOAP 1.2 then this call is equivalent to: |
| * addFaultReasonText(faultString, Locale.getDefault()); |
| * |
| * @param faultString - a String giving an explanation of the fault |
| * @throws SOAPException - if there was an error in adding the faultString to the underlying XML |
| * tree. |
| * @see getFaultString() |
| */ |
| |
| public void setFaultString(String faultString, Locale locale) throws SOAPException { |
| if (this.omTarget.getReason() != null) { |
| SOAPFaultReason reason = this.omTarget.getReason(); |
| if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP11) { |
| reason.setText(faultString); |
| } else if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP12) { |
| addFaultReasonText(faultString, locale); |
| } |
| } else { |
| if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP11) { |
| SOAPFaultReason reason = ((SOAPFactory)this.omTarget |
| .getOMFactory()).createSOAPFaultReason(this.omTarget); |
| reason.setText(faultString); |
| } else if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP12) { |
| addFaultReasonText(faultString, locale); |
| } |
| } |
| this.faultReasonLocale = locale; |
| } |
| |
| /** |
| * Gets the locale of the fault string for this SOAPFault object. If this SOAPFault is part of a |
| * message that supports SOAP 1.2 then this call is equivalent to: |
| * <p/> |
| * Locale locale = null; try { locale = (Locale) getFaultReasonLocales().next(); } catch |
| * (SOAPException e) {} return locale; |
| * |
| * @return a Locale object indicating the native language of the fault string or null if no |
| * locale was specified |
| * @see setFaultString(String, Locale) |
| * @since SAAJ 1.2 |
| */ |
| public Locale getFaultStringLocale() { |
| if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP11) { |
| return this.faultReasonLocale; |
| } else if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP12) { |
| Locale locale = null; |
| try { |
| if (getFaultReasonLocales().hasNext()) { |
| locale = (Locale)getFaultReasonLocales().next(); |
| } |
| } |
| catch (SOAPException e) { |
| e.printStackTrace(); |
| } |
| return locale; |
| } else { |
| return null; |
| } |
| |
| } |
| |
| /** |
| * Appends or replaces a Reason Text item containing the specified text message and an xml:lang |
| * derived from locale. If a Reason Text item with this xml:lang already exists its text value |
| * will be replaced with text. The locale parameter should not be null Code sample: SOAPFault |
| * fault = ...; fault.addFaultReasonText(Version Mismatch, Locale.ENGLISH); |
| * |
| * @param text - reason message string locale - Locale object representing the locale of the |
| * message |
| * @throws SOAPException - if there was an error in adding the Reason text or the locale passed |
| * was null. java.lang.UnsupportedOperationException - if this message |
| * does not support the SOAP 1.2 concept of Fault Reason. |
| */ |
| public void addFaultReasonText(String text, Locale locale) throws SOAPException { |
| if (locale == null) { |
| throw new SOAPException("Received null for locale"); |
| } |
| if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP11) { |
| throw new UnsupportedOperationException("Not supported in SOAP 1.1"); |
| } else if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP12) { |
| removeDefaults(); |
| |
| String existingReasonText = getFaultReasonText(locale); |
| if (existingReasonText == null) { |
| org.apache.axiom.soap.SOAPFactory soapFactory = null; |
| soapFactory = (SOAPFactory)this.omTarget.getOMFactory(); |
| if (this.omTarget.getReason() == null) { |
| SOAPFaultReason soapFaultReason = soapFactory.createSOAPFaultReason(this.omTarget); |
| this.omTarget.setReason(soapFaultReason); |
| } |
| SOAPFaultText soapFaultText = |
| soapFactory.createSOAPFaultText(this.omTarget.getReason()); |
| soapFaultText.setText(text); |
| soapFaultText.setLang(locale.toString()); |
| } else { |
| //update the text |
| Iterator soapTextsItr = this.omTarget.getReason().getAllSoapTexts().iterator(); |
| while (soapTextsItr.hasNext()) { |
| SOAPFaultText soapFaultText = (SOAPFaultText)soapTextsItr.next(); |
| if (soapFaultText.getLang().equals(locale.toString())) { |
| soapFaultText.setText(text); |
| } |
| } |
| |
| } |
| |
| } |
| |
| |
| } |
| |
| |
| /** |
| * Adds a Subcode to the end of the sequence of Subcodes contained by this SOAPFault. Subcodes, |
| * which were introduced in SOAP 1.2, are represented by a recursive sequence of subelements |
| * rooted in the mandatory Code subelement of a SOAP Fault. |
| * |
| * @param subcode - a QName containing the Value of the Subcode. |
| * @throws SOAPException - if there was an error in setting the Subcode java.lang.UnsupportedOperationException |
| * - if this message does not support the SOAP 1.2 concept of Subcode. |
| */ |
| |
| public void appendFaultSubcode(QName subcode) throws SOAPException { |
| SOAPFactory soapFactory = (SOAPFactory)this.omTarget.getOMFactory(); |
| SOAPFaultSubCode soapFaultSubCode = null; |
| |
| if (subcode.getNamespaceURI() == null || subcode.getNamespaceURI().trim().length() == 0) { |
| throw new SOAPException("Unqualified QName object : " + subcode); |
| } |
| if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP11) { |
| throw new UnsupportedOperationException(); |
| } |
| |
| if (this.omTarget.getCode() == null) { |
| soapFactory.createSOAPFaultCode(this.omTarget); |
| //if SOAPFault is null, there cannot be a subcode. |
| //Hence should create one |
| soapFaultSubCode = soapFactory.createSOAPFaultSubCode(this.omTarget.getCode()); |
| } else if (this.omTarget.getCode().getSubCode() != null) { |
| //find the last subcode.parent of the new subcode should be the this last subcode |
| soapFaultSubCode = soapFactory.createSOAPFaultSubCode( |
| getLastSubCode(this.omTarget.getCode().getSubCode())); |
| } else { |
| //FaultCode is there, but no FaultSubCode |
| soapFaultSubCode = soapFactory.createSOAPFaultSubCode(this.omTarget.getCode()); |
| } |
| |
| |
| if (soapFaultSubCode != null) { |
| SOAPFaultValue soapFaultValueimpl = |
| soapFactory.createSOAPFaultValue(soapFaultSubCode); |
| soapFaultValueimpl.setText(subcode.getPrefix() + ":" + subcode.getLocalPart()); |
| soapFaultValueimpl.declareNamespace(subcode.getNamespaceURI(), subcode.getPrefix()); |
| } |
| } |
| |
| private SOAPFaultSubCode getLastSubCode(SOAPFaultSubCode firstSubCodeElement) { |
| SOAPFaultSubCode soapFaultSubCode = firstSubCodeElement.getSubCode(); |
| if (soapFaultSubCode != null) { |
| return getLastSubCode(soapFaultSubCode); |
| } |
| return firstSubCodeElement; |
| } |
| |
| /** |
| * Gets the fault code for this SOAPFault object as a <CODE>QName</CODE> object. |
| * <p/> |
| */ |
| public QName getFaultCodeAsQName() { |
| SOAPFaultCode soapFaultCode = this.omTarget.getCode(); |
| return soapFaultCode != null ? soapFaultCode.getValueAsQName() : null; |
| } |
| |
| /** |
| * Returns the optional Node element value for this SOAPFault object. The Node element is |
| * optional in SOAP 1.2. |
| * |
| * @return Content of the env:Fault/env:Node element as a String or null if none |
| * @throws UnsupportedOperationException |
| * - if this message does not support the SOAP 1.2 concept of Fault Node. |
| */ |
| public String getFaultNode() { |
| if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP11) { |
| throw new UnsupportedOperationException("Message does not support the " + |
| "SOAP 1.2 concept of Fault Node"); |
| } else { |
| if (omTarget != null && omTarget.getNode() != null && omTarget.getNode().getText() != null) { |
| return omTarget.getNode().getText(); |
| } |
| } |
| return null; |
| |
| } |
| |
| /** |
| * Returns an Iterator over a distinct sequence of Locales for which there are associated Reason |
| * Text items. Any of these Locales can be used in a call to getFaultReasonText in order to |
| * obtain a localized version of the Reason Text string. |
| * |
| * @return an Iterator over a sequence of Locale objects for which there are associated Reason |
| * Text items. |
| * @throws SOAPException - if there was an error in retrieving the fault Reason locales. |
| * java.lang.UnsupportedOperationException - if this message does not |
| * support the SOAP 1.2 concept of Fault Reason. |
| * @since SAAJ 1.3 |
| */ |
| public Iterator getFaultReasonLocales() throws SOAPException { |
| if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP11) { |
| throw new UnsupportedOperationException("Message does not support the " + |
| "SOAP 1.2 concept of Fault Reason"); |
| } else { |
| ArrayList faultReasonLocales = new ArrayList(); |
| List soapTextList = this.omTarget.getReason().getAllSoapTexts(); |
| if (soapTextList != null) { |
| Iterator faultReasons = soapTextList.iterator(); |
| while (faultReasons.hasNext()) { |
| SOAPFaultText soapFaultText = (SOAPFaultText)faultReasons.next(); |
| String lang = soapFaultText.getLang(); |
| if (lang == null) { |
| faultReasonLocales.add(Locale.getDefault()); |
| } else { |
| if (lang.indexOf("_") != -1) { |
| String language = lang.substring(0, lang.indexOf("_")); |
| String country = lang.substring(lang.indexOf("_") + 1); |
| faultReasonLocales.add(new Locale(language, country)); |
| } else { |
| faultReasonLocales.add(new Locale(lang)); |
| } |
| } |
| } |
| } |
| return faultReasonLocales.iterator(); |
| } |
| } |
| |
| /** |
| * Returns the Reason Text associated with the given Locale. If more than one such Reason Text |
| * exists the first matching Text is returned |
| * |
| * @param locale - the Locale for which a localized Reason Text is desired |
| * @return the Reason Text associated with locale |
| * @throws SOAPException - if there was an error in retrieving the fault Reason text for the |
| * specified locale. java.lang.UnsupportedOperationException - if this |
| * message does not support the SOAP 1.2 concept of Fault Reason. |
| * @since SAAJ 1.3 |
| */ |
| public String getFaultReasonText(Locale locale) throws SOAPException { |
| if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP11) { |
| throw new UnsupportedOperationException("Message does not support the " + |
| "SOAP 1.2 concept of Fault Reason"); |
| } else { |
| Iterator soapTextsItr = null; |
| SOAPFaultReason soapFaultReason = this.omTarget.getReason(); |
| if (soapFaultReason != null) { |
| List soapTexts = soapFaultReason.getAllSoapTexts(); |
| if (soapTexts != null) { |
| soapTextsItr = soapTexts.iterator(); |
| while (soapTextsItr.hasNext()) { |
| SOAPFaultText soapFaultText = (SOAPFaultText)soapTextsItr.next(); |
| if (soapFaultText.getLang().equals(locale.toString())) { |
| return soapFaultText.getText(); |
| } |
| } |
| } |
| } |
| } |
| return null; |
| } |
| |
| /** |
| * Returns an Iterator over a sequence of String objects containing all of the Reason Text items |
| * for this SOAPFault. |
| * |
| * @throws SOAPException if there is an error in retrieving texts for Reason objects |
| * java.lang.UnsupportedOperationException - if this message does not |
| * support the SOAP 1.2 concept of Fault Reason. |
| */ |
| |
| public Iterator getFaultReasonTexts() throws SOAPException { |
| if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP11) { |
| throw new UnsupportedOperationException(); |
| } |
| |
| Iterator soapTextsItr = this.omTarget.getReason().getAllSoapTexts().iterator(); |
| ArrayList reasonTexts = new ArrayList(); |
| while (soapTextsItr.hasNext()) { |
| SOAPFaultText soapFaultText = (SOAPFaultText)soapTextsItr.next(); |
| reasonTexts.add(soapFaultText.getText()); |
| } |
| return reasonTexts.iterator(); |
| } |
| |
| /** |
| * Returns the optional Role element value for this SOAPFault object. The Role element is |
| * optional in SOAP 1.2. |
| * |
| * @return Content of the env:Fault/env:Role element as a String or null if none |
| * @throws UnsupportedOperationException |
| * - if this message does not support the SOAP 1.2 concept of Fault Role. |
| * @since SAAJ 1.3 |
| */ |
| public String getFaultRole() { |
| if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP11) { |
| throw new UnsupportedOperationException("Message does not support the " + |
| "SOAP 1.2 concept of Fault Reason"); |
| } else { |
| if (this.omTarget.getRole() != null) { |
| return this.omTarget.getRole().getText(); |
| } else { |
| return null; |
| } |
| } |
| } |
| |
| /** |
| * Gets the Subcodes for this SOAPFault as an iterator over QNames. |
| * |
| * @return an Iterator that accesses a sequence of QNames. This Iterator should not support the |
| * optional remove method. The order in which the Subcodes are returned reflects the |
| * hierarchy of Subcodes present in the fault from top to bottom. |
| * @throws UnsupportedOperationException |
| * - if this message does not support the SOAP 1.2 concept of Subcode. |
| */ |
| public Iterator getFaultSubcodes() { |
| if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP11) { |
| throw new UnsupportedOperationException(); |
| } |
| ArrayList faultSubcodes = new ArrayList(); |
| SOAPFaultSubCode subCodeElement = this.omTarget.getCode().getSubCode(); |
| while (subCodeElement != null) { |
| faultSubcodes.add(subCodeElement.getValueAsQName()); |
| subCodeElement = subCodeElement.getSubCode(); |
| } |
| return faultSubcodes.iterator(); |
| } |
| |
| /** Returns true if this SOAPFault has a Detail subelement and false otherwise. */ |
| public boolean hasDetail() { |
| if (this.omTarget.getDetail() != null) { |
| return true; |
| } else { |
| return false; |
| } |
| |
| } |
| |
| /** |
| * Removes any Subcodes that may be contained by this SOAPFault. Subsequent calls to |
| * getFaultSubcodes will return an empty iterator until a call to appendFaultSubcode is made. |
| * |
| * @throws UnsupportedOperationException |
| * - if this message does not support the SOAP 1.2 concept of Subcode. |
| */ |
| public void removeAllFaultSubcodes() { |
| if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP11) { |
| throw new UnsupportedOperationException(); |
| } else { |
| omTarget.getCode().getSubCode().detach(); |
| } |
| } |
| |
| |
| /** |
| * Sets this SOAPFault object with the given fault code. It is preferable to use this method |
| * over setFaultCode(Name) |
| * |
| * @param faultCodeQName - a QName object giving the fault code to be set. It must be namespace |
| * qualified. |
| * @throws SOAPException - if there was an error in adding the faultcode element to the |
| * underlying XML tree. |
| * @see getFaultCodeAsQName(), setFaultCode(Name), getFaultCodeAsQName() |
| * @since SAAJ 1.3 |
| */ |
| public void setFaultCode(QName qname) throws SOAPException { |
| if (qname.getNamespaceURI() == null |
| || qname.getNamespaceURI().trim().length() == 0) { |
| throw new SOAPException("Unqualified QName object : " + qname); |
| } |
| |
| org.apache.axiom.soap.SOAPFactory soapFactory = null; |
| if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP11) { |
| soapFactory = (SOAPFactory)this.omTarget.getOMFactory(); |
| } else if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP12) { |
| if (!(qname.getNamespaceURI() |
| .equals(SOAPConstants.URI_NS_SOAP_1_2_ENVELOPE))) { |
| throw new SOAPException("Incorrect URI" |
| + qname.getNamespaceURI()); |
| } |
| soapFactory = (SOAPFactory)this.omTarget.getOMFactory(); |
| } else { |
| throw new SOAPException("Invalid SOAP version"); |
| } |
| SOAPFaultCode soapFaultCode = soapFactory.createSOAPFaultCode(this.omTarget); |
| |
| String prefix = ((qname.getPrefix() != null) && !qname.getPrefix() |
| .equals("")) ? qname.getPrefix() : this.omTarget.getQName() |
| .getPrefix(); |
| |
| OMFactory factory = omTarget.getOMFactory(); |
| if (((SOAPFactory)factory).getSOAPVersion() == SOAPVersion.SOAP11) { |
| soapFaultCode.setText(prefix + ":" + qname.getLocalPart()); |
| OMNamespace omNamespace = factory.createOMNamespace(qname.getNamespaceURI(), |
| qname.getPrefix()); |
| soapFaultCode.declareNamespace(omNamespace); |
| } else if (((SOAPFactory)factory).getSOAPVersion() == SOAPVersion.SOAP12) { |
| SOAPFaultValue soapFaultValue = soapFactory.createSOAPFaultValue(soapFaultCode); |
| // don't just use the default prefix, use the passed one or the parent's |
| soapFaultValue.setText(prefix + ":" + qname.getLocalPart()); |
| OMNamespace omNamespace = factory.createOMNamespace(qname.getNamespaceURI(), |
| qname.getPrefix()); |
| soapFaultValue.declareNamespace(omNamespace); |
| soapFaultCode.setValue(soapFaultValue); |
| } |
| |
| this.omTarget.setCode(soapFaultCode); |
| } |
| |
| /** |
| * Creates or replaces any existing Node element value for this SOAPFault object. The Node |
| * element is optional in SOAP 1.2. |
| * |
| * @throws SOAPException - if there was an error in setting the Node for this SOAPFault object. |
| * java.lang.UnsupportedOperationException - if this message does not |
| * support the SOAP 1.2 concept of Fault Node. |
| * @since SAAJ 1.3 |
| */ |
| |
| public void setFaultNode(String s) throws SOAPException { |
| SOAPFactory soapFactory = (SOAPFactory)this.omTarget.getOMFactory(); |
| if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP11) { |
| throw new UnsupportedOperationException("message does not support " + |
| "the SOAP 1.2 concept of Fault Node"); |
| } |
| SOAPFaultNode soapFaultNode = soapFactory.createSOAPFaultNode(this.omTarget); |
| soapFaultNode.setText(s); |
| this.omTarget.setNode(soapFaultNode); |
| } |
| |
| /** |
| * Creates or replaces any existing Role element value for this SOAPFault object. The Role |
| * element is optional in SOAP 1.2. |
| * |
| * @param uri - the URI of the Role |
| * @throws SOAPException - if there was an error in setting the Role for this SOAPFault object |
| * java.lang.UnsupportedOperationException - if this message does not |
| * support the SOAP 1.2 concept of Fault Role. |
| */ |
| public void setFaultRole(String uri) throws SOAPException { |
| SOAPFactory soapFactory = (SOAPFactory)this.omTarget.getOMFactory(); |
| if (((SOAPFactory)this.omTarget.getOMFactory()).getSOAPVersion() == SOAPVersion.SOAP11) { |
| throw new UnsupportedOperationException("message does not support the " + |
| "SOAP 1.2 concept of Fault Role"); |
| } |
| SOAPFaultRole soapFaultRole = soapFactory.createSOAPFaultRole(this.omTarget); |
| soapFaultRole.setRoleValue(uri); |
| this.omTarget.setRole(soapFaultRole); |
| } |
| |
| public Iterator getChildElements(Name name) { |
| QName qName = new QName(name.getURI(), name.getLocalName()); |
| return getChildren(omTarget.getChildrenWithName(qName)); |
| } |
| |
| public Iterator getChildElements() { |
| return getChildren(omTarget.getChildren()); |
| } |
| |
| private Iterator getChildren(Iterator childIter) { |
| Collection childElements = new ArrayList(); |
| while (childIter.hasNext()) { |
| org.w3c.dom.Node domNode = (org.w3c.dom.Node)childIter.next(); |
| org.w3c.dom.Node saajNode = toSAAJNode(domNode); |
| if (!(saajNode instanceof SOAPFaultElement)) { |
| // silently replace node, as per saaj 1.2 spec |
| childElements.add(new SOAPFaultElementImpl<OMElement>((OMElement)domNode)); |
| } else { |
| childElements.add(saajNode); |
| } |
| } |
| return childElements.iterator(); |
| } |
| |
| } |