Folks,
Any objections to this check-in?
Thanks,
dims
--- dims@apache.org wrote:
> 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;
> }
> }
>
>
>
=====
Davanum Srinivas - http://webservices.apache.org/~dims/
__________________________________________________
Do you Yahoo!?
Yahoo! Web Hosting - establish your business online
http://webhosting.yahoo.com
|