You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by An...@nokia.com on 2002/11/14 13:33:53 UTC

soap 1.2 axisfault patch

Hi,

I have attached some patches about the SOAP 1.2 compliance of FAULT (also serializers and deserialziers). Please check them and let me know if you have any suggestions.

Br,
Andras

*******************************************************************
--- 1_0/org/apache/axis/AxisFault.java	Tue Sep 17 22:38:10 2002
+++ mysoap12/org/apache/axis/AxisFault.java	Thu Nov 14 10:51:17 2002
@@ -90,9 +90,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;
@@ -103,7 +105,7 @@
      * AxisFault.  If the Exception is an InvocationTargetException (which
      * already wraps another Exception), get the wrapped Exception out from
      * there and use that instead of the passed one.
-     */ 
+     */
     public static AxisFault makeFault(Exception e)
     {
         if (e instanceof InvocationTargetException) {
@@ -112,14 +114,17 @@
                 e = (Exception)t;
             }
         }
-        
+
         if (e instanceof AxisFault) {
             return (AxisFault)e;
         }
-        
+
         return new AxisFault(e);
     }
-    
+
+    /**
+     * @deprecated
+     */
     public AxisFault(String code, String str,
                      String actor, Element[] details) {
         super (str);
@@ -131,6 +136,9 @@
             initFromException(this);
     }
 
+    /**
+     * @deprecated
+     */
     public AxisFault(QName code, String str,
                      String actor, Element[] details) {
         super (str);
@@ -142,21 +150,36 @@
             initFromException(this);
     }
 
+    public AxisFault(QName code, QName[] subcodes, String str,
+                     String actor, String node, Element[] details) {
+        super (str);
+        setFaultCode( code );
+        if (subcodes != null)
+            for (int i = 0; i < subcodes.length; i++)
+                addFaultSubCode( subcodes[i] );
+        setFaultString( str );
+        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 ?
         setFaultCode( Constants.FAULT_SERVER_USER );
-        
         initFromException(target);
     }
 
     public AxisFault(String message)
     {
         super (message);
+        // ? SOAP 1.2 or 1.1 ?
         setFaultCode(Constants.FAULT_SERVER_GENERAL);
         setFaultString(message);
         initFromException(this);
@@ -168,14 +191,16 @@
     public AxisFault()
     {
         super();
-        setFaultCode(Constants.FAULT_SERVER_GENERAL);     
+        // ? SOAP 1.2 or 1.1 ?
+        setFaultCode( Constants.FAULT_SERVER_USER );
         initFromException(this);
     }
 
     public AxisFault (String message, Throwable t)
     {
         super (message, t);
-        setFaultCode(Constants.FAULT_SERVER_GENERAL);
+        // ? SOAP 1.2 or 1.1 ?
+        setFaultCode( Constants.FAULT_SERVER_USER );
         setFaultString(message);
     }
 
@@ -190,34 +215,34 @@
             }
         }
 
-        // Set the exception message (if any) as the fault string 
+        // Set the exception message (if any) as the fault string
         setFaultString( target.toString() );
-        
+
         if (faultDetails == null) faultDetails = new Vector();
 
         Element el;
-        
+
         // If we're derived from AxisFault, then put the exception class
         // into the "exceptionName" element in the details.  This allows
         // us to get back a correct Java Exception class on the other side
         // (assuming they have it available).
-        
+
         if ((target instanceof AxisFault) &&
             (target.getClass() != AxisFault.class)) {
-            el = XMLUtils.StringToElement(Constants.NS_URI_AXIS, 
-                                                  "exceptionName", 
+            el = XMLUtils.StringToElement(Constants.NS_URI_AXIS,
+                                                  "exceptionName",
                                                   target.getClass().getName());
-            
-            faultDetails.add(el);        
+
+            faultDetails.add(el);
         }
-        
-        el =  XMLUtils.StringToElement(Constants.NS_URI_AXIS, 
-                                       "stackTrace", 
+
+        el =  XMLUtils.StringToElement(Constants.NS_URI_AXIS,
+                                       "stackTrace",
                                        JavaUtils.stackToString(target));
 
         faultDetails.add(el);
     }
-    
+
     public void dump()
     {
         log.debug(dumpToString());
@@ -235,11 +260,22 @@
                           + XMLUtils.getInnerXMLString(e);
             }
         }
