axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From d...@apache.org
Subject cvs commit: xml-axis/java/src/org/apache/axis/encoding/ser MapDeserializer.java MapSerializer.java
Date Wed, 12 Mar 2003 17:49:08 GMT
dims        2003/03/12 09:49:08

  Modified:    java/src/org/apache/axis/encoding/ser MapDeserializer.java
                        MapSerializer.java
  Log:
  Fix for Bug 17703 - Java2WSDL creates .Net interop incompatible map type
  
  Notes:
  - Uses soapenc:Array
  - Tested with .NET Framework SDK 1.1
  - See discussion (http://marc.theaimsgroup.com/?t=102650467100001&r=1&w=2)
  
  Revision  Changes    Path
  1.24      +13 -9     xml-axis/java/src/org/apache/axis/encoding/ser/MapDeserializer.java
  
  Index: MapDeserializer.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/MapDeserializer.java,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- MapDeserializer.java	11 Dec 2002 22:38:15 -0000	1.23
  +++ MapDeserializer.java	12 Mar 2003 17:49:07 -0000	1.24
  @@ -143,16 +143,20 @@
               log.debug("Enter: MapDeserializer::onStartChild()");
           }
   
  -        ItemHandler handler = new ItemHandler(this);
  -        
  -        // This item must be complete before we're complete...
  -        addChildDeserializer(handler);
  -        
  -        if (log.isDebugEnabled()) {
  -            log.debug("Exit: MapDeserializer::onStartChild()");
  +        if(localName.equals("item")) {
  +            ItemHandler handler = new ItemHandler(this);
  +            
  +            // This item must be complete before we're complete...
  +            addChildDeserializer(handler);
  +            
  +            if (log.isDebugEnabled()) {
  +                log.debug("Exit: MapDeserializer::onStartChild()");
  +            }
  +    
  +            return handler;
           }
  -
  -        return handler;
  +        
  +        return this;
       }
       
       /**
  
  
  
  1.20      +48 -22    xml-axis/java/src/org/apache/axis/encoding/ser/MapSerializer.java
  
  Index: MapSerializer.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/MapSerializer.java,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- MapSerializer.java	11 Dec 2002 22:38:15 -0000	1.19
  +++ MapSerializer.java	12 Mar 2003 17:49:07 -0000	1.20
  @@ -56,6 +56,8 @@
   package org.apache.axis.encoding.ser;
   
   import org.apache.axis.Constants;
  +import org.apache.axis.MessageContext;
  +import org.apache.axis.schema.SchemaVersion;
   import org.apache.axis.components.logger.LogFactory;
   import org.apache.axis.encoding.SerializationContext;
   import org.apache.axis.encoding.Serializer;
  @@ -64,6 +66,7 @@
   import org.apache.commons.logging.Log;
   import org.w3c.dom.Element;
   import org.xml.sax.Attributes;
  +import org.xml.sax.helpers.AttributesImpl;
   
   import javax.xml.namespace.QName;
   import java.io.IOException;
  @@ -86,6 +89,7 @@
   
       // QNames we deal with
       private static final QName QNAME_KEY = new QName("","key");
  +    private static final QName QNAME_ITEMS = new QName("", "items");
       private static final QName QNAME_ITEM = new QName("", "item");
       private static final QName QNAME_VALUE = new QName("", "value");
   
  @@ -111,6 +115,16 @@
           Map map = (Map)value;
   
           context.startElement(name, attributes);
  +        
  +        AttributesImpl itemsAttributes = new AttributesImpl();
  +        String encodingURI = context.getMessageContext().getSOAPConstants().getEncodingURI();
  +        String encodingPrefix = context.getPrefixForURI(encodingURI);
  +        String soapPrefix = context.getPrefixForURI(Constants.SOAP_MAP.getNamespaceURI());
  +        itemsAttributes.addAttribute(encodingURI, "type", encodingPrefix + ":type",
  +                                   "CDATA", encodingPrefix + ":Array");        
  +        itemsAttributes.addAttribute(encodingURI, "arrayType", encodingPrefix + ":arrayType",
  +                                   "CDATA", soapPrefix + ":item["+map.size()+"]");    
   
  +        context.startElement(QNAME_ITEMS, itemsAttributes);
   
           for (Iterator i = map.entrySet().iterator(); i.hasNext(); )
           {
  @@ -127,6 +141,7 @@
           }
   
           context.endElement();
  +        context.endElement();
       }
   
       public String getMechanismType() { return Constants.AXIS_SAX; }
  @@ -145,32 +160,43 @@
       public Element writeSchema(Class javaType, Types types) throws Exception {
           Element complexType = types.createElement("complexType");
           complexType.setAttribute("name", "Map");
  -        types.writeSchemaElement(Constants.SOAP_MAP, complexType);
           Element seq = types.createElement("sequence");
           complexType.appendChild(seq);
  -
           Element element = types.createElement("element");
  -        element.setAttribute("name", "item");
  -        element.setAttribute("minOccurs", "0");
  -        element.setAttribute("maxOccurs", "unbounded");
  +        element.setAttribute("name", "items");
  +        element.setAttribute("nillable", "true");
  +        element.setAttribute("type", types.getQNameString(new QName(Constants.NS_URI_XMLSOAP,"ArrayOfitem")));
           seq.appendChild(element);
  -
  -        Element subType = types.createElement("complexType");
  -        element.appendChild(subType);
  -
  -        Element all = types.createElement("all");
  -        subType.appendChild(all);
  -
  -        Element key = types.createElement("element");
  -        key.setAttribute("name", "key");
  -        key.setAttribute("type", "xsd:anyType");
  -        all.appendChild(key);
  -
  -        Element value = types.createElement("element");
  -        value.setAttribute("name", "value");
  -        value.setAttribute("type", "xsd:anyType");
  -        all.appendChild(value);
  -
  +        types.writeSchemaElement(Constants.SOAP_MAP, complexType);
  +    
  +        Element arrayType = types.createElement("complexType");
  +        arrayType.setAttribute("name", "ArrayOfitem");
  +        Element complexContent = types.createElement("complexContent");
  +        arrayType.appendChild(complexContent);
  +        Element restriction = types.createElement("restriction");
  +        restriction.setAttribute("base", "soapenc:Array");
  +        complexContent.appendChild(restriction);
  +        Element attribute = types.createElement("attribute");
  +        attribute.setAttribute("ref","soapenc:arrayType");
  +        attribute.setAttribute("wsdl:arrayType",types.getQNameString(new QName(Constants.NS_URI_XMLSOAP,"item[]")));
  +        restriction.appendChild(attribute);
  +        types.writeSchemaElement(Constants.SOAP_MAP, arrayType);
  +
  +        Element itemType = types.createElement("complexType");
  +        itemType.setAttribute("name", "item");
  +        Element seq2 = types.createElement("sequence");
  +        itemType.appendChild(seq2);
  +        Element element2 = types.createElement("element");
  +        element2.setAttribute("name", "key");
  +        element2.setAttribute("nillable", "true");
  +        element2.setAttribute("type", "xsd:string");
  +        seq2.appendChild(element2);
  +        Element element3 = types.createElement("element");
  +        element3.setAttribute("name", "value");
  +        element3.setAttribute("nillable", "true");
  +        element3.setAttribute("type", "xsd:string");
  +        seq2.appendChild(element3);
  +        types.writeSchemaElement(Constants.SOAP_MAP, itemType);
           return complexType;
       }
   }
  
  
  

Mime
View raw message