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 to...@apache.org on 2004/10/11 16:15:17 UTC

cvs commit: ws-axis/java/src/org/apache/axis/encoding/ser ArraySerializer.java

tomj        2004/10/11 07:15:17

  Modified:    java/src/org/apache/axis/encoding/ser ArraySerializer.java
  Log:
  Fix regression problems with SOAP encoded arrays:
  
  - Don't use "currentXMLType" from context if we are encoded, get the
    type of the array from the componentType.
  - Always set the xsi:type attribute of encoded arrays to soapenc:Array
  - If we are doing encoded arrays, don't send xsi:type for each element
  
  Revision  Changes    Path
  1.57      +33 -19    ws-axis/java/src/org/apache/axis/encoding/ser/ArraySerializer.java
  
  Index: ArraySerializer.java
  ===================================================================
  RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/encoding/ser/ArraySerializer.java,v
  retrieving revision 1.56
  retrieving revision 1.57
  diff -u -r1.56 -r1.57
  --- ArraySerializer.java	29 Jul 2004 21:40:26 -0000	1.56
  +++ ArraySerializer.java	11 Oct 2004 14:15:17 -0000	1.57
  @@ -125,14 +125,17 @@
   
           // Get the QName of the componentType.
           // If not found, look at the super classes
  -        QName componentQName = context.getCurrentXMLType();
  -        if (componentQName != null) {
  -            if ((componentQName.equals(xmlType) ||
  -                    componentQName.equals(soap.getArrayType()))) {
  -                componentQName = null;
  +        QName componentQName = null;
  +        if (!encoded) {
  +            componentQName = context.getCurrentXMLType();
  +            if (componentQName != null) {
  +                if ((componentQName.equals(xmlType) ||
  +                     componentQName.equals(soap.getArrayType()))) {
  +                         componentQName = null;
  +                     }
               }
           }
  -        
  +
           if (componentQName == null) {
               componentQName = context.getQNameForClass(componentType);
           }
  @@ -292,29 +295,37 @@
               //          and may be useful for operation overloading.
               //   Cons:  More interop test failures (as of 2/6/2002).
               //
  +            String qname =
  +                    context.getPrefixForURI(schema.getXsiURI(),
  +                                            "xsi") + ":type";
  +            QName soapArray;
  +            if (soap == SOAPConstants.SOAP12_CONSTANTS) {
  +                soapArray = Constants.SOAP_ARRAY12;
  +            } else {
  +                soapArray = Constants.SOAP_ARRAY;
  +            }
  +
               int typeI = attrs.getIndex(schema.getXsiURI(),
                                          "type");
               if (typeI != -1) {
  -                String qname =
  -                      context.getPrefixForURI(schema.getXsiURI(),
  -                                              "xsi") + ":type";
  -                QName soapArray;
  -                if (soap == SOAPConstants.SOAP12_CONSTANTS) {
  -                    soapArray = Constants.SOAP_ARRAY12;
  -                } else {
  -                    soapArray = Constants.SOAP_ARRAY;
  -                }
  -
                   attrs.setAttribute(typeI,
                                      schema.getXsiURI(),
                                      "type",
                                      qname,
                                      "CDATA",
                                      context.qName2String(soapArray));
  +            } else {
  +                attrs.addAttribute(schema.getXsiURI(),
  +                                   "type",
  +                                   qname,
  +                                   "CDATA",
  +                                   context.qName2String(soapArray));
               }
  +
               attributes = attrs;
           }
   
  +        Boolean sendType = null;
           // For the maxOccurs case, each item is named with the QName
           // we got in the arguments.  For normal array case, we write an element with
           // that QName, and then serialize each item as <item>
  @@ -324,8 +335,11 @@
               serializeAttr = null;  // since we are putting them here
               context.startElement(name, attributes);
               elementName = Constants.QNAME_LITERAL_ITEM;
  +            // If we are doing SOAP encoded arrays, no need to add xsi:type to the items
  +            sendType = Boolean.FALSE;
           }
   
  +
           if (dim2Len < 0) {
               // Normal case, serialize each array element
               if (list == null) {
  @@ -336,7 +350,7 @@
                       context.serialize(elementName, serializeAttr, aValue,
                                         componentQName, // prefered type QName
                                         true,   // Send null values
  -                                      null);  // Respect default type config
  +                                      sendType);  // Add xsi:type?
                   }
               } else {
                   for (Iterator iterator = list.iterator(); iterator.hasNext();) {
  @@ -346,7 +360,7 @@
                       context.serialize(elementName, serializeAttr, aValue,
                                         componentQName, // prefered type QName
                                         true,   // Send null values
  -                                      null);  // Respect default type config
  +                                      sendType);  // Add xsi:type?
   
                   }
               }
  @@ -355,7 +369,7 @@
               for (int index = 0; index < len; index++) {
                   for (int index2 = 0; index2 < dim2Len; index2++) {
                       Object aValue = Array.get(Array.get(value, index), index2);
  -                    context.serialize(elementName, null, aValue, componentQName, true, null);
  +                    context.serialize(elementName, null, aValue, componentQName, true, sendType);
                   }
               }
           }
  
  
  

RE: cvs commit: ws-axis/java/src/org/apache/axis/encoding/ser ArraySerializer.java

Posted by Glen Daniels <gl...@thoughtcraft.com>.
Hi Tom:

Please be sure that we still send xsi:type if necessary on array items after
this change.  Consider the case where we have an array of BaseType, and send
three BaseTypes followed by a SubType.  At LEAST the SubType element should
definitely have xsi:type on it!

Why was setting xsi:type on each element a problem??

--Glen 

