duftler 01/08/21 14:25:57
Modified: java/src/org/apache/soap Fault.java
java/src/org/apache/soap/server ExceptionFaultListener.java
Log:
Fixed the behavior of ExceptionFaultListener. It was previously not
looking in the right place for the type of the detail entry to be
unmarshalled. It was also not printing the encodingStyle attribute.
Please see Bug #2345
(http://nagoya.apache.org/bugzilla/show_bug.cgi?id=2345) for more details.
Submitted by: Richard Boehme ([EMAIL PROTECTED])
Reviewed by: Matthew J. Duftler
Revision Changes Path
1.9 +84 -47 xml-soap/java/src/org/apache/soap/Fault.java
Index: Fault.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/Fault.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- Fault.java 2001/05/22 21:59:16 1.8
+++ Fault.java 2001/08/21 21:25:57 1.9
@@ -64,6 +64,7 @@
import org.apache.soap.util.xml.*;
import org.apache.soap.encoding.*;
import org.apache.soap.rpc.Parameter;
+import org.apache.soap.rpc.RPCConstants;
import org.apache.soap.rpc.SOAPContext;
/**
@@ -86,9 +87,10 @@
public Fault() {}
- public Fault(SOAPException _soapException) {
- faultCode = _soapException.getFaultCode();
- faultString = _soapException.getMessage();
+ public Fault(SOAPException _soapException)
+ {
+ faultCode = _soapException.getFaultCode();
+ faultString = _soapException.getMessage();
}
public void setAttribute(QName attrQName, String value)
@@ -165,6 +167,7 @@
XMLJavaMappingRegistry xjmr, SOAPContext ctx)
throws IllegalArgumentException, IOException
{
+
attrHandler.populateNSStack(nsStack);
String faultCode = getFaultCode();
@@ -210,24 +213,49 @@
// Serialize the detail entries within the <detail> element.
for (Enumeration e = detailEntries.elements(); e.hasMoreElements();)
{
- Object detailEntry = e.nextElement();
-
- //if the detail entry is an Element, just write it
- if (detailEntry instanceof Element) {
- Element detailEntryEl = (Element)detailEntry;
- Utils.marshallNode(detailEntryEl, sink);
- sink.write(StringUtils.lineSeparator);
- }
-
- // if the detail entry is a Parameter, try to find a serializer, if there is
an error, write nothing
- else if (detailEntry instanceof Parameter) {
- try {
- Parameter detailEntryParameter = (Parameter)detailEntry;
- xjmr.querySerializer(Parameter.class,
inScopeEncStyle).marshall(inScopeEncStyle, Parameter.class, detailEntryParameter,
Constants.ELEM_FAULT_DETAIL_ENTRY, sink, nsStack, xjmr, ctx);
- sink.write(StringUtils.lineSeparator);
- }
- catch (IllegalArgumentException iae) {}
- }
+ Object detailEntry = e.nextElement();
+
+ // If the detail entry is an Element, just write it out.
+ if (detailEntry instanceof Element)
+ {
+ Element detailEntryEl = (Element)detailEntry;
+
+ Utils.marshallNode(detailEntryEl, sink);
+ sink.write(StringUtils.lineSeparator);
+ }
+ /*
+ If the detail entry is a Parameter, try to find a serializer.
+ If there is an error, write nothing.
+ */
+ else if (detailEntry instanceof Parameter)
+ {
+ try
+ {
+ Parameter detailEntryParameter = (Parameter)detailEntry;
+ Serializer s = xjmr.querySerializer(Parameter.class, inScopeEncStyle);
+
+ if (s != null)
+ {
+ s.marshall(null,
+ Parameter.class,
+ detailEntryParameter,
+ Constants.ELEM_FAULT_DETAIL_ENTRY,
+ sink,
+ nsStack,
+ xjmr,
+ ctx);
+ sink.write(StringUtils.lineSeparator);
+ }
+ else
+ {
+ throw new IllegalArgumentException("Could not find Parameter " +
+ "serializer.");
+ }
+ }
+ catch (IllegalArgumentException iae)
+ {
+ }
+ }
}
sink.write("</" + Constants.ELEM_DETAIL + '>' +
@@ -261,6 +289,7 @@
Element root = (Element)src;
Fault fault = new Fault();
+
if (Constants.Q_ELEM_FAULT.matches(root))
{
Element faultCodeEl = null;
@@ -366,30 +395,28 @@
el != null;
el = DOMUtils.getNextSiblingElement(el))
{
+ // Try to deserialize. If it fails, just add element to list.
+ try
+ {
+ String declEncStyle =
+ DOMUtils.getAttributeNS(el,
+ Constants.NS_URI_SOAP_ENV,
+ Constants.ATTR_ENCODING_STYLE);
+ String actualEncStyle = declEncStyle != null
+ ? declEncStyle
+ : inScopeEncStyle;
+ Bean paramBean = xjmr.unmarshall(declEncStyle,
+ RPCConstants.Q_ELEM_PARAMETER,
+ el,
+ ctx);
+ Parameter param = (Parameter)paramBean.value;
-
- //try to deserialize, if fails, just add element to list
- try {
-
- //find the declared encoding style
- String declEncStyle =
el.getAttributeNS(Constants.NS_URI_SOAP_ENV, Constants.ATTR_ENCODING_STYLE);
-
- //determine the enc style to use based on this order: declared
in element, inscope, SOAP encoding
- String encStyle = declEncStyle != null ? declEncStyle :
(inScopeEncStyle != null ? inScopeEncStyle : Constants.NS_URI_SOAP_ENC);
-
- QName qn = new QName(el);
-
- //Get a deserializer
- Deserializer deser = xjmr.queryDeserializer( qn, encStyle);
-
- Bean detailEntryBean = deser.unmarshall(encStyle, qn, el,
xjmr, ctx);
-
- detailEntries.addElement(detailEntryBean.value);
- }
- catch (Exception e) {
- detailEntries.addElement(el);
- }
-
+ detailEntries.addElement(param);
+ }
+ catch (Exception e)
+ {
+ detailEntries.addElement(el);
+ }
}
fault.setDetailEntries(detailEntries);
@@ -429,9 +456,19 @@
for (int i = 0; i < detailEntries.size(); i++)
{
- pw.println("[(" + i + ")=" +
- DOM2Writer.nodeToString((Element)detailEntries.elementAt(i)) +
- "]");
+ Object detailEl = detailEntries.elementAt(i);
+
+ if (detailEl instanceof Parameter)
+ {
+ Parameter param = (Parameter)detailEl;
+
+ pw.println("[(" + i + ")=" + param +"]");
+ }
+ else
+ {
+ pw.println("[(" + i + ")=" +
+ DOM2Writer.nodeToString((Element)detailEl) + "]");
+ }
}
}
1.2 +6 -1
xml-soap/java/src/org/apache/soap/server/ExceptionFaultListener.java
Index: ExceptionFaultListener.java
===================================================================
RCS file:
/home/cvs/xml-soap/java/src/org/apache/soap/server/ExceptionFaultListener.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ExceptionFaultListener.java 2000/10/17 12:11:13 1.1
+++ ExceptionFaultListener.java 2001/08/21 21:25:57 1.2
@@ -78,7 +78,12 @@
public void fault(SOAPFaultEvent _faultEvent) {
Vector tmp = new Vector();
- Parameter param = new Parameter(Constants.ELEM_FAULT_DETAIL_ENTRY,
_faultEvent.getSOAPException().getRootException().getClass(),
_faultEvent.getSOAPException().getRootException(), null);
+ Parameter param =
+ new Parameter(Constants.ELEM_FAULT_DETAIL_ENTRY,
+ _faultEvent.getSOAPException().getRootException().getClass(),
+ _faultEvent.getSOAPException().getRootException(),
+ Constants.NS_URI_SOAP_ENC);
+
tmp.addElement(param);
_faultEvent.getFault().setDetailEntries(tmp);