-        
+
+        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
             ;
     }
@@ -249,11 +285,46 @@
     }
 
     public void setFaultCode(String code) {
-        faultCode = new QName(Constants.NS_URI_AXIS, code);
+        faultCode = new QName(Constants.URI_SOAP12_ENV, code);
+    }
+
+    /**
+     * This is new in SOAP 1.2, ignored in SOAP 1.1
+     * @return
+     */
+    public void addFaultSubCode(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 getFaultCode() {
-        return( faultCode );
+        return(faultCode);
+    }
+
+    public QName[] getFaultSubCodes() {
+        if (faultSubCode == null)
+            return null;
+        QName[] q = new QName[faultSubCode.size()];
+        return (QName[])faultSubCode.toArray(q);
     }
 
     public void setFaultString(String str) {
@@ -268,14 +339,63 @@
         return( faultString );
     }
 
-    public void setFaultActor(String actor) {
-        faultActor = actor ;
+    /**
+     * 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();
+    }
+
+
     public String getFaultActor() {
         return( faultActor );
     }
 
+    public void setFaultActor(String actor) {
+        faultActor = actor ;
+    }
+
+    /**
+     * 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;
+    }
+
     public void setFaultDetail(Element[] details) {
         if ( details == null ) return ;
         faultDetails = new Vector( details.length );
@@ -309,7 +429,7 @@
             result[i] = (Element) faultDetails.elementAt(i);
         return result;
     }
-    
+
     public void output(SerializationContext context) throws Exception {
 
         SOAPEnvelope envelope = new SOAPEnvelope();



*******************************************************************
--- 1_0/org/apache/axis/Constants.java	Fri Sep 13 22:43:26 2002
+++ mysoap12/org/apache/axis/Constants.java	Tue Nov 12 13:25:53 2002
@@ -95,7 +95,7 @@
     //
     // Default SOAP version
     //
-    public static final SOAPConstants DEFAULT_SOAP_VERSION = 
+    public static final SOAPConstants DEFAULT_SOAP_VERSION =
         SOAPConstants.SOAP11_CONSTANTS;
 
     //
@@ -105,7 +105,7 @@
                                 "http://schemas.xmlsoap.org/soap/envelope/" ;
     public static final String URI_SOAP12_ENV =
                                    "http://www.w3.org/2002/06/soap-envelope";
-    public static final String URI_DEFAULT_SOAP_ENV = 
+    public static final String URI_DEFAULT_SOAP_ENV =
         DEFAULT_SOAP_VERSION.getEnvelopeURI();
 
     public static final String[] URIS_SOAP_ENV = {
@@ -144,7 +144,7 @@
                                 "http://schemas.xmlsoap.org/soap/encoding/" ;
     public static final String URI_SOAP12_ENC =
                                    "http://www.w3.org/2002/06/soap-encoding";
-    public static final String URI_DEFAULT_SOAP_ENC = 
+    public static final String URI_DEFAULT_SOAP_ENC =
         DEFAULT_SOAP_VERSION.getEncodingURI();
 
     public static final String[] URIS_SOAP_ENC = {
@@ -409,6 +409,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" ;
@@ -434,6 +442,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 =
@@ -445,6 +468,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");
@@ -545,7 +583,7 @@
     // When invoked from a servlet, per JAX-RPC, we need  a
     // ServletEndpointContext object.  This is where it lives.
     public static final String MC_SERVLET_ENDPOINT_CONTEXT = "servletEndpointContext";
-    
+
     public static final String AXIS_VERSION="Axis/1.0";
 
 }

*******************************************************************
--- 1_0/org/apache/axis/Message/SOAPFault.java	Wed Sep 18 18:10:28 2002
+++ mysoap12/org/apache/axis/Message/SOAPFault.java	Mon Nov 11 21:41:32 2002
@@ -60,6 +60,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;
 
@@ -83,21 +84,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);
@@ -108,27 +112,69 @@
             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();
+                }
+            }
+
             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);
+
                 for (int i = 0; i < faultDetails.length; i++) {
                     context.writeDOMElement(faultDetails[i]);
                 }
*******************************************************************
--- 1_0/org/apache/axis/Message/SOAPFaultBuilder.java	Sun Jun 23 01:14:04 2002
+++ mysoap12/org/apache/axis/Message/SOAPFaultBuilder.java	Wed Nov 13 21:10:12 2002
@@ -2,7 +2,7 @@
  * The Apache Software License, Version 1.1
  *
  *
- * Copyright (c) 2001 The Apache Software Foundation.  All rights 
+ * Copyright (c) 2001 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -10,7 +10,7 @@
  * are met:
  *
  * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
+ *    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
@@ -18,7 +18,7 @@
  *    distribution.
  *
  * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
+ *    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,
@@ -26,7 +26,7 @@
  *
  * 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 
+ *    software without prior written permission. For written
  *    permission, please contact apache@apache.org.
  *
  * 5. Products derived from this software may not be called "Apache",
@@ -61,6 +61,7 @@
 import org.apache.axis.encoding.Callback;
 import org.apache.axis.encoding.CallbackTarget;
 import org.apache.axis.utils.ClassUtils;
+import org.apache.axis.soap.SOAPConstants;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.w3c.dom.Element;
@@ -71,10 +72,11 @@
 import java.util.HashMap;
 import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.Vector;
 
-/** 
+/**
  * Build a Fault body element.
- * 
+ *
  * @author Sam Ruby (rubys@us.ibm.com)
  * @author Glen Daniels (gdaniels@macromedia.com)
  * @author Tom Jordahl (tomj@macromedia.com)
@@ -83,46 +85,69 @@
 {
     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 String faultClassName = null;
-    protected QName faultCode = null;
     protected String faultString = null;
     protected String faultActor = null;
     protected Element[] faultDetails;
+    protected String    faultNode = null;
+    protected QName faultCode;
+    protected Vector faultSubCode = null;
+
+    protected SOAPFaultCodeBuilder code;
 
     static {
-        fields.put(Constants.ELEM_FAULT_CODE, Constants.XSD_STRING);
-        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_STRING);
+        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,
                             DeserializationContext context) {
         this.element = element;
         this.context = context;
     }
 
+    private void fillAxisFault(AxisFault f) {
+        f.setFaultCode(code.getFaultCode());
+
+        SOAPFaultCodeBuilder c = code;
+        while ((c = c.getNext()) != null) {
+            f.addFaultSubCode(c.getFaultCode());
+        }
+
+        f.setFaultString(faultString);
+        f.setFaultActor(faultActor);
+        f.setFaultNode(faultNode);
+        f.setFaultDetail(faultDetails);
+    }
+
     /**
      * Final call back where we can populate the exception with data.
-     */ 
+     */
     public void endElement(String namespace, String localName,
                            DeserializationContext context)
             throws SAXException {
         super.endElement(namespace, localName, context);
-        
+
         AxisFault f = null;
         if (faultClassName != null) {
             try {
                 Class exClass = ClassUtils.forName(faultClassName);
                 if (AxisFault.class.isAssignableFrom(exClass)) {
                     f = (AxisFault) exClass.newInstance();
-                    f.setFaultCode(faultCode);
-                    f.setFaultString(faultString);
-                    f.setFaultActor(faultActor);
-                    f.setFaultDetail(faultDetails);
+                    fillAxisFault(f);
                 }
             }
             catch (Exception e) {
@@ -132,12 +157,10 @@
         }
 
         if (f == null) {
-            f  = new AxisFault(faultCode, 
-                               faultString, 
-                               faultActor, 
-                               faultDetails);
+            f  = new AxisFault();
+            fillAxisFault(f);
         }
-        
+
         element.setFault(f);
     }
 
@@ -149,22 +172,35 @@
         throws SAXException
     {
         Deserializer currentDeser = null;
-        
-        QName qName = (QName)fields.get(name);
-        
+
+        SOAPConstants soapConstants = context.getMessageContext().getSOAPConstants();
+
+        QName qName;
+        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 {
+            qName = (QName)fields_soap11.get(name);
+        }
+
         if (qName != null) {
             currentDeser = context.getDeserializerForType(qName);
             if (currentDeser != null) {
-                currentDeser.registerValueTarget(new CallbackTarget(this, name));
+                currentDeser.registerValueTarget(new CallbackTarget(this, new QName(namespace, name)));
             }
         }
-        
+
         return (SOAPHandler)currentDeser;
     }
 
     public void onEndChild(String namespace, String localName,
                            DeserializationContext context)
             throws SAXException {
+
         if (Constants.ELEM_FAULT_DETAIL.equals(localName)) {
             MessageElement el = context.getCurElement();
             ArrayList children = el.getChildren();
@@ -187,7 +223,7 @@
         }
     }
 
-    /* 
+    /*
      * Defined by Callback.
      * This method gets control when the callback is invoked.
      * @param is the value to set.
@@ -195,21 +231,31 @@
      */
     public void setValue(Object value, Object hint)
     {
-        String name = (String)hint;
-        if (name.equals(Constants.ELEM_FAULT_CODE)) {
-            QName qname = context.getQNameFromString((String)value);
-            if (qname != null) {
-                //??when would QName make sense, this would be app specific
-                faultCode = qname;
-            } else {
-                //?? Where would namespace come from
-                faultCode = new QName("",(String) 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)) {
+                QName qname = context.getQNameFromString((String)value);
+                if (qname != null) {
+                    //??when would QName make sense, this would be app specific
+                    faultCode = qname;
+                } else {
+                    //?? Where would namespace come from
+                    faultCode = new QName("",(String) value);
+                }
+            } else if (local.equals(Constants.ELEM_FAULT_STRING)) {
+                faultString = (String) value;
+            } else if (local.equals(Constants.ELEM_FAULT_ACTOR)) {
+                faultActor = (String) value;
+            }
         }
-        
+
     }
 }

Added file 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 apache@apache.org.
 *
 * 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 (rubys@us.ibm.com)
 * @author Glen Daniels (gdaniels@macromedia.com)
 * @author Tom Jordahl (tomj@macromedia.com)
 */
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);
            }
        }
    }
}


 <<AxisFault.java>>  <<Constants.java>>  <<SOAPFaultBuilder.java>>  <<SOAPFaultCodeBuilder.java>>  <<SOAPFault.java>> 