> -----Original Message-----
> From: tomj@apache.org [mailto:tomj@apache.org] 
> Sent: Monday, October 11, 2004 7:15 AM
> To: ws-axis-cvs@apache.org
> Subject: cvs commit: 
> ws-axis/java/src/org/apache/axis/encoding/ser ArraySerializer.java
> 
> tomj        2004/10/11 07:15:17
> 
>   Modified:    java/src/org/apache/axis/encoding/ser 
> ArraySerializer.java
>   Log:
>   Fix regression problems with SOAP encoded arrays:
>   
>   - Don't use "currentXMLType" from context if we are encoded, get the
>     type of the array from the componentType.
>   - Always set the xsi:type attribute of encoded arrays to 
> soapenc:Array
>   - If we are doing encoded arrays, don't send xsi:type for 
> each element
>   
>   Revision  Changes    Path
>   1.57      +33 -19    
> ws-axis/java/src/org/apache/axis/encoding/ser/ArraySerializer.java
>   
>   Index: ArraySerializer.java
>   ===================================================================
>   RCS file: 
> /home/cvs/ws-axis/java/src/org/apache/axis/encoding/ser/ArrayS
> erializer.java,v
>   retrieving revision 1.56
>   retrieving revision 1.57
>   diff -u -r1.56 -r1.57
>   --- ArraySerializer.java	29 Jul 2004 21:40:26 -0000	1.56
>   +++ ArraySerializer.java	11 Oct 2004 14:15:17 -0000	1.57
>   @@ -125,14 +125,17 @@
>    
>            // Get the QName of the componentType.
>            // If not found, look at the super classes
>   -        QName componentQName = context.getCurrentXMLType();
>   -        if (componentQName != null) {
>   -            if ((componentQName.equals(xmlType) ||
>   -                    componentQName.equals(soap.getArrayType()))) {
>   -                componentQName = null;
>   +        QName componentQName = null;
>   +        if (!encoded) {
>   +            componentQName = context.getCurrentXMLType();
>   +            if (componentQName != null) {
>   +                if ((componentQName.equals(xmlType) ||
>   +                     componentQName.equals(soap.getArrayType()))) {
>   +                         componentQName = null;
>   +                     }
>                }
>            }
>   -        
>   +
>            if (componentQName == null) {
>                componentQName = 
> context.getQNameForClass(componentType);
>            }
>   @@ -292,29 +295,37 @@
>                //          and may be useful for operation 
> overloading.
>                //   Cons:  More interop test failures (as of 
> 2/6/2002).
>                //
>   +            String qname =
>   +                    context.getPrefixForURI(schema.getXsiURI(),
>   +                                            "xsi") + ":type";
>   +            QName soapArray;
>   +            if (soap == SOAPConstants.SOAP12_CONSTANTS) {
>   +                soapArray = Constants.SOAP_ARRAY12;
>   +            } else {
>   +                soapArray = Constants.SOAP_ARRAY;
>   +            }
>   +
>                int typeI = attrs.getIndex(schema.getXsiURI(),
>                                           "type");
>                if (typeI != -1) {
>   -                String qname =
>   -                      context.getPrefixForURI(schema.getXsiURI(),
>   -                                              "xsi") + ":type";
>   -                QName soapArray;
>   -                if (soap == SOAPConstants.SOAP12_CONSTANTS) {
>   -                    soapArray = Constants.SOAP_ARRAY12;
>   -                } else {
>   -                    soapArray = Constants.SOAP_ARRAY;
>   -                }
>   -
>                    attrs.setAttribute(typeI,
>                                       schema.getXsiURI(),
>                                       "type",
>                                       qname,
>                                       "CDATA",
>                                       
> context.qName2String(soapArray));
>   +            } else {
>   +                attrs.addAttribute(schema.getXsiURI(),
>   +                                   "type",
>   +                                   qname,
>   +                                   "CDATA",
>   +                                   
> context.qName2String(soapArray));
>                }
>   +
>                attributes = attrs;
>            }
>    
>   +        Boolean sendType = null;
>            // For the maxOccurs case, each item is named with 
> the QName
>            // we got in the arguments.  For normal array 
> case, we write an element with
>            // that QName, and then serialize each item as <item>
>   @@ -324,8 +335,11 @@
>                serializeAttr = null;  // since we are putting 
> them here
>                context.startElement(name, attributes);
>                elementName = Constants.QNAME_LITERAL_ITEM;
>   +            // If we are doing SOAP encoded arrays, no 
> need to add xsi:type to the items
>   +            sendType = Boolean.FALSE;
>            }
>    
>   +
>            if (dim2Len < 0) {
>                // Normal case, serialize each array element
>                if (list == null) {
>   @@ -336,7 +350,7 @@
>                        context.serialize(elementName, 
> serializeAttr, aValue,
>                                          componentQName, // 
> prefered type QName
>                                          true,   // Send null values
>   -                                      null);  // Respect 
> default type config
>   +                                      sendType);  // Add xsi:type?
>                    }
>                } else {
>                    for (Iterator iterator = list.iterator(); 
> iterator.hasNext();) {
>   @@ -346,7 +360,7 @@
>                        context.serialize(elementName, 
> serializeAttr, aValue,
>                                          componentQName, // 
> prefered type QName
>                                          true,   // Send null values
>   -                                      null);  // Respect 
> default type config
>   +                                      sendType);  // Add xsi:type?
>    
>                    }
>                }
>   @@ -355,7 +369,7 @@
>                for (int index = 0; index < len; index++) {
>                    for (int index2 = 0; index2 < dim2Len; index2++) {
>                        Object aValue = 
> Array.get(Array.get(value, index), index2);
>   -                    context.serialize(elementName, null, 
> aValue, componentQName, true, null);
>   +                    context.serialize(elementName, null, 
> aValue, componentQName, true, sendType);
>                    }
>                }
>            }
>   
>   
>   
> 
>