dims        2002/12/20 09:28:23

  Modified:    java/src/org/apache/axis/encoding/ser ArrayDeserializer.java
                        ArraySerializer.java BeanDeserializer.java
                        JAFDataHandlerDeserializer.java
                        JAFDataHandlerSerializer.java
               java/src/org/apache/axis Constants.java
               java/src/org/apache/axis/encoding
                        DefaultTypeMappingImpl.java DeserializerImpl.java
                        SerializationContextImpl.java TypeMappingImpl.java
               java/test/soap12 PackageTests.java TestDeser.java
                        TestSer.java
               java/src/org/apache/axis/handlers MD5AttachHandler.java
               java/src/org/apache/axis/message MessageElement.java
                        RPCHandler.java SOAPFaultDetailsBuilder.java
                        SOAPHeaderElement.java
               java/src/org/apache/axis/i18n resource.properties
               java/src/org/apache/axis/providers/java RPCProvider.java
               java/src/org/apache/axis/soap SOAP11Constants.java
                        SOAP12Constants.java SOAPConstants.java
               java/src/org/apache/axis/handlers/soap SOAPService.java
  Added:       java/test/soap12 Echo.java TestFault.java TestHrefs.java
                        TestRPC.java
  Log:
  Fix and test cases for Bug 15363 - soap 1.2 patches for rpc array ser/deser, rpc 
result, href attr, notunderstood header, etc.
  from [EMAIL PROTECTED] (Andras Avar)
  
  Revision  Changes    Path
  1.33      +79 -20    
