dims 2002/11/20 08:37:40 Modified: java/src/org/apache/axis AxisFault.java Constants.java java/src/org/apache/axis/message SOAPFault.java SOAPFaultBuilder.java Added: java/src/org/apache/axis/message SOAPFaultCodeBuilder.java Log: Patch for Bug 14552 - soap 1.2 axis fault patch from [EMAIL PROTECTED] Revision Changes Path 1.62 +131 -4 xml-axis/java/src/org/apache/axis/AxisFault.java Index: AxisFault.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/AxisFault.java,v retrieving revision 1.61 retrieving revision 1.62 diff -u -r1.61 -r1.62 --- AxisFault.java 13 Nov 2002 05:04:02 -0000 1.61 +++ AxisFault.java 20 Nov 2002 16:37:40 -0000 1.62 @@ -95,9 +95,11 @@ LogFactory.getLog(AxisFault.class.getName()); protected QName faultCode ; + protected Vector faultSubCode ; protected String faultString = ""; protected String faultActor ; protected Vector faultDetails ; // vector of Element's + protected String faultNode ; /** SOAP headers which should be serialized with the Fault */ protected ArrayList faultHeaders = null; @@ -127,7 +129,7 @@ /** * make a fault - * @param code fault code which will be pased into the Axis namespace + * @param code fault code which will be passed into the Axis namespace * @param faultString fault string * @param actor fault actor * @param details details; if null the current stack trace and classname is @@ -141,7 +143,7 @@ /** * make a fault in any namespace - * @param code fault code which will be pased into the Axis namespace + * @param code fault code which will be passed into the Axis namespace * @param faultString fault string * @param actor fault actor * @param details details; if null the current stack trace and classname is @@ -158,13 +160,38 @@ initFromException(this); } +/** + * make a fault in any namespace + * @param code fault code which will be passed into the Axis namespace + * @param subcodes fault subcodes which will be pased into the Axis namespace + * @param faultString fault string + * @param actor fault actor, same as fault role in SOAP 1.2 + * @param node which node caused the fault on the SOAP path + * @param details details; if null the current stack trace and classname is + * inserted into the details. + */ + public AxisFault(QName code, QName[] subcodes, String faultString, + String actor, String node, Element[] details) { + super (faultString); + setFaultCode( code ); + if (subcodes != null) + for (int i = 0; i < subcodes.length; i++) + addFaultSubCode( subcodes[i] ); + setFaultString( faultString ); + setFaultActor( actor ); + setFaultNode( node ); + setFaultDetail( details ); + if (details == null) + initFromException(this); + } + /** * Wrap an AxisFault around an existing Exception - this is private * to force everyone to use makeFault() above, which sanity-checks us. */ protected AxisFault(Exception target) { super ("", target); - + // ? SOAP 1.2 or 1.1 ? setFaultCodeAsString( Constants.FAULT_SERVER_USER ); initFromException(target); @@ -178,6 +205,7 @@ public AxisFault(String message) { super (message); + //TODO: SOAP 1.2 or 1.1 ? setFaultCodeAsString(Constants.FAULT_SERVER_GENERAL); setFaultString(message); initFromException(this); @@ -189,6 +217,7 @@ public AxisFault() { super(); + //TODO: 1.2 or 1.1 ? setFaultCodeAsString(Constants.FAULT_SERVER_GENERAL); initFromException(this); } @@ -203,6 +232,7 @@ public AxisFault (String message, Throwable t) { super (message, t); + //TODO: SOAP 1.2 or 1.1 ? setFaultCodeAsString(Constants.FAULT_SERVER_GENERAL); setFaultString(message); } @@ -277,10 +307,21 @@ } } + String subCodes = new String(); + if (faultSubCode != null) { + for (int i = 0; i < faultSubCode.size(); i++) { + subCodes += JavaUtils.LS + + (QName)faultSubCode.elementAt(i); + + } + } + return "AxisFault" + JavaUtils.LS + " faultCode: " + faultCode + JavaUtils.LS + + " faultSubcode: " + subCodes + JavaUtils.LS + " faultString: " + faultString + JavaUtils.LS + " faultActor: " + faultActor + JavaUtils.LS + + " faultNode: " + faultNode + JavaUtils.LS + " faultDetail: " + details + JavaUtils.LS ; } @@ -299,7 +340,7 @@ * @param code fault code */ public void setFaultCodeAsString(String code) { - faultCode = new QName(Constants.NS_URI_AXIS, code); + faultCode = new QName(Constants.URI_SOAP12_ENV, code); } /** @@ -311,6 +352,44 @@ } /** + * This is new in SOAP 1.2, ignored in SOAP 1.1 + * @return + */ + public void addFaultSubCodeAsString(String code) { + if (faultSubCode == null) + faultSubCode = new Vector(); + faultSubCode.add(new QName(Constants.NS_URI_AXIS, code)); + } + + /** + * This is new in SOAP 1.2, ignored in SOAP 1.1 + * @return + */ + public void addFaultSubCode(QName code) { + if (faultSubCode == null) + faultSubCode = new Vector(); + faultSubCode.add(code); + } + + /** + * This is new in SOAP 1.2, ignored in SOAP 1.1 + * @return + */ + public void clearFaultSubCodes() { + faultSubCode = null; + } + + public QName[] getFaultSubCodes() { + if (faultSubCode == null) + return null; + QName[] q = new QName[faultSubCode.size()]; + return (QName[])faultSubCode.toArray(q); + } + + + + + /** * set a fault string; * @param str new fault string; null is turned into "" */ @@ -332,6 +411,22 @@ } /** + * This is SOAP 1.2 equivalent of {@link #setFaultString(java.lang.String)} + * @return + */ + public void setFaultReason(String str) { + setFaultString(str); + } + + /** + * This is SOAP 1.2 equivalent of {@link #getFaultString()} + * @return + */ + public String getFaultReason() { + return getFaultString(); + } + + /** * set the fault actor * @param actor fault actor */ @@ -345,6 +440,38 @@ */ public String getFaultActor() { return( faultActor ); + } + + /** + * This is SOAP 1.2 equivalent of {@link #getFaultActor()} + * @return + */ + public String getFaultRole() { + return getFaultActor(); + } + + /** + * This is SOAP 1.2 equivalent of {@link #setFaultActor(java.lang.String)} + * @return + */ + public void setFaultRole(String role) { + setFaultActor(role); + } + + /** + * This is new in SOAP 1.2 + * @return + */ + public String getFaultNode() { + return( faultNode ); + } + + /** + * This is new in SOAP 1.2 + * @return + */ + public void setFaultNode(String node) { + faultNode = node; } /** 1.97 +38 -0 xml-axis/java/src/org/apache/axis/Constants.java Index: Constants.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/Constants.java,v retrieving revision 1.96 retrieving revision 1.97 diff -u -r1.96 -r1.97 --- Constants.java 2 Nov 2002 01:32:05 -0000 1.96 +++ Constants.java 20 Nov 2002 16:37:40 -0000 1.97 @@ -414,6 +414,14 @@ public static final String ELEM_FAULT_DETAIL = "detail" ; public static final String ELEM_FAULT_ACTOR = "faultactor" ; + public static final String ELEM_FAULT_CODE_SOAP12 = "Code" ; + public static final String ELEM_FAULT_VALUE_SOAP12 = "Value" ; + public static final String ELEM_FAULT_SUBCODE_SOAP12 = "Subcode" ; + public static final String ELEM_FAULT_REASON_SOAP12 = "Reason" ; + public static final String ELEM_FAULT_NODE_SOAP12 = "Node" ; + public static final String ELEM_FAULT_ROLE_SOAP12 = "Role" ; + public static final String ELEM_FAULT_DETAIL_SOAP12 = "Detail" ; + public static final String ATTR_MUST_UNDERSTAND = "mustUnderstand" ; public static final String ATTR_ENCODING_STYLE = "encodingStyle" ; public static final String ATTR_ACTOR = "actor" ; @@ -439,6 +447,21 @@ new QName(URI_SOAP11_ENV, "MustUnderstand"); + public static final QName FAULT_SOAP12_MUSTUNDERSTAND = + new QName(URI_SOAP12_ENV, "MustUnderstand"); + + public static final QName FAULT_SOAP12_VERSIONMISMATCH = + new QName(URI_SOAP12_ENV, "VersionMismatch"); + + public static final QName FAULT_SOAP12_DATAENCODINGUNKNOW = + new QName(URI_SOAP12_ENV, "DataEncodingUnknow"); + + public static final QName FAULT_SOAP12_SENDER = + new QName(URI_SOAP12_ENV, "Sender"); + + public static final QName FAULT_SOAP12_RECEIVER = + new QName(URI_SOAP12_ENV, "Receiver"); + // QNames ////////////////////////////////////////////////////////////////////////// public static final QName QNAME_FAULTCODE = @@ -450,6 +473,21 @@ public static final QName QNAME_FAULTDETAILS = new QName("", ELEM_FAULT_DETAIL); + public static final QName QNAME_FAULTCODE_SOAP12 = + new QName(URI_SOAP12_ENV, ELEM_FAULT_CODE_SOAP12); + public static final QName QNAME_FAULTVALUE_SOAP12 = + new QName(URI_SOAP12_ENV, ELEM_FAULT_VALUE_SOAP12); + public static final QName QNAME_FAULTSUBCODE_SOAP12 = + new QName(URI_SOAP12_ENV, ELEM_FAULT_SUBCODE_SOAP12); + public static final QName QNAME_FAULTREASON_SOAP12 = + new QName(URI_SOAP12_ENV, ELEM_FAULT_REASON_SOAP12); + + public static final QName QNAME_FAULTNODE_SOAP12 = + new QName(URI_SOAP12_ENV, ELEM_FAULT_NODE_SOAP12); + public static final QName QNAME_FAULTROLE_SOAP12 = + new QName(URI_SOAP12_ENV, ELEM_FAULT_ROLE_SOAP12); + public static final QName QNAME_FAULTDETAIL_SOAP12 = + new QName(URI_SOAP12_ENV, ELEM_FAULT_DETAIL_SOAP12); // Define qnames for the all of the XSD and SOAP-ENC encodings public static final QName XSD_STRING = new QName(URI_DEFAULT_SCHEMA_XSD, "string"); 1.10 +58 -12 xml-axis/java/src/org/apache/axis/message/SOAPFault.java Index: SOAPFault.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/SOAPFault.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- SOAPFault.java 8 Oct 2002 03:31:33 -0000 1.9 +++ SOAPFault.java 20 Nov 2002 16:37:40 -0000 1.10 @@ -61,6 +61,7 @@ import org.apache.axis.utils.Messages; import org.apache.axis.encoding.DeserializationContext; import org.apache.axis.encoding.SerializationContext; +import org.apache.axis.soap.SOAPConstants; import org.w3c.dom.Element; import org.xml.sax.Attributes; @@ -84,21 +85,24 @@ { super(namespace, localName, prefix, attrs, context); this.fault = fault; - namespaceURI = Constants.URI_SOAP11_ENV; - name = Constants.ELEM_FAULT; } public SOAPFault(AxisFault fault) { this.fault = fault; - namespaceURI = Constants.URI_SOAP11_ENV; - name = Constants.ELEM_FAULT; } public void outputImpl(SerializationContext context) throws IOException { - context.registerPrefixForURI(prefix, namespaceURI); + SOAPConstants soapConstants = context.getMessageContext() == null ? + SOAPConstants.SOAP11_CONSTANTS : + context.getMessageContext().getSOAPConstants(); + + namespaceURI = soapConstants.getEnvelopeURI(); + name = Constants.ELEM_FAULT; + + context.registerPrefixForURI(prefix, soapConstants.getEnvelopeURI()); context.startElement(new QName(this.getNamespaceURI(), this.getName()), attributes); @@ -109,23 +113,61 @@ if (axisFault.getFaultCode() != null) { // Do this BEFORE starting the element, so the prefix gets // registered if needed. - String faultCode = context.qName2String(axisFault.getFaultCode()); - context.startElement(Constants.QNAME_FAULTCODE, null); - context.writeSafeString(faultCode); - context.endElement(); + if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) { + String faultCode = context.qName2String(axisFault.getFaultCode()); + context.startElement(Constants.QNAME_FAULTCODE_SOAP12, null); + context.startElement(Constants.QNAME_FAULTVALUE_SOAP12, null); + context.writeSafeString(faultCode); + context.endElement(); + QName[] subcodes = axisFault.getFaultSubCodes(); + if (subcodes != null) { + for (int i = 0; i < subcodes.length; i++) { + faultCode = context.qName2String(subcodes[i]); + context.startElement(Constants.QNAME_FAULTSUBCODE_SOAP12, null); + context.startElement(Constants.QNAME_FAULTVALUE_SOAP12, null); + context.writeSafeString(faultCode); + context.endElement(); + } + + for (int i = 0; i < subcodes.length; i++) + context.endElement(); + + } + context.endElement(); + } else { + String faultCode = context.qName2String(axisFault.getFaultCode()); + context.startElement(Constants.QNAME_FAULTCODE, null); + context.writeSafeString(faultCode); + context.endElement(); + } } if (axisFault.getFaultString() != null) { - context.startElement(Constants.QNAME_FAULTSTRING, null); + if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) + context.startElement(Constants.QNAME_FAULTREASON_SOAP12, null); + else + context.startElement(Constants.QNAME_FAULTSTRING, null); context.writeSafeString(axisFault.getFaultString()); context.endElement(); } if (axisFault.getFaultActor() != null) { - context.startElement(Constants.QNAME_FAULTACTOR, null); + if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) + context.startElement(Constants.QNAME_FAULTROLE_SOAP12, null); + else + context.startElement(Constants.QNAME_FAULTACTOR, null); + context.writeSafeString(axisFault.getFaultActor()); context.endElement(); } + + if (axisFault.getFaultNode() != null) { + if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) { + context.startElement(Constants.QNAME_FAULTNODE_SOAP12, null); + context.writeSafeString(axisFault.getFaultNode()); + context.endElement(); + } + } // get the QName for this faults detail element Class cls = fault.getClass(); @@ -141,7 +183,11 @@ } Element[] faultDetails = axisFault.getFaultDetails(); if (faultDetails != null) { - context.startElement(Constants.QNAME_FAULTDETAILS, null); + if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) + context.startElement(Constants.QNAME_FAULTDETAIL_SOAP12, null); + else + context.startElement(Constants.QNAME_FAULTDETAILS, null); + // Allow the fault to write its data, if any axisFault.writeDetails(qname, context); // Then output any other elements 1.25 +91 -22 xml-axis/java/src/org/apache/axis/message/SOAPFaultBuilder.java Index: SOAPFaultBuilder.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/SOAPFaultBuilder.java,v retrieving revision 1.24 retrieving revision 1.25 diff -u -r1.24 -r1.25 --- SOAPFaultBuilder.java 8 Oct 2002 03:31:33 -0000 1.24 +++ SOAPFaultBuilder.java 20 Nov 2002 16:37:40 -0000 1.25 @@ -60,12 +60,14 @@ import org.apache.axis.encoding.Deserializer; import org.apache.axis.encoding.Callback; import org.apache.axis.encoding.CallbackTarget; +import org.apache.axis.soap.SOAPConstants; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.w3c.dom.Element; import javax.xml.namespace.QName; +import java.util.Vector; import java.util.HashMap; import java.util.ArrayList; import java.lang.reflect.Constructor; @@ -84,22 +86,34 @@ protected SOAPFault element; protected DeserializationContext context; - static HashMap fields = new HashMap(); + static HashMap fields_soap11 = new HashMap(); + static HashMap fields_soap12 = new HashMap(); // Fault data protected QName faultCode = null; + protected QName[] faultSubCode = null; protected String faultString = null; protected String faultActor = null; protected Element[] faultDetails; + protected String faultNode = null; + + protected SOAPFaultCodeBuilder code; protected Class faultClass = null; protected Object faultData = null; static { - fields.put(Constants.ELEM_FAULT_CODE, Constants.XSD_QNAME); - fields.put(Constants.ELEM_FAULT_STRING, Constants.XSD_STRING); - fields.put(Constants.ELEM_FAULT_ACTOR, Constants.XSD_STRING); - fields.put(Constants.ELEM_FAULT_DETAIL, null); + fields_soap11.put(Constants.ELEM_FAULT_CODE, Constants.XSD_QNAME); + fields_soap11.put(Constants.ELEM_FAULT_STRING, Constants.XSD_STRING); + fields_soap11.put(Constants.ELEM_FAULT_ACTOR, Constants.XSD_STRING); + fields_soap11.put(Constants.ELEM_FAULT_DETAIL, null); + } + + static { + fields_soap12.put(Constants.ELEM_FAULT_REASON_SOAP12, Constants.XSD_STRING); + fields_soap12.put(Constants.ELEM_FAULT_ROLE_SOAP12, Constants.XSD_STRING); + fields_soap12.put(Constants.ELEM_FAULT_NODE_SOAP12, Constants.XSD_STRING); + fields_soap12.put(Constants.ELEM_FAULT_DETAIL_SOAP12, null); } public SOAPFaultBuilder(SOAPFault element, @@ -145,9 +159,13 @@ */ private void createFault() { AxisFault f = null; + + SOAPConstants soapConstants = context.getMessageContext().getSOAPConstants(); + if (faultClass != null) { // Custom fault handling try { + // If we have an element which is fault data, It can be: // 1. A simple type that needs to be passed in to the constructor // 2. A complex type that is the exception itself @@ -171,22 +189,47 @@ // this is to support the <exceptionName> detail f = (AxisFault) faultClass.newInstance(); } - f.setFaultCode(faultCode); + + if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) { + f.setFaultCode(code.getFaultCode()); + + SOAPFaultCodeBuilder c = code; + while ((c = c.getNext()) != null) { + f.addFaultSubCode(c.getFaultCode()); + } + } + f.setFaultString(faultString); f.setFaultActor(faultActor); - f.setFaultDetail(faultDetails); + f.setFaultNode(faultNode); + f.setFaultDetail(faultDetails); } - } - catch (Exception e) { + } catch (Exception e) { // Don't do anything here, since a problem above means // we'll just fall through and use a plain AxisFault. } } if (f == null) { + if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) { + faultCode = code.getFaultCode(); + if (code.getNext() != null) + { + Vector v = new Vector(); + + SOAPFaultCodeBuilder c = code; + while ((c = c.getNext()) != null) + v.add(c.getFaultCode()); + + faultSubCode = (QName[])v.toArray(new QName[v.size()]); + } + } + f = new AxisFault(faultCode, + faultSubCode, faultString, faultActor, + faultNode, faultDetails); } @@ -201,21 +244,36 @@ throws SAXException { SOAPHandler retHandler = null; + + SOAPConstants soapConstants = context.getMessageContext().getSOAPConstants(); - QName qName = (QName)fields.get(name); - + QName qName = null; // If we found the type for this field, get the deserializer // otherwise, if this is the details element, use the special // SOAPFaultDetailsBuilder handler to take care of custom fault data + if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) { + qName = (QName)fields_soap12.get(name); + if (qName == null) { + QName thisQName = new QName(namespace, name); + if (thisQName.equals(Constants.QNAME_FAULTCODE_SOAP12)) + return (code = new SOAPFaultCodeBuilder(context)); + else if (thisQName.equals(Constants.QNAME_FAULTDETAIL_SOAP12)) + return new SOAPFaultDetailsBuilder(this); + + } + } else { + qName = (QName)fields_soap11.get(name); + if (qName == null && name.equals(Constants.ELEM_FAULT_DETAIL)) + return new SOAPFaultDetailsBuilder(this); + } + if (qName != null) { Deserializer currentDeser = context.getDeserializerForType(qName); if (currentDeser != null) { - currentDeser.registerValueTarget(new CallbackTarget(this, name)); + currentDeser.registerValueTarget(new CallbackTarget(this, new QName(namespace, name))); } retHandler = (SOAPHandler) currentDeser; - } else if (name.equals(Constants.ELEM_FAULT_DETAIL)) { - retHandler = new SOAPFaultDetailsBuilder(this); - } + } return retHandler; } @@ -250,14 +308,25 @@ */ public void setValue(Object value, Object hint) { - String name = (String)hint; - if (name.equals(Constants.ELEM_FAULT_CODE)) { - faultCode = (QName)value; - } else if (name.equals(Constants.ELEM_FAULT_STRING)) { - faultString = (String) value; - } else if (name.equals(Constants.ELEM_FAULT_ACTOR)) { - faultActor = (String) value; + String local = ((QName)hint).getLocalPart(); + if (((QName)hint).getNamespaceURI().equals(Constants.URI_SOAP12_ENV)) { + if (local.equals(Constants.ELEM_FAULT_ROLE_SOAP12)) { + faultActor = (String) value; + } else if (local.equals(Constants.ELEM_FAULT_REASON_SOAP12)) { + faultString = (String) value; + } else if (local.equals(Constants.ELEM_FAULT_NODE_SOAP12)) { + faultNode = (String) value; + } + } else { + if (local.equals(Constants.ELEM_FAULT_CODE)) { + faultCode = (QName)value; + } else if (local.equals(Constants.ELEM_FAULT_STRING)) { + faultString = (String) value; + } else if (local.equals(Constants.ELEM_FAULT_ACTOR)) { + faultActor = (String) value; + } } + } /** 1.1 xml-axis/java/src/org/apache/axis/message/SOAPFaultCodeBuilder.java Index: SOAPFaultCodeBuilder.java =================================================================== /* * The Apache Software License, Version 1.1 * * * Copyright (c) 2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Axis" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.axis.message; import org.apache.axis.AxisFault; import org.apache.axis.Constants; import org.apache.axis.encoding.DeserializationContext; import org.apache.axis.encoding.Deserializer; import org.apache.axis.encoding.Callback; import org.apache.axis.encoding.CallbackTarget; import org.xml.sax.SAXException; import org.xml.sax.Attributes; import java.util.Vector; import javax.xml.namespace.QName; /** * Build a Fault body element. * * @author Sam Ruby ([EMAIL PROTECTED]) * @author Glen Daniels ([EMAIL PROTECTED]) * @author Tom Jordahl ([EMAIL PROTECTED]) */ public class SOAPFaultCodeBuilder extends SOAPHandler implements Callback { // Fault data protected QName faultCode = null; protected SOAPFaultCodeBuilder next = null; protected DeserializationContext context; public SOAPFaultCodeBuilder(DeserializationContext context) { this.context = context; } public QName getFaultCode() { return faultCode; } public SOAPFaultCodeBuilder getNext() { return next; } public SOAPHandler onStartChild(String namespace, String name, String prefix, Attributes attributes, DeserializationContext context) throws SAXException { QName thisQName = new QName(namespace, name); if (thisQName.equals(Constants.QNAME_FAULTVALUE_SOAP12)) { Deserializer currentDeser = null; currentDeser = context.getDeserializerForType(Constants.XSD_STRING); if (currentDeser != null) { currentDeser.registerValueTarget(new CallbackTarget(this, thisQName)); } return (SOAPHandler)currentDeser; } else if (thisQName.equals(Constants.QNAME_FAULTSUBCODE_SOAP12)) { return (next = new SOAPFaultCodeBuilder(context)); } else return null; } /* * Defined by Callback. * This method gets control when the callback is invoked. * @param is the value to set. * @param hint is an Object that provide additional hint information. */ public void setValue(Object value, Object hint) { QName thisQName = (QName)hint; if (thisQName.equals(Constants.QNAME_FAULTVALUE_SOAP12)) { QName qname = context.getQNameFromString((String)value); if (qname != null) { faultCode = qname; } else { faultCode = new QName("",(String) value); } } } }