Author: dkulp
Date: Fri Mar 30 14:21:08 2012
New Revision: 1307438
URL: http://svn.apache.org/viewvc?rev=1307438&view=rev
Log:
[CXF-4181] Another fix for SAAJ and fault handling that should allow the
SAAJInInterceptor to retain all the information about the faults
Modified:
cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/W3CDOMStreamWriter.java
cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java
cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJStreamWriter.java
cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptorTest.java
Modified:
cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/W3CDOMStreamWriter.java
URL:
http://svn.apache.org/viewvc/cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/W3CDOMStreamWriter.java?rev=1307438&r1=1307437&r2=1307438&view=diff
==============================================================================
---
cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/W3CDOMStreamWriter.java
(original)
+++
cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/W3CDOMStreamWriter.java
Fri Mar 30 14:21:08 2012
@@ -68,6 +68,11 @@ public class W3CDOMStreamWriter implemen
currentNode = e;
((W3CNamespaceContext)context).setElement(e);
}
+ public W3CDOMStreamWriter(Document owner, Element e) {
+ this.document = owner;
+ currentNode = e;
+ ((W3CNamespaceContext)context).setElement(e);
+ }
public Element getCurrentNode() {
if (currentNode instanceof Element) {
Modified:
cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java
URL:
http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java?rev=1307438&r1=1307437&r2=1307438&view=diff
==============================================================================
---
cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java
(original)
+++
cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java
Fri Mar 30 14:21:08 2012
@@ -29,10 +29,8 @@ import java.util.ResourceBundle;
import javax.xml.namespace.QName;
import javax.xml.soap.AttachmentPart;
-import javax.xml.soap.Detail;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPException;
-import javax.xml.soap.SOAPFault;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
@@ -54,8 +52,6 @@ import org.apache.cxf.binding.soap.SoapH
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor;
-import org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor;
-import org.apache.cxf.binding.soap.interceptor.Soap12FaultInInterceptor;
import org.apache.cxf.common.i18n.BundleUtils;
import org.apache.cxf.common.injection.NoJSR250Annotations;
import org.apache.cxf.databinding.DataBinding;
@@ -227,54 +223,12 @@ public class SAAJInInterceptor extends A
soapMessage.getSOAPPart().getEnvelope().addHeader();
}
-
- if (hasFault(message, xmlReader)) {
- SoapFault fault =
- message.getVersion() instanceof Soap11
- ? Soap11FaultInInterceptor.unmarshalFault(message,
xmlReader)
- : Soap12FaultInInterceptor.unmarshalFault(message,
xmlReader);
-
- SOAPFault soapFault =
-
soapMessage.getSOAPPart().getEnvelope().getBody().getFault();
- if (soapFault == null) {
- soapFault =
-
soapMessage.getSOAPPart().getEnvelope().getBody().addFault();
- if (fault.getFaultCode() != null) {
- SAAJUtils.setFaultCode(soapFault,
fault.getFaultCode());
- }
- if (fault.getMessage() != null) {
- soapFault.setFaultString(fault.getMessage());
- }
- if (fault.getRole() != null) {
- soapFault.setFaultActor(fault.getRole());
- }
- if (fault.getDetail() != null
- && fault.getDetail().getFirstChild() != null) {
-
- Detail detail = null;
- Node child = fault.getDetail().getFirstChild();
- if (child != null) {
- detail = soapFault.addDetail();
- }
- while (child != null) {
- if (Node.ELEMENT_NODE == child.getNodeType()) {
- Node importedChild =
soapMessage.getSOAPPart().importNode(child, true);
- detail.appendChild(importedChild);
- }
- child = child.getNextSibling();
- }
- }
- }
- DOMSource bodySource = new DOMSource(soapFault);
- xmlReader = StaxUtils.createXMLStreamReader(bodySource);
- } else {
-
StaxUtils.readDocElements(soapMessage.getSOAPPart().getEnvelope().getBody(),
- xmlReader, true, true);
- DOMSource bodySource = new
DOMSource(soapMessage.getSOAPPart().getEnvelope().getBody());
- xmlReader = StaxUtils.createXMLStreamReader(bodySource);
- xmlReader.nextTag();
- xmlReader.nextTag(); // move past body tag
- }
+
StaxUtils.readDocElements(soapMessage.getSOAPPart().getEnvelope().getBody(),
+ xmlReader, true, true);
+ DOMSource bodySource = new
DOMSource(soapMessage.getSOAPPart().getEnvelope().getBody());
+ xmlReader = StaxUtils.createXMLStreamReader(bodySource);
+ xmlReader.nextTag();
+ xmlReader.nextTag(); // move past body tag
message.setContent(XMLStreamReader.class, xmlReader);
} catch (SOAPException soape) {
throw new SoapFault(new org.apache.cxf.common.i18n.Message(
@@ -332,15 +286,4 @@ public class SAAJInInterceptor extends A
elem = DOMUtils.getNextElement(elem);
}
}
-
-
- private static boolean hasFault(SoapMessage message,
- XMLStreamReader xmlReader) {
- try {
- QName name = xmlReader.getName();
- return message.getVersion().getFault().equals(name);
- } catch (Exception e) {
- return false;
- }
- }
}
Modified:
cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJStreamWriter.java
URL:
http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJStreamWriter.java?rev=1307438&r1=1307437&r2=1307438&view=diff
==============================================================================
---
cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJStreamWriter.java
(original)
+++
cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJStreamWriter.java
Fri Mar 30 14:21:08 2012
@@ -26,6 +26,7 @@ import javax.xml.soap.SOAPPart;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
+import org.apache.cxf.common.util.StringUtils;
import org.apache.cxf.staxutils.W3CDOMStreamWriter;
public final class SAAJStreamWriter extends W3CDOMStreamWriter {
@@ -35,6 +36,10 @@ public final class SAAJStreamWriter exte
super(part);
this.part = part;
}
+ public SAAJStreamWriter(SOAPPart part, Element current) {
+ super(part, current);
+ this.part = part;
+ }
private SOAPElement adjustPrefix(SOAPElement e, String prefix) {
if (prefix == null) {
@@ -69,7 +74,13 @@ public final class SAAJStreamWriter exte
} else if ("Fault".equals(local)) {
SOAPFault f = part.getEnvelope().getBody().getFault();
if (f == null) {
- f = part.getEnvelope().getBody().addFault();
+ Element el = part.createElementNS(namespace,
+ StringUtils.isEmpty(prefix) ?
local : prefix + ":" + local);
+ el =
(Element)part.getEnvelope().getBody().appendChild(el);
+ f = part.getEnvelope().getBody().getFault();
+ if (f == null) {
+ f = part.getEnvelope().getBody().addFault();
+ }
}
setChild(adjustPrefix(f, prefix), false);
return;
Modified:
cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptorTest.java
URL:
http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptorTest.java?rev=1307438&r1=1307437&r2=1307438&view=diff
==============================================================================
---
cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptorTest.java
(original)
+++
cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptorTest.java
Fri Mar 30 14:21:08 2012
@@ -33,7 +33,7 @@ import javax.xml.soap.SOAPMessage;
import javax.xml.stream.XMLStreamReader;
import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
+import org.w3c.dom.Node;
import org.apache.cxf.BusFactory;
import org.apache.cxf.binding.soap.Soap12;
@@ -126,8 +126,15 @@ public class SAAJInInterceptorTest exten
assertEquals("soap:Server", fault.getFaultCode());
assertEquals("This is a fault string", fault.getFaultString());
Detail faultDetail = fault.getDetail();
- NodeList faultDetailChildNodes = faultDetail.getChildNodes();
- assertEquals(2, faultDetailChildNodes.getLength());
+ int count = 0;
+ Node nd = faultDetail.getFirstChild();
+ while (nd != null) {
+ if (nd instanceof Element) {
+ count++;
+ }
+ nd = nd.getNextSibling();
+ }
+ assertEquals(2, count);
Iterator<?> detailEntries = faultDetail.getDetailEntries();
DetailEntry detailEntry = (DetailEntry)detailEntries.next();