xml-axis/java/src/org/apache/axis/encoding/ser/ArrayDeserializer.java
  
  Index: ArrayDeserializer.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/ArrayDeserializer.java,v
  retrieving revision 1.32
  retrieving revision 1.33
  diff -u -r1.32 -r1.33
  --- ArrayDeserializer.java    11 Dec 2002 22:38:15 -0000      1.32
  +++ ArrayDeserializer.java    20 Dec 2002 17:28:20 -0000      1.33
  @@ -67,6 +67,9 @@
   import org.apache.axis.utils.Messages;
   import org.apache.axis.wsdl.symbolTable.SchemaUtils;
   import org.apache.commons.logging.Log;
  +import org.apache.axis.soap.SOAPConstants;
  +import org.apache.axis.MessageContext;
  +
   import org.xml.sax.Attributes;
   import org.xml.sax.SAXException;
   
  @@ -99,6 +102,7 @@
       Class arrayClass = null;
       ArrayList mDimLength = null;  // If set, array of multi-dim lengths 
       ArrayList mDimFactor = null;  // If set, array of factors for multi-dim []
  +    SOAPConstants soapConstants = SOAPConstants.SOAP11_CONSTANTS;
   
       /**
        * This method is invoked after startElement when the element requires
  @@ -146,6 +150,11 @@
               log.debug("Enter: ArrayDeserializer::startElement()");
           }
   
  +        MessageContext msgContext = context.getMessageContext();
  +        if (msgContext != null) {
  +            soapConstants = msgContext.getSOAPConstants();
  +        }
  +
           // Get the qname for the array type=, set it to null if
           // the generic type is used.
           QName typeQName = context.getTypeFromAttributes(namespace,
  @@ -164,7 +173,7 @@
           QName arrayTypeValue = context.getQNameFromString(
                         Constants.getValue(attributes,
                                            Constants.URIS_SOAP_ENC,
  -                                         Constants.ATTR_ARRAY_TYPE));
  +                                         soapConstants.getAttrItemType()));
   
           // The first part of the arrayType expression is 
           // the default item type qname.
  @@ -177,6 +186,8 @@
                   arrayTypeValue.getNamespaceURI();
               String arrayTypeValueLocalPart = 
                   arrayTypeValue.getLocalPart();
  +
  +            if (soapConstants != SOAPConstants.SOAP12_CONSTANTS) {
               int leftBracketIndex = 
                   arrayTypeValueLocalPart.lastIndexOf('[');
               int rightBracketIndex = 
  @@ -209,6 +220,33 @@
                   defaultItemType = new QName(arrayTypeValueNamespaceURI,
                                               arrayTypeValueLocalPart);
               }
  +
  +            } else {
  +                String arraySizeValue = 
attributes.getValue(soapConstants.getEncodingURI(), Constants.ATTR_ARRAY_SIZE);
  +                int leftStarIndex = arraySizeValue.lastIndexOf('*');
  +
  +                // Skip to num if any
  +                if (leftStarIndex != -1) {
  +                    // "*" => ""
  +                    if (leftStarIndex == 0 && arraySizeValue.length() == 1) {
  +                    // "* *" => ""
  +                    } else if (leftStarIndex == (arraySizeValue.length() - 1)) {
  +                        innerQName = arrayTypeValue;
  +                        innerDimString = arraySizeValue.substring(0, leftStarIndex 
- 1);
  +                    // "* N" => "N"
  +                    } else {
  +                        dimString = arraySizeValue.substring(leftStarIndex + 2);
  +                        innerQName = arrayTypeValue;
  +                        innerDimString = arraySizeValue.substring(0, leftStarIndex 
+ 1);
  +                    }
  +                }
  +
  +                if (innerDimString == null) {
  +                    defaultItemType = Constants.SOAP_ARRAY12;
  +                } else {
  +                    defaultItemType = arrayTypeValue;
  +                }
  +            }
           }
   
           // If no type QName and no defaultItemType qname, use xsd:anyType
  @@ -226,27 +264,38 @@
               // Get an array of the default item type.
               Class arrayItemClass = null;
               QName compQName = defaultItemType;
  -            String dims = "[]";
  +
               // Nested array, use the innermost qname
  +            String dims = "[]";
               if (innerQName != null) {
                   compQName = innerQName;
  +
  +                if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) {
  +                    int offset = 0;
  +                    while ((offset = innerDimString.indexOf('*', offset)) != -1) {
  +                        dims += "[]";
  +                        offset ++;
  +                    }
  +                } else {
                   dims += innerDimString;                
               }
  -            arrayItemClass = context.getTypeMapping().
  -                getClassForQName(compQName);
  -            if (arrayItemClass != null) {
  -                try {
  -                    arrayClass = ClassUtils.forName(
  -                      JavaUtils.getLoadableClassName(
  -                        JavaUtils.getTextClassName(arrayItemClass.getName()) +
  -                        dims));
  -                } catch (Exception e) {
  -                    throw new SAXException(
  -                       Messages.getMessage("noComponent00",  
  -                                            "" + defaultItemType));
  -                }
  +        }
  +
  +        arrayItemClass = context.getTypeMapping().
  +            getClassForQName(compQName);
  +        if (arrayItemClass != null) {
  +            try {
  +                arrayClass = ClassUtils.forName(
  +                  JavaUtils.getLoadableClassName(
  +                    JavaUtils.getTextClassName(arrayItemClass.getName()) +
  +                    dims));
  +            } catch (Exception e) {
  +                throw new SAXException(
  +                   Messages.getMessage("noComponent00",  
  +                                        "" + defaultItemType));
               }
           }
  +        }
   
           if (arrayClass == null) {
               throw new SAXException(
  @@ -260,13 +309,15 @@
           else {
               try
               {
  -                StringTokenizer tokenizer = new StringTokenizer(dimString,
  -                                                                "[],");
  +                StringTokenizer tokenizer;
  +                if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) {
  +                    tokenizer = new StringTokenizer(dimString);
  +                } else {
  +                    tokenizer = new StringTokenizer(dimString, "[],");
  +                }
   
                   length = Integer.parseInt(tokenizer.nextToken());
  -
  -                if (tokenizer.hasMoreTokens())
  -                    {
  +                if (tokenizer.hasMoreTokens()) {
                           // If the array is passed as a multi-dimensional array
                           // (i.e. int[2][3]) then store all of the 
                           // mult-dim lengths.
  @@ -304,6 +355,10 @@
                                            Constants.URIS_SOAP_ENC,
                                            Constants.ATTR_OFFSET);
           if (offset != null) {
  +            if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) {
  +                throw new SAXException(Messages.getMessage("noSparseArray"));
  +            }
  +
               int leftBracketIndex = offset.lastIndexOf('[');
               int rightBracketIndex = offset.lastIndexOf(']');
   
  @@ -357,6 +412,10 @@
                                      Constants.URIS_SOAP_ENC,
                                      Constants.ATTR_POSITION);
               if (pos != null) {
  +                if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) {
  +                    throw new SAXException(Messages.getMessage("noSparseArray"));
  +                }
  +
                   int leftBracketIndex = pos.lastIndexOf('[');
                   int rightBracketIndex = pos.lastIndexOf(']');
   
  
  
  
  1.45      +42 -8     
xml-axis/java/src/org/apache/axis/encoding/ser/ArraySerializer.java
  
  Index: ArraySerializer.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/ArraySerializer.java,v
  retrieving revision 1.44
  retrieving revision 1.45
  diff -u -r1.44 -r1.45
  --- ArraySerializer.java      11 Dec 2002 22:38:15 -0000      1.44
  +++ ArraySerializer.java      20 Dec 2002 17:28:20 -0000      1.45
  @@ -144,7 +144,10 @@
           String dims = "";
           while (componentType.isArray()) {
               componentType = componentType.getComponentType();
  -            dims += "[]";
  +            if (soap == SOAPConstants.SOAP12_CONSTANTS)
  +                dims += "* ";
  +            else
  +                dims += "[]";
           }
   
           // Get the QName of the componentType.
  @@ -170,8 +173,11 @@
           String compType = prefix + ":" + componentQName.getLocalPart();
           int len = (list == null) ? Array.getLength(value) : list.size();
   
  -        String arrayType = compType + dims + "[" + len + "]";
  -
  +        String arrayType;
  +        if (soap == SOAPConstants.SOAP12_CONSTANTS)
  +            arrayType = dims + len;
  +        else
  +            arrayType = dims + "[" + len + "]";
   
           // Discover whether array can be serialized directly as a two-dimensional
           // array (i.e. arrayType=int[2,3]) versus an array of arrays.
  @@ -231,7 +237,10 @@
                   // Update the arrayType to use mult-dim array encoding
                   if (okay) {
                       dims = dims.substring(0, dims.length()-2);
  -                    arrayType = compType + dims + "[" + len + "," + dim2Len + "]";
  +                    if (soap == SOAPConstants.SOAP12_CONSTANTS)
  +                        arrayType = dims + len + " " + dim2Len;
  +                    else
  +                        arrayType = dims + "[" + len + "," + dim2Len + "]";
                   } else {
                       dim2Len = -1;
                   }
  @@ -255,15 +264,33 @@
                   attrs = new AttributesImpl(attributes);
               }
   
  -            if (attrs.getIndex(soap.getEncodingURI(),
  -                               Constants.ATTR_ARRAY_TYPE) == -1) {
  +
  +            if (attrs.getIndex(soap.getEncodingURI(), soap.getAttrItemType()) == 
-1) {
                   String encprefix =
                          context.getPrefixForURI(soap.getEncodingURI());
  +
  +                if (soap != SOAPConstants.SOAP12_CONSTANTS) {
  +                    compType = compType + arrayType;
  +
                   attrs.addAttribute(soap.getEncodingURI(),
  -                                   Constants.ATTR_ARRAY_TYPE,
  +                                       soap.getAttrItemType(),
                                      encprefix + ":arrayType",
                                      "CDATA",
  +                                       compType);
  +
  +                } else {
  +                    attrs.addAttribute(soap.getEncodingURI(),
  +                                       soap.getAttrItemType(),
  +                                       encprefix + ":itemType",
  +                                       "CDATA",
  +                                       compType);
  +
  +                    attrs.addAttribute(soap.getEncodingURI(),
  +                                       "arraySize",
  +                                       encprefix + ":arraySize",
  +                                       "CDATA",
                                      arrayType);
  +                }
               }
   
               // Force type to be SOAP_ARRAY for all array serialization.
  @@ -286,12 +313,19 @@
                   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(Constants.SOAP_ARRAY));
  +                                   context.qName2String(soapArray));
               }
               attributes = attrs;
           }
  
  
  
  1.59      +3 -1      
xml-axis/java/src/org/apache/axis/encoding/ser/BeanDeserializer.java
  
  Index: BeanDeserializer.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/BeanDeserializer.java,v
  retrieving revision 1.58
  retrieving revision 1.59
  diff -u -r1.58 -r1.59
  --- BeanDeserializer.java     11 Dec 2002 22:38:15 -0000      1.58
  +++ BeanDeserializer.java     20 Dec 2002 17:28:20 -0000      1.59
  @@ -66,6 +66,7 @@
   import org.apache.axis.message.SOAPHandler;
   import org.apache.axis.utils.BeanPropertyDescriptor;
   import org.apache.axis.utils.Messages;
  +import org.apache.axis.soap.SOAPConstants;
   import org.apache.commons.logging.Log;
   import org.xml.sax.Attributes;
   import org.xml.sax.SAXException;
  @@ -187,6 +188,7 @@
           BeanPropertyDescriptor propDesc = null;
           FieldDesc fieldDesc = null;
   
  +        SOAPConstants soapConstants = 
context.getMessageContext().getSOAPConstants();
           String encodingStyle = context.getMessageContext().getEncodingStyle();
           boolean isEncoded = Constants.isSOAP_ENC(encodingStyle);
   
  @@ -265,7 +267,7 @@
                                                               localName,
                                                               attributes);
   
  -        String href = attributes.getValue("href");
  +        String href = attributes.getValue(soapConstants.getAttrHref());
   
           // If no xsi:type or href, check the meta-data for the field
           if (childXMLType == null && fieldDesc != null && href == null) {
  
  
  
  1.18      +4 -2      
xml-axis/java/src/org/apache/axis/encoding/ser/JAFDataHandlerDeserializer.java
  
  Index: JAFDataHandlerDeserializer.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/JAFDataHandlerDeserializer.java,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- JAFDataHandlerDeserializer.java   11 Dec 2002 22:38:15 -0000      1.17
  +++ JAFDataHandlerDeserializer.java   20 Dec 2002 17:28:20 -0000      1.18
  @@ -61,6 +61,7 @@
   import org.apache.axis.encoding.DeserializerImpl;
   import org.apache.axis.message.SOAPHandler;
   import org.apache.axis.utils.Messages;
  +import org.apache.axis.soap.SOAPConstants;
   import org.apache.commons.logging.Log;
   import org.xml.sax.Attributes;
   import org.xml.sax.SAXException;
  @@ -89,6 +90,8 @@
           }
   //        super.startElement(namespace, localName, qName, attributes, context);
   
  +        SOAPConstants soapConstants = 
context.getMessageContext().getSOAPConstants();
  +
           QName type = context.getTypeFromAttributes(namespace,
                                                      localName,
                                                      attributes);
  @@ -96,8 +99,7 @@
               log.debug(Messages.getMessage("gotType00", "Deser", "" + type));
           }
           
  -        String href = attributes.getValue("href");
  -        log.debug("href=" + href);
  +        String href = attributes.getValue(soapConstants.getAttrHref());
           if (href != null) {
               Object ref = context.getObjectByRef(href);
               try{
  
  
  
  1.23      +3 -1      
xml-axis/java/src/org/apache/axis/encoding/ser/JAFDataHandlerSerializer.java
  
  Index: JAFDataHandlerSerializer.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/JAFDataHandlerSerializer.java,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- JAFDataHandlerSerializer.java     4 Nov 2002 17:01:27 -0000       1.22
  +++ JAFDataHandlerSerializer.java     20 Dec 2002 17:28:20 -0000      1.23
  @@ -63,6 +63,7 @@
   import org.apache.axis.encoding.Serializer;
   import org.apache.axis.utils.Messages;
   import org.apache.axis.wsdl.fromJava.Types;
  +import org.apache.axis.soap.SOAPConstants;
   import org.apache.commons.logging.Log;
   import org.w3c.dom.Element;
   import org.xml.sax.Attributes;
  @@ -99,6 +100,7 @@
               // we used to do, throw something meaningful.
               throw new IOException(Messages.getMessage("noAttachments"));
           }
  +        SOAPConstants soapConstants = 
context.getMessageContext().getSOAPConstants();
   
           Part attachmentPart= attachments.createAttachmentPart(dh);
   
  @@ -114,7 +116,7 @@
               attrs.removeAttribute(typeIndex);
           }
   
  -        attrs.addAttribute("", Constants.ATTR_HREF, "href",
  +        attrs.addAttribute("", soapConstants.getAttrHref(), 
soapConstants.getAttrHref(),
                                  "CDATA", attachmentPart.getContentIdRef() );
   
           context.startElement(name, attrs);
  
  
  
  1.101     +5 -1      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.100
  retrieving revision 1.101
  diff -u -r1.100 -r1.101
  --- Constants.java    11 Dec 2002 22:38:06 -0000      1.100
  +++ Constants.java    20 Dec 2002 17:28:21 -0000      1.101
  @@ -406,7 +406,7 @@
       public static final String ELEM_BODY     = "Body" ;
       public static final String ELEM_FAULT    = "Fault" ;
   
  -    public static final String ELEM_MISUNDERSTOOD = "Misunderstood";
  +    public static final String ELEM_NOTUNDERSTOOD = "NotUnderstood";
   
       public static final String ELEM_FAULT_CODE   = "faultcode" ;
       public static final String ELEM_FAULT_STRING = "faultstring" ;
  @@ -428,8 +428,11 @@
       public static final String ATTR_ROOT            = "root" ;
       public static final String ATTR_ID              = "id" ;
       public static final String ATTR_HREF            = "href" ;
  +    public static final String ATTR_REF             = "ref" ;
       public static final String ATTR_QNAME           = "qname";
       public static final String ATTR_ARRAY_TYPE      = "arrayType";
  +    public static final String ATTR_ITEM_TYPE       = "itemType";
  +    public static final String ATTR_ARRAY_SIZE      = "arraySize";
       public static final String ATTR_OFFSET          = "offset";
       public static final String ATTR_POSITION        = "position";
       public static final String ATTR_TYPE            = "type";
  @@ -558,6 +561,7 @@
       public static final QName SOAP_INTEGER = new QName(URI_DEFAULT_SOAP_ENC, 
"integer");
       public static final QName SOAP_DECIMAL = new QName(URI_DEFAULT_SOAP_ENC, 
"decimal");
       public static final QName SOAP_ARRAY = new QName(URI_DEFAULT_SOAP_ENC, "Array");
  +    public static final QName SOAP_ARRAY12 = new QName(URI_SOAP12_ENC, "Array");
   
       public static final QName SOAP_MAP = new QName(NS_URI_XMLSOAP, "Map");
       public static final QName SOAP_ELEMENT = new QName(NS_URI_XMLSOAP, "Element");
  
  
  
  1.66      +12 -0     
xml-axis/java/src/org/apache/axis/encoding/DefaultTypeMappingImpl.java
  
  Index: DefaultTypeMappingImpl.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/encoding/DefaultTypeMappingImpl.java,v
  retrieving revision 1.65
  retrieving revision 1.66
  diff -u -r1.65 -r1.66
  --- DefaultTypeMappingImpl.java       11 Dec 2002 22:38:13 -0000      1.65
  +++ DefaultTypeMappingImpl.java       20 Dec 2002 17:28:21 -0000      1.66
  @@ -594,6 +594,18 @@
                      new ArrayDeserializerFactory()
           );
   
  +        // TODO: move it to the DefaultSOAPEncodingTypeMappingImpl class
  +        myRegister(Constants.SOAP_ARRAY12,     java.util.Collection.class,
  +                   new ArraySerializerFactory(),
  +                   new ArrayDeserializerFactory()
  +        );
  +
  +        myRegister(Constants.SOAP_ARRAY12,     Object[].class,
  +                   new ArraySerializerFactory(),
  +                   new ArrayDeserializerFactory()
  +        );
  +
  +
           //
           // Now register the schema specific types
           //
  
  
  
  1.33      +4 -1      xml-axis/java/src/org/apache/axis/encoding/DeserializerImpl.java
  
  Index: DeserializerImpl.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/encoding/DeserializerImpl.java,v
  retrieving revision 1.32
  retrieving revision 1.33
  diff -u -r1.32 -r1.33
  --- DeserializerImpl.java     11 Dec 2002 22:38:13 -0000      1.32
  +++ DeserializerImpl.java     20 Dec 2002 17:28:21 -0000      1.33
  @@ -64,6 +64,7 @@
   import org.apache.axis.message.SAXOutputter;
   import org.apache.axis.message.SOAPHandler;
   import org.apache.axis.utils.Messages;
  +import org.apache.axis.soap.SOAPConstants;
   import org.apache.commons.logging.Log;
   import org.xml.sax.Attributes;
   import org.xml.sax.SAXException;
  @@ -360,6 +361,8 @@
               return;
           }
   
  +        SOAPConstants soapConstants = 
context.getMessageContext().getSOAPConstants();
  +
           // If this element has an id, then associate the value with the id.
           // (Prior to this association, the MessageElement of the element is
           // associated with the id. Failure to replace the MessageElement at this
  @@ -376,7 +379,7 @@
               context.registerFixup("#" + id, this);
           }
   
  -        String href = attributes.getValue("href");
  +        String href = attributes.getValue(soapConstants.getAttrHref());
           if (href != null) {
               isHref = true;
   
  
  
  
  1.88      +1 -1      
xml-axis/java/src/org/apache/axis/encoding/SerializationContextImpl.java
  
  Index: SerializationContextImpl.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/encoding/SerializationContextImpl.java,v
  retrieving revision 1.87
  retrieving revision 1.88
  diff -u -r1.87 -r1.88
  --- SerializationContextImpl.java     17 Dec 2002 21:07:36 -0000      1.87
  +++ SerializationContextImpl.java     20 Dec 2002 17:28:21 -0000      1.88
  @@ -745,7 +745,7 @@
               AttributesImpl attrs = new AttributesImpl();
               if (attributes != null && 0 < attributes.getLength())
                   attrs.setAttributes(attributes);
  -            attrs.addAttribute("", Constants.ATTR_HREF, "href",
  +            attrs.addAttribute("", soapConstants.getAttrHref(), 
soapConstants.getAttrHref(),
                                  "CDATA", '#' + id);
   
               startElement(elemQName, attrs);
  
  
  
  1.38      +11 -1     xml-axis/java/src/org/apache/axis/encoding/TypeMappingImpl.java
  
  Index: TypeMappingImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/TypeMappingImpl.java,v
  retrieving revision 1.37
  retrieving revision 1.38
  diff -u -r1.37 -r1.38
  --- TypeMappingImpl.java      11 Dec 2002 22:38:14 -0000      1.37
  +++ TypeMappingImpl.java      20 Dec 2002 17:28:21 -0000      1.38
  @@ -573,7 +573,17 @@
           if (xmlType == null && (javaType.isArray() ||
                javaType == List.class ||
                List.class.isAssignableFrom(javaType))) {
  -            xmlType = Constants.SOAP_ARRAY;
  +
  +            // get the registered array if any
  +            pair = (Pair) class2Pair.get(Object[].class);
  +            // TODO: it always returns the last registered one,
  +            //  so that's why the soap 1.2 typemappings have to 
  +            //  move to an other registry to differentiate them
  +            if (pair != null) {
  +                xmlType = pair.xmlType;
  +            } else {
  +                xmlType = Constants.SOAP_ARRAY;
  +            }
           }
   
           //log.debug("getTypeQName xmlType =" + xmlType);
  
  
  
  1.2       +4 -1      xml-axis/java/test/soap12/PackageTests.java
  
  Index: PackageTests.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/test/soap12/PackageTests.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- PackageTests.java 20 Nov 2002 18:05:44 -0000      1.1
  +++ PackageTests.java 20 Dec 2002 17:28:21 -0000      1.2
  @@ -71,7 +71,10 @@
   
           suite.addTestSuite(TestDeser.class);
           suite.addTestSuite(TestHeaderAttrs.class);
  -        //suite.addTestSuite(TestSer.class);
  +        suite.addTestSuite(TestSer.class);
  +        suite.addTestSuite(TestFault.class);
  +        suite.addTestSuite(TestHrefs.class);
  +        suite.addTestSuite(TestRPC.class);
   
           return suite;
       }
  
  
  
  1.3       +209 -31   xml-axis/java/test/soap12/TestDeser.java
  
  Index: TestDeser.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/test/soap12/TestDeser.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- TestDeser.java    11 Dec 2002 22:40:18 -0000      1.2
  +++ TestDeser.java    20 Dec 2002 17:28:21 -0000      1.3
  @@ -4,63 +4,121 @@
   import org.apache.axis.Constants;
   import org.apache.axis.Message;
   import org.apache.axis.MessageContext;
  +import org.apache.axis.encoding.TypeMapping;
  +import org.apache.axis.encoding.TypeMappingRegistry;
   import org.apache.axis.message.RPCElement;
   import org.apache.axis.message.RPCParam;
   import org.apache.axis.message.SOAPEnvelope;
   import org.apache.axis.server.AxisServer;
   import org.apache.axis.soap.SOAPConstants;
  +import org.apache.axis.utils.JavaUtils;
   import org.apache.axis.utils.Messages;
   
  +import javax.xml.namespace.QName;
  +import java.lang.reflect.Array;
  +import java.util.ArrayList;
  +import java.util.Iterator;
  +import java.util.List;
  +import java.util.Map;
  +import java.util.Set;
   import java.util.Vector;
  +
   /**
    * Test deserialization of SOAP responses
    */
   public class TestDeser extends TestCase {
  +    private AxisServer server = null;
   
  -    private AxisServer server = new AxisServer();
   
       public TestDeser(String name) {
           super(name);
  +
  +        server = new AxisServer();
  +
  +        TypeMappingRegistry tmr = server.getTypeMappingRegistry();
  +        TypeMapping tm = (TypeMapping) tmr.createTypeMapping();
  +        tm.setSupportedEncodings(new String[] {Constants.URI_SOAP12_ENC});
  +        tmr.register(Constants.URI_SOAP12_ENC, tm);
  +        tm.register(java.lang.String[].class,
  +                    new QName("http://soapinterop.org/xsd";, "ArrayOfString"),
  +                    new org.apache.axis.encoding.ser.ArraySerializerFactory(),
  +                    new org.apache.axis.encoding.ser.ArrayDeserializerFactory());
       }
  -    
  -    String text1 = 
  +
  +    private final String SOAP_HEAD =
           "<?xml version=\"1.0\"?>\n" +
           "<soap:Envelope " +
             "xmlns:soap=\"http://www.w3.org/2002/06/soap-envelope\"; " +
  -          "xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"; " +
  -          "xmlns:me=\"http://soapinterop.org/xsd\"; " +
  -          "xmlns:this=\"http://encoding.test\"; " + 
  +          "xmlns:soapenc=\"http://www.w3.org/2002/06/soap-encoding\"; " +
  +          "xmlns:this=\"http://encoding.test\"; " +
             "xmlns:xsi=\"" + Constants.URI_DEFAULT_SCHEMA_XSI + "\" " +
  -          "xmlns:xsd=\"" + Constants.URI_DEFAULT_SCHEMA_XSD + "\">\n" +
  -          "<soap:Body>\n" +
  -            "<methodResult xmlns=\"http://tempuri.org/\";>\n" +
  -            "<item xsi:type=\"xsd:string\">abc</item>\n" +
  -            "</methodResult>\n" +
  +          "xmlns:xsd=\"" + Constants.URI_DEFAULT_SCHEMA_XSD + "\">\n";
  +
  +    private final String ITEM =
  +           "<item xsi:type=\"xsd:string\">abc</item>\n";
  +
  +    private final String BODY_HEAD =
  +          "<soap:Body>\n";
  +
  +    private final String METHOD_HEAD =
  +            "<methodResult xmlns=\"http://tempuri.org/\";>\n";
  +
  +    private final String METHOD_TAIL =
  +            "</methodResult>\n";
  +
  +    private final String BODY_TAIL =
             "</soap:Body>\n";
  -    String text2 =
  +
  +    private final String SOAP_TAIL =
           "</soap:Envelope>\n";
   
  -    public void testDeser1() throws Exception {
  -        assertEquals(deserialize(""), "abc");
  -    }
  -    
  -    public void testDeser2() throws Exception {
  -        boolean expectedExceptionThrown = false;
  -        try {
  -            deserialize("<hello/>");
  -        } catch (org.apache.axis.AxisFault af) {
  -            String expected = Messages.getMessage("noElemAfterBody12");
  -            if(af.getFaultString().indexOf(expected)!=-1)
  -                expectedExceptionThrown = true;
  -        }
  -        assertTrue(expectedExceptionThrown);
  +
  +    private final String HEAD = SOAP_HEAD + BODY_HEAD + METHOD_HEAD;
  +    private final String TAIL = METHOD_TAIL + BODY_TAIL + SOAP_TAIL;
  +
  +
  +    private static boolean equals(Object obj1, Object obj2) {
  +       if ( (obj1 == null) || (obj2 == null) ) return (obj1 == obj2);
  +       if (obj1.equals(obj2)) return true;
  +       if (obj2.getClass().isArray() && obj1.getClass().isArray()) {
  +           if (Array.getLength(obj1) != Array.getLength(obj2)) return false;
  +           for (int i=0; i<Array.getLength(obj1); i++)
  +               if (!equals(Array.get(obj1,i),Array.get(obj2,i))) return false;
  +           return true;
  +       }
  +       if ((obj1 instanceof List) && (obj2 instanceof List)) {
  +           List list1 = (List)obj1;
  +           List list2 = (List)obj2;
  +           if (list1.size() != list2.size()) return false;
  +           for (int i=0; i < list1.size(); i++) {
  +               if (!equals(list1.get(i), list2.get(i))) return false;
  +           }
  +           return true;
  +       }
  +       if ((obj1 instanceof Map) && (obj2 instanceof Map)) {
  +           Map map1 = (Map)obj1;
  +           Map map2 = (Map)obj2;
  +           Set keys1 = map1.keySet();
  +           Set keys2 = map2.keySet();
  +           if (!(keys1.equals(keys2))) return false;
  +           Iterator i = keys1.iterator();
  +           while (i.hasNext()) {
  +               Object key = i.next();
  +               if (!map1.get(key).equals(map2.get(key)))
  +                   return false;
  +           }
  +           return true;
  +       }
  +
  +       return false;
       }
  -            
  -    public String deserialize (String extra) throws Exception {
  -        Message message = new Message(text1 + extra + text2);
  +
  +
  +    public void deserialize(String soap, Object expected, boolean tryConvert) 
throws Exception {
  +        Message message = new Message(soap);
           MessageContext context = new MessageContext(server);
           context.setSOAPConstants(SOAPConstants.SOAP12_CONSTANTS);
  -        
  +
           message.setMessageContext(context);
   
           SOAPEnvelope envelope = message.getSOAPEnvelope();
  @@ -76,6 +134,126 @@
           RPCParam param = (RPCParam) arglist.get(0);
           assertNotNull("SOAP param should not be null", param);
   
  -        return (String)param.getValue();
  +        Object result = param.getValue();
  +        if (!equals(result, expected)) {
  +           // Try to convert to the expected class
  +           if (tryConvert) {
  +               Object result2 = JavaUtils.convert(result, expected.getClass());
  +               if (!equals(result2, expected)) {
  +                   assertEquals("The result is not what is expected.", expected, 
result);
  +               }
  +           } else {
  +               assertEquals("The result is not what is expected.", expected, 
result);
  +           }
  +        }
  +    }
  +
  +    public void testDeser1() throws Exception {
  +        deserialize(SOAP_HEAD + BODY_HEAD + METHOD_HEAD + ITEM + METHOD_TAIL + 
BODY_TAIL + SOAP_TAIL, "abc", false);
  +    }
  +
  +    public void testDeser2() throws Exception {
  +        boolean expectedExceptionThrown = false;
  +        try {
  +            deserialize(SOAP_HEAD + BODY_HEAD + METHOD_HEAD + ITEM + METHOD_TAIL + 
BODY_TAIL + "<hello/>" + SOAP_TAIL, null, false);
  +        } catch (org.apache.axis.AxisFault af) {
  +            String expected = Messages.getMessage("noElemAfterBody12");
  +            if(af.getFaultString().indexOf(expected)!=-1)
  +                expectedExceptionThrown = true;
  +        }
  +        assertTrue(expectedExceptionThrown);
  +    }
  +
  +    public void testAfterBody() throws Exception {
  +        boolean expectedExceptionThrown = false;
  +        try {
  +            deserialize(SOAP_HEAD + BODY_HEAD + METHOD_HEAD + ITEM + METHOD_TAIL + 
"<hello/>" + BODY_TAIL + SOAP_TAIL, null, false);
  +        } catch (org.apache.axis.AxisFault af) {
  +            // Should drop an ex about soap 1.2 doesn't permit any element after 
body
  +            String expected = Messages.getMessage("onlyOneBodyFor12");
  +            if(af.getFaultString().indexOf(expected)!=-1)
  +                expectedExceptionThrown = true;
  +        }
  +        assertTrue(expectedExceptionThrown);
  +    }
  +
  +    public void testArray() throws Exception {
  +        Vector v = new Vector();
  +        v.addElement("abc");
  +        v.addElement("def");
  +        deserialize(HEAD +
  +                    "<result xsi:type=\"soapenc:Array\" " +
  +                            "soapenc:itemType=\"xsd:string\" 
soapenc:arraySize=\"2\"> " +
  +                       "<item xsi:type=\"xsd:string\">abc</item>" +
  +                       "<item xsi:type=\"xsd:string\">def</item>" +
  +                    "</result>" +
  +                    TAIL,
  +                    v, true);
       }
  +
  +    public void testSparseArray1() throws Exception {
  +        ArrayList list = new ArrayList(4);
  +        list.add(null);
  +        list.add(null);
  +        list.add("abc");
  +        list.add("def");
  +        boolean expectedExceptionThrown = false;
  +        try {
  +            deserialize(HEAD +
  +                        "<result xsi:type=\"soapenc:Array\" " +
  +                                "soapenc:itemType=\"xsd:string\" 
soapenc:arraySize=\"4\" " +
  +                                " soapenc:offset=\"[2]\">" +
  +                           "<item xsi:type=\"xsd:string\">abc</item>" +
  +                           "<item xsi:type=\"xsd:string\">def</item>" +
  +                        "</result>" +
  +                        TAIL,
  +                        list, true);
  +        } catch (Exception af) {
  +            String expected = Messages.getMessage("noSparseArray");
  +            if(af.toString().indexOf(expected)!=-1)
  +                expectedExceptionThrown = true;
  +        }
  +        assertTrue(expectedExceptionThrown);
  +    }
  +
  +    public void testSparseArray2() throws Exception {
  +        ArrayList list = new ArrayList(4);
  +        list.add("abc");
  +        list.add(null);
  +        list.add("def");
  +        list.add(null);
  +
  +        boolean expectedExceptionThrown = false;
  +        try {
  +            deserialize(HEAD +
  +                        "<result xsi:type=\"soapenc:Array\" " +
  +                        "soapenc:itemType=\"xsd:string\" soapenc:arraySize=\"4\">" +
  +                        "<item soapenc:position=\"[0]\" 
xsi:type=\"xsd:string\">abc</item>" +
  +                        "<item soapenc:position=\"[2]\" 
xsi:type=\"xsd:string\">def</item>" +
  +                        "</result>" +
  +                        TAIL,
  +                        list, true);
  +        } catch (Exception af) {
  +            String expected = Messages.getMessage("noSparseArray");
  +            if(af.toString().indexOf(expected)!=-1)
  +                expectedExceptionThrown = true;
  +        }
  +        assertTrue(expectedExceptionThrown);
  +    }
  +
  +    public void testNoSizeDefinedArray() throws Exception {
  +        ArrayList a = new ArrayList();
  +        a.add("abc");
  +        a.add("def");
  +
  +        deserialize(HEAD +
  +                    "<result xsi:type=\"soapenc:Array\" " +
  +                    "soapenc:itemType=\"xsd:string\" soapenc:arraySize=\"*\">" +
  +                        "<item xsi:type=\"xsd:string\">abc</item>" +
  +                        "<item xsi:type=\"xsd:string\">def</item>" +
  +                    "</result>" +
  +                    TAIL,
  +                    a, true);
  +    }
  +
   }
  
  
  
  1.3       +7 -8      xml-axis/java/test/soap12/TestSer.java
  
  Index: TestSer.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/test/soap12/TestSer.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- TestSer.java      11 Dec 2002 22:40:18 -0000      1.2
  +++ TestSer.java      20 Dec 2002 17:28:21 -0000      1.3
  @@ -15,6 +15,7 @@
   import org.apache.axis.message.SOAPEnvelope;
   import org.apache.axis.server.AxisServer;
   import org.apache.axis.soap.SOAPConstants;
  +import org.apache.axis.utils.XMLUtils;
   import org.apache.commons.logging.Log;
   import org.w3c.dom.Document;
   import org.xml.sax.InputSource;
  @@ -23,8 +24,6 @@
   import test.encoding.DataSerFactory;
   
   import javax.xml.namespace.QName;
  -import javax.xml.parsers.DocumentBuilder;
  -import javax.xml.parsers.DocumentBuilderFactory;
   import java.io.StringReader;
   import java.io.StringWriter;
   import java.io.Writer;
  @@ -70,8 +69,8 @@
           // Create a TypeMapping and register the specialized Type Mapping
           TypeMappingRegistry reg = context.getTypeMappingRegistry();
           TypeMapping tm = (TypeMapping) reg.createTypeMapping();
  -        tm.setSupportedEncodings(new String[] {Constants.URI_DEFAULT_SOAP_ENC});
  -        reg.register(Constants.URI_DEFAULT_SOAP_ENC, tm);
  +        tm.setSupportedEncodings(new String[] {Constants.URI_SOAP12_ENC});
  +        reg.register(Constants.URI_SOAP12_ENC, tm);
   
           QName dataQName = new QName("typeNS", "Data");
           tm.register(Data.class, dataQName, new DataSerFactory(), new 
DataDeserFactory());
  @@ -126,8 +125,9 @@
       {
           try {
               MessageContext msgContext = new MessageContext(new AxisServer());
  +            msgContext.setSOAPConstants(SOAPConstants.SOAP12_CONSTANTS);
               String req =
  -                "<xsd1:A xmlns:xsd1='urn:myNamespace'>"
  +                "<xsd1:A xmlns:xsd1=\"urn:myNamespace\">"
                       + "<xsd1:B>"
                       + "<xsd1:C>foo bar</xsd1:C>"
                       + "</xsd1:B>"
  @@ -137,12 +137,11 @@
               StringReader reqReader = new StringReader(req);
               InputSource reqSource = new InputSource(reqReader);
   
  -            DocumentBuilder xdb = 
DocumentBuilderFactory.newInstance().newDocumentBuilder();
  -            Document document = xdb.parse(reqSource );
  +            Document document = XMLUtils.newDocument(reqSource);
   
               String msgString = null;
   
  -            SOAPEnvelope msg = new SOAPEnvelope();
  +            SOAPEnvelope msg = new SOAPEnvelope(SOAPConstants.SOAP12_CONSTANTS);
               RPCParam arg1 = new RPCParam("urn:myNamespace", "testParam", 
document.getFirstChild());
               arg1.setXSITypeGeneration(Boolean.FALSE);
   
  
  
  
  1.1                  xml-axis/java/test/soap12/Echo.java
  
  Index: Echo.java
  ===================================================================
  package test.soap12;
  
  public class Echo {
      public String echo(String text) {
          return text;
      }
  }
  
  
  
  1.1                  xml-axis/java/test/soap12/TestFault.java
  
  Index: TestFault.java
  ===================================================================
  package test.soap12;
  
  import junit.framework.Test;
  import junit.framework.TestCase;
  import junit.framework.TestSuite;
  import org.apache.axis.AxisFault;
  import org.apache.axis.Message;
  import org.apache.axis.MessageContext;
  import org.apache.axis.encoding.SerializationContext;
  import org.apache.axis.encoding.SerializationContextImpl;
  import org.apache.axis.message.SOAPBodyElement;
  import org.apache.axis.message.SOAPEnvelope;
  import org.apache.axis.message.SOAPFault;
  import org.apache.axis.server.AxisServer;
  import org.apache.axis.soap.SOAPConstants;
  
  import javax.xml.namespace.QName;
  import java.io.StringWriter;
  import java.io.Writer;
  
  /**
   * A test of soap 1.2 fault serialization and deserialization.
   *
   * @author Andras Avar ([EMAIL PROTECTED])
   */
  public class TestFault extends TestCase {
      public static Test suite() {
          return new TestSuite(TestFault.class);
      }
  
      public TestFault(String name) {
          super(name);
      }
      public void setUp() throws Exception {
      }
  
      public static final QName FAULTCODE = new QName("http://c","faultcode_c";);
      public static final QName FAULTSUBCODE[] = { new QName("http://a","subcode_a";),
                                                   new QName("http://b","subcode_b";) };
      public static final String FAULTREASON = "reason";
      public static final String FAULTROLE = "role";
      public static final String FAULTNODE = "node";
  
      public void testFault() throws Exception
      {
          // Serialize
          MessageContext msgContext = new MessageContext(new AxisServer());
          msgContext.setSOAPConstants(SOAPConstants.SOAP12_CONSTANTS);
          SOAPEnvelope msg = new SOAPEnvelope(SOAPConstants.SOAP12_CONSTANTS);
  
          SOAPFault fault = new SOAPFault(new AxisFault(FAULTCODE, FAULTSUBCODE 
,FAULTREASON, FAULTROLE, FAULTNODE, null));
  
          msg.addBodyElement(fault);
          Writer stringWriter = new StringWriter();
          SerializationContext context = new SerializationContextImpl(stringWriter, 
msgContext);
          context.setDoMultiRefs(false);
          msg.output(context);
          String msgString = stringWriter.toString();
  
          // Deserialize and check
          AxisServer server = new AxisServer();
          Message message = new Message(msgString);
          message.setMessageContext(new MessageContext(server));
  
          SOAPEnvelope envelope = (SOAPEnvelope) message.getSOAPEnvelope();
          assertNotNull("envelope should not be null", envelope);
  
          SOAPBodyElement respBody = envelope.getFirstBody();
          assertTrue("respBody should be a SOAPFaultElement", respBody
                          instanceof SOAPFault);
          AxisFault aFault = ((SOAPFault) respBody).getFault();
  
          assertNotNull("Fault should not be null", aFault);
  
          assertTrue(aFault.getFaultCode().equals(FAULTCODE));
          assertTrue(aFault.getFaultReason().equals(FAULTREASON));
          assertTrue(aFault.getFaultRole().equals(FAULTROLE));
          assertTrue(aFault.getFaultNode().equals(FAULTNODE));
          QName q[] = aFault.getFaultSubCodes();
          for (int i = 0; i < q.length; i++)
              assertTrue(q[i].equals(FAULTSUBCODE[i]));
  
      }
  
  }
  
  
  
  1.1                  xml-axis/java/test/soap12/TestHrefs.java
  
  Index: TestHrefs.java
  ===================================================================
  package test.soap12;
  
  import junit.framework.TestCase;
  import org.apache.axis.Constants;
  import org.apache.axis.Message;
  import org.apache.axis.MessageContext;
  import org.apache.axis.message.RPCElement;
  import org.apache.axis.message.RPCParam;
  import org.apache.axis.message.SOAPEnvelope;
  import org.apache.axis.server.AxisServer;
  
  import java.util.Vector;
  
  /**
   * Test deserialization of SOAP 1.2 messages with references, by putting the
   * actual value in various places in the message.
   */
  public class TestHrefs extends TestCase {
  
      private String HEAD;
      private String HEADERT;
      private String BODYT;
  
      public TestHrefs(String name) {
          this(name, Constants.URI_DEFAULT_SCHEMA_XSI,
               Constants.URI_DEFAULT_SCHEMA_XSD);
      }
  
      public TestHrefs(String name, String NS_XSI, String NS_XSD) {
          super(name);
  
          HEAD =
                  "<?xml version=\"1.0\"?>\n" +
                  "<soap:Envelope " +
                  "xmlns:soap=\"http://www.w3.org/2002/06/soap-envelope\"; " +
                  "xmlns:soapenc=\"http://www.w3.org/2002/06/soap-encoding\"; " +
                  "xmlns:xsi=\"" + NS_XSI + "\" " +
                  "xmlns:xsd=\"" + NS_XSD + "\">\n" +
                  "<soap:Header>\n";
  
          HEADERT = "</soap:Header>\n" +
                    "<soap:Body>\n" +
                    "<methodResult xmlns=\"http://tempuri.org/\";>\n";
  
          BODYT = "</methodResult>\n" +
                   "</soap:Body>\n" +
                   "</soap:Envelope>\n";
      }
  
      private void deserialize(String data, Object expected, int pos)
              throws Exception
      {
          Message message = new Message(data);
          message.setMessageContext(new MessageContext(new AxisServer()));
  
          SOAPEnvelope envelope = (SOAPEnvelope)message.getSOAPEnvelope();
          assertNotNull("SOAP envelope should not be null", envelope);
  
          RPCElement body = (RPCElement)envelope.getFirstBody();
          assertNotNull("SOAP body should not be null", body);
  
          Vector arglist = body.getParams();
          assertNotNull("arglist", arglist);
          assertTrue("SOAP param.size()<=0 {Should be > 0}", arglist.size()>0);
  
          RPCParam param = (RPCParam) arglist.get(pos);
          assertNotNull("SOAP param should not be null", param);
  
          Object result = param.getValue();
          assertEquals("Expected result not received", expected, result);
      }
  
      public void testStringReference1() throws Exception {
          String result = HEAD + HEADERT +
                          "<result root=\"0\" id=\"1\" 
xsi:type=\"xsd:string\">abc</result>" +
                          "<reference ref=\"#1\"/>\n" +
                          BODYT;
          deserialize(result, "abc", 1);
      }
  
      public void testIntReference1() throws Exception {
          String result = HEAD + HEADERT +
                          "<result root=\"0\" id=\"1\" 
xsi:type=\"xsd:int\">567</result>" +
                          "<reference ref=\"#1\"/>\n" +
                          BODYT;
          deserialize(result, new Integer(567), 1);
      }
  
      public void testStringReferenceInHeader() throws Exception {
          String result = HEAD +
                          "<result root=\"0\" id=\"1\" 
xsi:type=\"xsd:string\">abc</result>" +
                          HEADERT +
                          "<reference ref=\"#1\"/>\n" +
                          BODYT;
          deserialize(result, "abc", 0);
      }
  
  }
  
  
  1.1                  xml-axis/java/test/soap12/TestRPC.java
  
  Index: TestRPC.java
  ===================================================================
  package test.soap12;
  
  import junit.framework.TestCase;
  import org.apache.axis.AxisFault;
  import org.apache.axis.Message;
  import org.apache.axis.MessageContext;
  import org.apache.axis.configuration.SimpleProvider;
  import org.apache.axis.description.ServiceDesc;
  import org.apache.axis.handlers.soap.SOAPService;
  import org.apache.axis.message.RPCElement;
  import org.apache.axis.message.RPCParam;
  import org.apache.axis.message.SOAPEnvelope;
  import org.apache.axis.providers.java.RPCProvider;
  import org.apache.axis.server.AxisServer;
  import org.apache.axis.soap.SOAPConstants;
  import org.apache.axis.transport.local.LocalTransport;
  import org.w3c.dom.Element;
  import org.w3c.dom.NodeList;
  import org.xml.sax.SAXException;
  
  import java.util.Vector;
  
  /**
   * A test for RPC response
   *
   * @author Andras Avar ([EMAIL PROTECTED])
   */
  public class TestRPC extends TestCase {
  
      private SimpleProvider provider = new SimpleProvider();
      private AxisServer server = new AxisServer(provider);
  
      public TestRPC(String name) {
          super(name);
          server.init();
      }
  
      private RPCElement rpc(String method, Object[] params)
          throws AxisFault, SAXException
      {
          String SERVICE_NAME = "echoservice";
          LocalTransport transport = new LocalTransport(server);
  
          SOAPService service = new SOAPService(new RPCProvider());
          service.setOption("className", "test.soap12.Echo");
          service.setOption("allowedMethods", "*");
  
          ServiceDesc desc = service.getInitializedServiceDesc(null);
          desc.setDefaultNamespace(method);
  
          provider.deployService(SERVICE_NAME, service);
  
          MessageContext msgContext = new MessageContext(server);
          msgContext.setSOAPConstants(SOAPConstants.SOAP12_CONSTANTS);
  
          String methodNS = null;
          msgContext.setTargetService(SERVICE_NAME);
  
          // Construct the soap request
          SOAPEnvelope envelope = new SOAPEnvelope();
          msgContext.setRequestMessage(new Message(envelope));
          RPCElement body = new RPCElement(methodNS, method, params);
  
          envelope.addBodyElement(body);
  
          server.invoke(msgContext);
  
          Message message = msgContext.getResponseMessage();
          envelope = (SOAPEnvelope)message.getSOAPEnvelope();
          assertNotNull("SOAP envelope was null", envelope);
          body = (RPCElement)envelope.getFirstBody();
  
          return body;
      }
  
      public void testRPCReturn() throws Exception {
  
          RPCElement body = rpc("echo", new Object[] {"abc"});
          assertNotNull("SOAP body was null", body);
  
          // Check RPC result
          Vector arglist = body.getParams();
          assertNotNull("SOAP argument list was null", arglist);
          RPCParam param = (RPCParam) arglist.get(1);
          assertTrue("Not expected result", ((String)param.getValue()).equals("abc"));
  
          // Check DOM
          Element e = body.getAsDOM();
          NodeList l = 
e.getElementsByTagNameNS("http://www.w3.org/2002/06/soap-rpc","result";);
          assertTrue("No result element was fount", l.getLength() == 1);
          String ptr = l.item(0).getFirstChild().getNodeValue();
          assertNotNull("Ptr to the result value was null", ptr);
          l = e.getElementsByTagName(ptr);
          assertTrue("No return element was fount", l.getLength() == 1);
          String res = l.item(0).getFirstChild().getNodeValue();
          assertTrue("Not expected result", res.equals("abc"));
      }
  }
  
  
  
  1.21      +4 -2      xml-axis/java/src/org/apache/axis/handlers/MD5AttachHandler.java
  
  Index: MD5AttachHandler.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/handlers/MD5AttachHandler.java,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- MD5AttachHandler.java     11 Dec 2002 22:38:18 -0000      1.20
  +++ MD5AttachHandler.java     20 Dec 2002 17:28:22 -0000      1.21
  @@ -60,6 +60,7 @@
   import org.apache.axis.Message;
   import org.apache.axis.MessageContext;
   import org.apache.axis.components.logger.LogFactory;
  +import org.apache.axis.soap.SOAPConstants;
   import org.apache.axis.utils.Messages;
   import org.apache.commons.logging.Log;
   
  @@ -78,6 +79,7 @@
           try {
               // log.debug("IN MD5");        
               Message  msg = msgContext.getRequestMessage();
  +            SOAPConstants soapConstants = msgContext.getSOAPConstants();
               org.apache.axis.message.SOAPEnvelope env = 
(org.apache.axis.message.SOAPEnvelope) msg.getSOAPEnvelope();
               org.apache.axis.message.SOAPBodyElement sbe = 
env.getFirstBody();//env.getBodyByName("ns1", "addedfile");
               org.w3c.dom.Element sbElement = sbe.getAsDOM();
  @@ -87,7 +89,7 @@
               for (; n != null && !(n instanceof org.w3c.dom.Element); n = 
n.getNextSibling());
               org.w3c.dom.Element paramElement = (org.w3c.dom.Element) n;
               //Get the href associated with the attachment.
  -            String href = 
paramElement.getAttribute(org.apache.axis.Constants.ATTR_HREF);
  +            String href = paramElement.getAttribute(soapConstants.getAttrHref());
               org.apache.axis.Part ap = 
msg.getAttachmentsImpl().getAttachmentByReference(href);
               javax.activation.DataHandler dh = 
org.apache.axis.attachments.AttachmentUtils.getActivationDataHandler(ap);
               org.w3c.dom.Node timeNode = paramElement.getFirstChild();
  @@ -136,7 +138,7 @@
               n = sbElement.getFirstChild();
               for (; n != null && !(n instanceof org.w3c.dom.Element); n = 
n.getNextSibling());
               paramElement = (org.w3c.dom.Element) n;
  -            // paramElement.setAttribute(org.apache.axis.Constants.ATTR_HREF, 
respHref);
  +            // paramElement.setAttribute(soapConstants.getAttrHref(), respHref);
               String MD5String = org.apache.axis.encoding.Base64.encode(md.digest());
               String senddata = " elapsedTime=" + elapsedTimeStr + " MD5=" + 
MD5String;
   
  
  
  
  1.140     +7 -6      xml-axis/java/src/org/apache/axis/message/MessageElement.java
  
  Index: MessageElement.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/MessageElement.java,v
  retrieving revision 1.139
  retrieving revision 1.140
  diff -u -r1.139 -r1.140
  --- MessageElement.java       11 Dec 2002 22:38:20 -0000      1.139
  +++ MessageElement.java       20 Dec 2002 17:28:22 -0000      1.140
  @@ -237,18 +237,19 @@
                   }
               }
   
  -            href = attributes.getValue(Constants.ATTR_HREF);
  -
  -            // If there's an arrayType attribute, we can pretty well guess that 
we're an Array???
  -            if (attributes.getValue(Constants.URI_DEFAULT_SOAP_ENC, 
Constants.ATTR_ARRAY_TYPE) != null)
  -                typeQName = Constants.SOAP_ARRAY;
  -
               // Set the encoding style to the attribute value.  If null,
               // we just automatically use our parent's (see getEncodingStyle)
               MessageContext mc = context.getMessageContext();
               SOAPConstants sc = (mc != null) ?
                                               mc.getSOAPConstants() :
                                               SOAPConstants.SOAP11_CONSTANTS;
  +
  +            href = attributes.getValue(sc.getAttrHref());
  +
  +            // If there's an arrayType attribute, we can pretty well guess that 
we're an Array???
  +            if (attributes.getValue(Constants.URI_DEFAULT_SOAP_ENC, 
Constants.ATTR_ARRAY_TYPE) != null)
  +                typeQName = Constants.SOAP_ARRAY;
  +
   
               encodingStyle =
                       attributes.getValue(sc.getEncodingURI(),
  
  
  
  1.69      +8 -0      xml-axis/java/src/org/apache/axis/message/RPCHandler.java
  
  Index: RPCHandler.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/RPCHandler.java,v
  retrieving revision 1.68
  retrieving revision 1.69
  diff -u -r1.68 -r1.69
  --- RPCHandler.java   11 Dec 2002 22:38:20 -0000      1.68
  +++ RPCHandler.java   20 Dec 2002 17:28:22 -0000      1.69
  @@ -70,6 +70,7 @@
   import org.apache.axis.encoding.MethodTarget;
   import org.apache.axis.utils.JavaUtils;
   import org.apache.axis.utils.Messages;
  +import org.apache.axis.soap.SOAPConstants;
   import org.apache.commons.logging.Log;
   import org.xml.sax.Attributes;
   import org.xml.sax.SAXException;
  @@ -171,6 +172,13 @@
           QName type = null;
           QName qname = new QName(namespace, localName);
           ParameterDesc paramDesc = null;
  +
  +        SOAPConstants soapConstants = 
context.getMessageContext().getSOAPConstants();
  +        if (soapConstants == SOAPConstants.SOAP12_CONSTANTS &&
  +            Constants.QNAME_RPC_RESULT.equals(qname)) {
  +            // TODO: fix it ... now we just skip it
  +            return new DeserializerImpl();
  +        }
   
           Vector params = rpcElem.getParams();
           
  
  
  
  1.7       +3 -1      
xml-axis/java/src/org/apache/axis/message/SOAPFaultDetailsBuilder.java
  
  Index: SOAPFaultDetailsBuilder.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/message/SOAPFaultDetailsBuilder.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- SOAPFaultDetailsBuilder.java      11 Dec 2002 22:38:20 -0000      1.6
  +++ SOAPFaultDetailsBuilder.java      20 Dec 2002 17:28:22 -0000      1.7
  @@ -64,6 +64,7 @@
   import org.apache.axis.encoding.Deserializer;
   import org.apache.axis.encoding.DeserializerImpl;
   import org.apache.axis.utils.ClassUtils;
  +import org.apache.axis.soap.SOAPConstants;
   import org.xml.sax.Attributes;
   import org.xml.sax.SAXException;
   
  @@ -106,6 +107,7 @@
           // Look up this element in our faultMap
           // if we find a match, this element is the fault data
           MessageContext msgContext = context.getMessageContext();
  +        SOAPConstants soapConstants = msgContext.getSOAPConstants();
           OperationDesc op = msgContext.getOperation();
           if (op != null) {
               FaultDesc faultDesc = op.getFaultByQName(qn);
  @@ -129,7 +131,7 @@
                   builder.setWaiting(true);
                   // register callback for the data, use the xmlType from fault info
                   Deserializer dser = null;
  -                if (attributes.getValue("href") == null) {
  +                if (attributes.getValue(soapConstants.getAttrHref()) == null) {
                       dser = context.getDeserializerForType(faultDesc.getXmlType());
                   } else {
                       dser = new DeserializerImpl();
  
  
  
  1.18      +2 -2      xml-axis/java/src/org/apache/axis/message/SOAPHeaderElement.java
  
  Index: SOAPHeaderElement.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/message/SOAPHeaderElement.java,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- SOAPHeaderElement.java    11 Dec 2002 22:38:20 -0000      1.17
  +++ SOAPHeaderElement.java    20 Dec 2002 17:28:22 -0000      1.18
  @@ -111,7 +111,7 @@
                                            Constants.ATTR_MUST_UNDERSTAND);
   
           if (soapConstants == SOAPConstants.SOAP12_CONSTANTS)
  -            mustUnderstand = ((val != null) && val.equals("true")) ? true : false;
  +            mustUnderstand = ((val != null) && (val.equals("true") || 
val.equals("1"))) ? true : false;
           else
               mustUnderstand = ((val != null) && val.equals("1")) ? true : false;
   
  @@ -153,7 +153,7 @@
                                            Constants.ATTR_MUST_UNDERSTAND);
   
           if (soapConstants == SOAPConstants.SOAP12_CONSTANTS)
  -            mustUnderstand = ((val != null) && val.equals("true")) ? true : false;
  +            mustUnderstand = ((val != null) && (val.equals("true") || 
val.equals("1"))) ? true : false;
           else
               mustUnderstand = ((val != null) && val.equals("1")) ? true : false;
   
  
  
  
  1.38      +1 -0      xml-axis/java/src/org/apache/axis/i18n/resource.properties
  
  Index: resource.properties
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/i18n/resource.properties,v
  retrieving revision 1.37
  retrieving revision 1.38
  diff -u -r1.37 -r1.38
  --- resource.properties       18 Dec 2002 00:39:55 -0000      1.37
  +++ resource.properties       20 Dec 2002 17:28:22 -0000      1.38
  @@ -992,6 +992,7 @@
   
   onlyOneBodyFor12=Only one body allowed for SOAP 1.2 RPC
   noElemAfterBody12=No element allowed after SOAP 1.2 body
  +noSparseArray=Partially transmitted and sparse arrays is not supported in SOAP 1.2
   differentTypes00=Error: The input and output parameter have the same name, ''{0}'', 
but are defined with type ''{1}'' and also with type ''{2}''.
   
   badMsgMethodParam=Message service must take either a single Vector or a Document - 
method {0} takes a single {1}
  
  
  
  1.102     +8 -6      
xml-axis/java/src/org/apache/axis/providers/java/RPCProvider.java
  
  Index: RPCProvider.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/providers/java/RPCProvider.java,v
  retrieving revision 1.101
  retrieving revision 1.102
  diff -u -r1.101 -r1.102
  --- RPCProvider.java  11 Dec 2002 22:38:21 -0000      1.101
  +++ RPCProvider.java  20 Dec 2002 17:28:22 -0000      1.102
  @@ -325,15 +325,17 @@
                       returnQName = new QName("", methodName + "Return");
                   }
                   
  -                // For SOAP 1.2, add a result
  -                if (msgContext.getSOAPConstants() ==
  -                        SOAPConstants.SOAP12_CONSTANTS) {
  -                    returnQName = Constants.QNAME_RPC_RESULT;
  -                }
  -
                   RPCParam param = new RPCParam(returnQName, objRes);
                   param.setParamDesc(operation.getReturnParamDesc());
  +
                   if (!operation.isReturnHeader()) {
  +                    // For SOAP 1.2 rpc style, add a result
  +                    if (msgContext.getSOAPConstants() == 
SOAPConstants.SOAP12_CONSTANTS &&
  +                            !(serviceDesc.getStyle().equals(Style.DOCUMENT))) {
  +                        RPCParam resultParam = new 
RPCParam(Constants.QNAME_RPC_RESULT, returnQName);
  +                        resultParam.setXSITypeGeneration(Boolean.FALSE);
  +                        resBody.addParam(resultParam);
  +                    }
                       resBody.addParam(param);
                   } else {
                       resEnv.addHeader(new RPCHeaderParam(param));
  
  
  
  1.8       +15 -0     xml-axis/java/src/org/apache/axis/soap/SOAP11Constants.java
  
  Index: SOAP11Constants.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/soap/SOAP11Constants.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- SOAP11Constants.java      16 Oct 2002 15:03:04 -0000      1.7
  +++ SOAP11Constants.java      20 Dec 2002 17:28:23 -0000      1.8
  @@ -113,4 +113,19 @@
       public String getNextRoleURI() {
           return Constants.URI_SOAP11_NEXT_ACTOR;
       }
  +
  +    /**
  +     * Obtain the ref attribute name
  +     */
  +    public String getAttrHref() {
  +        return Constants.ATTR_HREF;
  +    }
  +
  +    /**
  +     * Obtain the item type name of an array
  +     */
  +    public String getAttrItemType() {
  +        return Constants.ATTR_ARRAY_TYPE;
  +    }
  +
   }
  
  
  
  1.9       +16 -0     xml-axis/java/src/org/apache/axis/soap/SOAP12Constants.java
  
  Index: SOAP12Constants.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/soap/SOAP12Constants.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- SOAP12Constants.java      16 Oct 2002 15:03:04 -0000      1.8
  +++ SOAP12Constants.java      20 Dec 2002 17:28:23 -0000      1.9
  @@ -118,4 +118,20 @@
       public String getNextRoleURI() {
           return Constants.URI_SOAP12_NEXT_ACTOR;
       }
  +
  +    /**
  +     * Obtain the ref attribute name
  +     */
  +    public String getAttrHref() {
  +        return Constants.ATTR_REF;
  +    }
  +
  +    /**
  +     * Obtain the item type name of an array
  +     */
  +    public String getAttrItemType() {
  +        return Constants.ATTR_ITEM_TYPE;
  +    }
  +
  +
   }
  
  
  
  1.9       +14 -0     xml-axis/java/src/org/apache/axis/soap/SOAPConstants.java
  
  Index: SOAPConstants.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/soap/SOAPConstants.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- SOAPConstants.java        11 Dec 2002 22:38:22 -0000      1.8
  +++ SOAPConstants.java        20 Dec 2002 17:28:23 -0000      1.9
  @@ -113,4 +113,18 @@
        * Obtain the "next" role/actor URI
        */ 
       public String getNextRoleURI();
  +
  +    /**
  +     * Obtain the href attribute name
  +     */
  +    public String getAttrHref();
  +
  +    /**
  +     * Obtain the item type name of an array
  +     */
  +    public String getAttrItemType();
  +
  +
  +
  +
   }
  
  
  
  1.91      +6 -6      xml-axis/java/src/org/apache/axis/handlers/soap/SOAPService.java
  
  Index: SOAPService.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/handlers/soap/SOAPService.java,v
  retrieving revision 1.90
  retrieving revision 1.91
  diff -u -r1.90 -r1.91
  --- SOAPService.java  11 Dec 2002 22:38:19 -0000      1.90
  +++ SOAPService.java  20 Dec 2002 17:28:23 -0000      1.91
  @@ -162,11 +162,11 @@
       }
   
       /**
  -     * SOAPRequestHandler is used to inject SOAP semantics just before
  +     * SOAPResponseHandler is used to inject SOAP semantics just before
        * the pivot handler.
        */
  -    private class SOAPRequestHandler extends BasicHandler {
  -        public SOAPRequestHandler() {}
  +    private class SOAPResponseHandler extends BasicHandler {
  +        public SOAPResponseHandler() {}
   
           public void invoke(MessageContext msgContext) throws AxisFault {
               // Do SOAP semantics here
  @@ -217,7 +217,7 @@
   
                           SOAPHeaderElement newHeader = new
                               SOAPHeaderElement(Constants.URI_SOAP12_FAULT,
  -                                              Constants.ELEM_MISUNDERSTOOD);
  +                                              Constants.ELEM_NOTUNDERSTOOD);
                           newHeader.addAttribute(null,
                                                  Constants.ATTR_QNAME,
                                                  badQName);
  @@ -254,7 +254,7 @@
       public SOAPService(Handler reqHandler, Handler pivHandler,
                          Handler respHandler) {
           this();
  -        init(reqHandler, new SOAPRequestHandler(), pivHandler, null, respHandler);
  +        init(reqHandler, null, pivHandler, new SOAPResponseHandler(), respHandler);
       }
   
       public TypeMappingRegistry getTypeMappingRegistry()
  @@ -267,7 +267,7 @@
        */
       public SOAPService(Handler serviceHandler)
       {
  -        init(null, new SOAPRequestHandler(), serviceHandler, null, null);
  +        init(null, null, serviceHandler, new SOAPResponseHandler(), null);
       }
   
       /** Tell this service which engine it's deployed to.
  
  
  


Reply via email to