Re: soap 1.2 axisfault patch

Posted by Davanum Srinivas <di...@yahoo.com>.
Andras,

Please post these to bugzilla (http://nagoya.apache.org/bugzilla).

Thanks,
dims

--- Andras.Avar@nokia.com wrote:
> Hi,
> 
> I have attached some patches about the SOAP 1.2 compliance of FAULT (also serializers and
> deserialziers). Please check them and let me know if you have any suggestions.
> 
> Br,
> Andras
> 
> *******************************************************************
> --- 1_0/org/apache/axis/AxisFault.java	Tue Sep 17 22:38:10 2002
> +++ mysoap12/org/apache/axis/AxisFault.java	Thu Nov 14 10:51:17 2002
> @@ -90,9 +90,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;
> @@ -103,7 +105,7 @@
>       * AxisFault.  If the Exception is an InvocationTargetException (which
>       * already wraps another Exception), get the wrapped Exception out from
>       * there and use that instead of the passed one.
> -     */ 
> +     */
>      public static AxisFault makeFault(Exception e)
>      {
>          if (e instanceof InvocationTargetException) {
> @@ -112,14 +114,17 @@
>                  e = (Exception)t;
>              }
>          }
> -        
> +
>          if (e instanceof AxisFault) {
>              return (AxisFault)e;
>          }
> -        
> +
>          return new AxisFault(e);
>      }
> -    
> +
> +    /**
> +     * @deprecated
> +     */
>      public AxisFault(String code, String str,
>                       String actor, Element[] details) {
>          super (str);
> @@ -131,6 +136,9 @@
>              initFromException(this);
>      }
>  
> +    /**
> +     * @deprecated
> +     */
>      public AxisFault(QName code, String str,
>                       String actor, Element[] details) {
>          super (str);
> @@ -142,21 +150,36 @@
>              initFromException(this);
>      }
>  
> +    public AxisFault(QName code, QName[] subcodes, String str,
> +                     String actor, String node, Element[] details) {
> +        super (str);
> +        setFaultCode( code );
> +        if (subcodes != null)
> +            for (int i = 0; i < subcodes.length; i++)
> +                addFaultSubCode( subcodes[i] );
> +        setFaultString( str );
> +        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 ?
>          setFaultCode( Constants.FAULT_SERVER_USER );
> -        
>          initFromException(target);
>      }
>  
>      public AxisFault(String message)
>      {
>          super (message);
> +        // ? SOAP 1.2 or 1.1 ?
>          setFaultCode(Constants.FAULT_SERVER_GENERAL);
>          setFaultString(message);
>          initFromException(this);
> @@ -168,14 +191,16 @@
>      public AxisFault()
>      {
>          super();
> -        setFaultCode(Constants.FAULT_SERVER_GENERAL);     
> +        // ? SOAP 1.2 or 1.1 ?
> +        setFaultCode( Constants.FAULT_SERVER_USER );
>          initFromException(this);
>      }
>  
>      public AxisFault (String message, Throwable t)
>      {
>          super (message, t);
> -        setFaultCode(Constants.FAULT_SERVER_GENERAL);
> +        // ? SOAP 1.2 or 1.1 ?
> +        setFaultCode( Constants.FAULT_SERVER_USER );
>          setFaultString(message);
>      }
>  
> @@ -190,34 +215,34 @@
>              }
>          }
>  
> -        // Set the exception message (if any) as the fault string 
> +        // Set the exception message (if any) as the fault string
>          setFaultString( target.toString() );
> -        
> +
>          if (faultDetails == null) faultDetails = new Vector();
>  
>          Element el;
> -        
> +
>          // If we're derived from AxisFault, then put the exception class
>          // into the "exceptionName" element in the details.  This allows
>          // us to get back a correct Java Exception class on the other side
>          // (assuming they have it available).
> -        
> +
>          if ((target instanceof AxisFault) &&
>              (target.getClass() != AxisFault.class)) {
> -            el = XMLUtils.StringToElement(Constants.NS_URI_AXIS, 
> -                                                  "exceptionName", 
> +            el = XMLUtils.StringToElement(Constants.NS_URI_AXIS,
> +                                                  "exceptionName",
>                                                    target.getClass().getName());
> -            
> -            faultDetails.add(el);        
> +
> +            faultDetails.add(el);
>          }
> -        
> -        el =  XMLUtils.StringToElement(Constants.NS_URI_AXIS, 
> -                                       "stackTrace", 
> +
> +        el =  XMLUtils.StringToElement(Constants.NS_URI_AXIS,
> +                                       "stackTrace",
>                                         JavaUtils.stackToString(target));
>  
>          faultDetails.add(el);
>      }
> -    
> +
>      public void dump()
>      {
>          log.debug(dumpToString());
> @@ -235,11 +260,22 @@
>                            + XMLUtils.getInnerXMLString(e);
>              }
>          }
> -        
> +
> +        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
>              ;
>      }
> @@ -249,11 +285,46 @@
>      }
>  
>      public void setFaultCode(String code) {
> -        faultCode = new QName(Constants.NS_URI_AXIS, code);
> +        faultCode = new QName(Constants.URI_SOAP12_ENV, code);
> +    }
> +
> 
=== message truncated ===

> ATTACHMENT part 2 application/octet-stream name=AxisFault.java


> ATTACHMENT part 3 application/octet-stream name=Constants.java


> ATTACHMENT part 4 application/octet-stream name=SOAPFaultBuilder.java


> ATTACHMENT part 5 application/octet-stream name=SOAPFaultCodeBuilder.java


> ATTACHMENT part 6 application/octet-stream name=SOAPFault.java



=====
Davanum Srinivas - http://xml.apache.org/~dims/

__________________________________________________
Do you Yahoo!?
Yahoo! Web Hosting - Let the expert host your site
http://webhosting.yahoo.com