/**
* 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.cxf.jaxws.interceptors;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import javax.xml.namespace.QName;
import javax.xml.soap.Detail;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPFault;
import javax.xml.ws.soap.SOAPFaultException;
import org.w3c.dom.Attr;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.TypeInfo;
import org.w3c.dom.UserDataHandler;
import org.apache.cxf.binding.soap.Soap12;
import org.apache.cxf.binding.soap.SoapFault;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.message.Message;
import org.junit.Assert;
import org.junit.Test;
/**
* Let WebFaultOutInterceptor process a message containing a SoapFault.
*
* If SoapFault's exception or its' cause is instance of SOAPFaultException, values of SOAPFaultException.subCodes
* should be copied to SoapFault.subCodes.
*/
public class WebFaultOutInterceptorTestCase {
private static final QName CODE = new QName("ns", "code");
private static final QName SUBCODE = new QName("ns", "subcode");
private static final List<QName> SUBCODES = Collections.singletonList(SUBCODE);
private WebFaultOutInterceptor interceptor = new WebFaultOutInterceptor();
@Test
public void testSoapFaultException() {
// create message that contains Fault that contains exception
SOAPFaultException soapFaultException = new SOAPFaultException(new SOAPFaultStub());
SoapFault soapFault = new SoapFault("message", soapFaultException, CODE);
Message message = createMessage(soapFault);
interceptor.handleMessage(message);
Assert.assertNotNull(soapFault.getSubCodes());
Assert.assertEquals(1, soapFault.getSubCodes().size());
Assert.assertEquals(SUBCODE, soapFault.getSubCodes().get(0));
Assert.assertEquals(CODE, soapFault.getFaultCode());
}
@Test
public void testSoapFaultCause() {
SOAPFaultException cause = new SOAPFaultException(new SOAPFaultStub());
Exception exception = new Exception(cause);
SoapFault soapFault = new SoapFault("message", exception, CODE);
Message message = createMessage(soapFault);
interceptor.handleMessage(message);
Assert.assertNotNull(soapFault.getSubCodes());
Assert.assertEquals(1, soapFault.getSubCodes().size());
Assert.assertEquals(SUBCODE, soapFault.getSubCodes().get(0));
Assert.assertEquals(CODE, soapFault.getFaultCode());
}
@Test
public void testSoapFaultCauseCause() {
SOAPFaultException cause = new SOAPFaultException(new SOAPFaultStub());
Exception innerException = new Exception(cause);
Exception outerException = new Exception(innerException);
SoapFault soapFault = new SoapFault("message", outerException, CODE);
Message message = createMessage(soapFault);
interceptor.handleMessage(message);
Assert.assertTrue("SoapFault.subCodes are expected to be empty.",
soapFault.getSubCodes() == null || soapFault.getSubCodes().size() == 0);
Assert.assertEquals(CODE, soapFault.getFaultCode());
}
@Test
public void testOtherException() {
Exception exception = new Exception("test");
SoapFault soapFault = new SoapFault("message", exception, CODE);
Message message = createMessage(soapFault);
interceptor.handleMessage(message);
Assert.assertTrue("SoapFault.subCodes are expected to be empty.",
soapFault.getSubCodes() == null || soapFault.getSubCodes().size() == 0);
Assert.assertEquals(CODE, soapFault.getFaultCode());
}
private Message createMessage(SoapFault soapFault) {
Message message = new SoapMessage(Soap12.getInstance());
message.setContent(Exception.class, soapFault);
return message;
}
@SuppressWarnings("rawtypes") // old SAAJ API doesn't have generics
private class SOAPFaultStub implements SOAPFault {
@Override
public void setFaultCode(Name name) throws SOAPException {
}
@Override
public void setFaultCode(QName qName) throws SOAPException {
}
@Override
public void setFaultCode(String s) throws SOAPException {
}
@Override
public Name getFaultCodeAsName() {
return null;
}
@Override
public QName getFaultCodeAsQName() {
return null;
}
@Override
public Iterator<QName> getFaultSubcodes() {
return SUBCODES.iterator();
}
@Override
public void removeAllFaultSubcodes() {
}
@Override
public void appendFaultSubcode(QName qName) throws SOAPException {
}
@Override
public String getFaultCode() {
return null;
}
@Override
public void setFaultActor(String s) throws SOAPException {
}
@Override
public String getFaultActor() {
return null;
}
@Override
public void setFaultString(String s) throws SOAPException {
}
@Override
public void setFaultString(String s, Locale locale) throws SOAPException {
}
@Override
public String getFaultString() {
return null;
}
@Override
public Locale getFaultStringLocale() {
return null;
}
@Override
public boolean hasDetail() {
return false;
}
@Override
public Detail getDetail() {
return null;
}
@Override
public Detail addDetail() throws SOAPException {
return null;
}
@Override
public Iterator getFaultReasonLocales() throws SOAPException {
return Collections.emptyIterator();
}
@Override
public Iterator getFaultReasonTexts() throws SOAPException {
return null;
}
@Override
public String getFaultReasonText(Locale locale) throws SOAPException {
return null;
}
@Override
public void addFaultReasonText(String s, Locale locale) throws SOAPException {
}
@Override
public String getFaultNode() {
return null;
}
@Override
public void setFaultNode(String s) throws SOAPException {
}
@Override
public String getFaultRole() {
return null;
}
@Override
public void setFaultRole(String s) throws SOAPException {
}
@Override
public SOAPElement addChildElement(Name name) throws SOAPException {
return null;
}
@Override
public SOAPElement addChildElement(QName qName) throws SOAPException {
return null;
}
@Override
public SOAPElement addChildElement(String s) throws SOAPException {
return null;
}
@Override
public SOAPElement addChildElement(String s, String s1) throws SOAPException {
return null;
}
@Override
public SOAPElement addChildElement(String s, String s1, String s2) throws SOAPException {
return null;
}
@Override
public SOAPElement addChildElement(SOAPElement soapElement) throws SOAPException {
return null;
}
@Override
public void removeContents() {
}
@Override
public SOAPElement addTextNode(String s) throws SOAPException {
return null;
}
@Override
public SOAPElement addAttribute(Name name, String s) throws SOAPException {
return null;
}
@Override
public SOAPElement addAttribute(QName qName, String s) throws SOAPException {
return null;
}
@Override
public SOAPElement addNamespaceDeclaration(String s, String s1) throws SOAPException {
return null;
}
@Override
public String getAttributeValue(Name name) {
return null;
}
@Override
public String getAttributeValue(QName qName) {
return null;
}
@Override
public Iterator getAllAttributes() {
return null;
}
@Override
public Iterator getAllAttributesAsQNames() {
return null;
}
@Override
public String getNamespaceURI(String s) {
return null;
}
@Override
public Iterator getNamespacePrefixes() {
return null;
}
@Override
public Iterator getVisibleNamespacePrefixes() {
return null;
}
@Override
public QName createQName(String s, String s1) throws SOAPException {
return null;
}
@Override
public Name getElementName() {
return null;
}
@Override
public QName getElementQName() {
return null;
}
@Override
public SOAPElement setElementQName(QName qName) throws SOAPException {
return null;
}
@Override
public boolean removeAttribute(Name name) {
return false;
}
@Override
public boolean removeAttribute(QName qName) {
return false;
}
@Override
public boolean removeNamespaceDeclaration(String s) {
return false;
}
@Override
public Iterator getChildElements() {
return null;
}
@Override
public Iterator getChildElements(Name name) {
return null;
}
@Override
public Iterator getChildElements(QName qName) {
return null;
}
@Override
public void setEncodingStyle(String s) throws SOAPException {
}
@Override
public String getEncodingStyle() {
return null;
}
@Override
public String getTagName() {
return null;
}
@Override
public String getAttribute(String s) {
return null;
}
@Override
public void setAttribute(String s, String s1) throws DOMException {
}
@Override
public void removeAttribute(String s) throws DOMException {
}
@Override
public Attr getAttributeNode(String s) {
return null;
}
@Override
public Attr setAttributeNode(Attr attr) throws DOMException {
return null;
}
@Override
public Attr removeAttributeNode(Attr attr) throws DOMException {
return null;
}
@Override
public NodeList getElementsByTagName(String s) {
return null;
}
@Override
public String getAttributeNS(String s, String s1) throws DOMException {
return null;
}
@Override
public void setAttributeNS(String s, String s1, String s2) throws DOMException {
}
@Override
public void removeAttributeNS(String s, String s1) throws DOMException {
}
@Override
public Attr getAttributeNodeNS(String s, String s1) throws DOMException {
return null;
}
@Override
public Attr setAttributeNodeNS(Attr attr) throws DOMException {
return null;
}
@Override
public NodeList getElementsByTagNameNS(String s, String s1) throws DOMException {
return null;
}
@Override
public boolean hasAttribute(String s) {
return false;
}
@Override
public boolean hasAttributeNS(String s, String s1) throws DOMException {
return false;
}
@Override
public TypeInfo getSchemaTypeInfo() {
return null;
}
@Override
public void setIdAttribute(String s, boolean b) throws DOMException {
}
@Override
public void setIdAttributeNS(String s, String s1, boolean b) throws DOMException {
}
@Override
public void setIdAttributeNode(Attr attr, boolean b) throws DOMException {
}
@Override
public String getValue() {
return null;
}
@Override
public void setValue(String s) {
}
@Override
public void setParentElement(SOAPElement soapElement) throws SOAPException {
}
@Override
public SOAPElement getParentElement() {
return null;
}
@Override
public void detachNode() {
}
@Override
public void recycleNode() {
}
@Override
public String getNodeName() {
return null;
}
@Override
public String getNodeValue() throws DOMException {
return null;
}
@Override
public void setNodeValue(String s) throws DOMException {
}
@Override
public short getNodeType() {
return 0;
}
@Override
public Node getParentNode() {
return null;
}
@Override
public NodeList getChildNodes() {
return null;
}
@Override
public Node getFirstChild() {
return null;
}
@Override
public Node getLastChild() {
return null;
}
@Override
public Node getPreviousSibling() {
return null;
}
@Override
public Node getNextSibling() {
return null;
}
@Override
public NamedNodeMap getAttributes() {
return null;
}
@Override
public Document getOwnerDocument() {
return null;
}
@Override
public Node insertBefore(Node node, Node node1) throws DOMException {
return null;
}
@Override
public Node replaceChild(Node node, Node node1) throws DOMException {
return null;
}
@Override
public Node removeChild(Node node) throws DOMException {
return null;
}
@Override
public Node appendChild(Node node) throws DOMException {
return null;
}
@Override
public boolean hasChildNodes() {
return false;
}
@Override
public Node cloneNode(boolean b) {
return null;
}
@Override
public void normalize() {
}
@Override
public boolean isSupported(String s, String s1) {
return false;
}
@Override
public String getNamespaceURI() {
return null;
}
@Override
public String getPrefix() {
return null;
}
@Override
public void setPrefix(String s) throws DOMException {
}
@Override
public String getLocalName() {
return null;
}
@Override
public boolean hasAttributes() {
return false;
}
@Override
public String getBaseURI() {
return null;
}
@Override
public short compareDocumentPosition(Node node) throws DOMException {
return 0;
}
@Override
public String getTextContent() throws DOMException {
return null;
}
@Override
public void setTextContent(String s) throws DOMException {
}
@Override
public boolean isSameNode(Node node) {
return false;
}
@Override
public String lookupPrefix(String s) {
return null;
}
@Override
public boolean isDefaultNamespace(String s) {
return false;
}
@Override
public String lookupNamespaceURI(String s) {
return null;
}
@Override
public boolean isEqualNode(Node node) {
return false;
}
@Override
public Object getFeature(String s, String s1) {
return null;
}
@Override
public Object setUserData(String s, Object o, UserDataHandler userDataHandler) {
return null;
}
@Override
public Object getUserData(String s) {
return null;
}
}
}