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);