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 di...@apache.org on 2005/08/01 20:23:29 UTC

cvs commit: ws-axis/java/src/org/apache/axis/deployment/wsdd WSDDTypeMapping.java

dims        2005/08/01 11:23:29

  Modified:    java/src/org/apache/axis/encoding/ser ArraySerializer.java
                        BeanSerializer.java
               java/src/org/apache/axis/wsdl/toJava
                        JavaBeanHelperWriter.java JavaStubWriter.java
               java/src/org/apache/axis/utils JavaUtils.java
               java/src/org/apache/axis/encoding SerializationContext.java
                        TypeMappingImpl.java
               java/src/org/apache/axis/deployment/wsdd
                        WSDDTypeMapping.java
  Added:       java/test/wsdl/axis2098 build.xml deploy.wsdd
                        helloworld.wsdl helloworld.xsd
                        MyServiceTestCase.java MySOAPBindingImpl.java
                        TestHandler.java undeploy.wsdd
  Log:
  Fix and test case for AXIS-2098, AXIS-2103
  - WSDDTypeMapping : Register exact type mapping for primtive type at the server-side. (primitive type instead of primitive wrapper)
  - JavaStubWriter : Register exact type mapping for schema derived types in the client side.
  - Serialization : Pass the java class to the SerializationContext to determine actual java type for serialization
  - TypeMappingImpl : find serializer using xml type. (for schema derived types)
  - JavaBeanHelperWriter : write exact type qname for schema ref'ed element. (AXIS-2103)
  
  from Jongjin Choi
  
  Revision  Changes    Path
  1.74      +3 -3      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.73
  retrieving revision 1.74
  diff -u -r1.73 -r1.74
  --- ArraySerializer.java	8 Jun 2005 12:54:42 -0000	1.73
  +++ ArraySerializer.java	1 Aug 2005 18:23:28 -0000	1.74
  @@ -415,7 +415,7 @@
                               (serializeAttr == null ?
                               serializeAttr : new AttributesImpl(serializeAttr)),
                               aValue,
  -                            componentTypeQName); // prefered type QName
  +                            componentTypeQName, componentClass); // prefered type QName
                   }
               } else {
                   for (Iterator iterator = list.iterator(); iterator.hasNext();) {
  @@ -426,7 +426,7 @@
                               (serializeAttr == null ?
                               serializeAttr : new AttributesImpl(serializeAttr)),
                               aValue,
  -                            componentTypeQName); // prefered type QName
  +                            componentTypeQName, componentClass); // prefered type QName
                   }
               }
           } else {
  @@ -434,7 +434,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, componentTypeQName);
  +                    context.serialize(elementName, null, aValue, componentTypeQName, componentClass);
                   }
               }
           }
  
  
  
  1.90      +7 -4      ws-axis/java/src/org/apache/axis/encoding/ser/BeanSerializer.java
  
  Index: BeanSerializer.java
  ===================================================================
  RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/encoding/ser/BeanSerializer.java,v
  retrieving revision 1.89
  retrieving revision 1.90
  diff -u -r1.89 -r1.90
  --- BeanSerializer.java	21 Jul 2005 03:08:40 -0000	1.89
  +++ BeanSerializer.java	1 Aug 2005 18:23:28 -0000	1.90
  @@ -230,7 +230,7 @@
                           context.serialize(qname,
                                             null,
                                             propValue,
  -                                          xmlType);
  +                                          xmlType, javaType);
                       } else {
                           // Collection of properties: serialize each one
                           int j=0;
  @@ -245,7 +245,7 @@
                               }
                               if (j >= 0) {
                                   context.serialize(qname, null,
  -                                                  propValue, xmlType);
  +                                                  propValue, xmlType, propertyDescriptor[i].getType());
                               }
                           }
                       }
  @@ -608,6 +608,7 @@
                           setAttributeProperty(propValue,
                                                qname,
                                                field.getXmlType(), 
  +                                             field.getJavaType(),
                                                attrs,
                                                context);
                       }
  @@ -623,7 +624,9 @@
   
       private void setAttributeProperty(Object propValue,
                                         QName qname,
  -                                      QName xmlType, AttributesImpl attrs,
  +                                      QName xmlType,
  +                                      Class javaType,
  +                                      AttributesImpl attrs,
                                         SerializationContext context) throws Exception {
   
           String namespace = qname.getNamespaceURI();
  @@ -638,7 +641,7 @@
               return;
           }
   
  -        String propString = context.getValueAsString(propValue, xmlType);
  +        String propString = context.getValueAsString(propValue, xmlType, javaType);
   
           attrs.addAttribute(namespace,
                              localName,
  
  
  
  1.1                  ws-axis/java/test/wsdl/axis2098/build.xml
  
  Index: build.xml
  ===================================================================
  <?xml version="1.0" ?>
  <!DOCTYPE project [
          <!ENTITY properties SYSTEM "file:../../../xmls/properties.xml">
          <!ENTITY paths  SYSTEM "file:../../../xmls/path_refs.xml">
          <!ENTITY taskdefs SYSTEM "file:../../../xmls/taskdefs.xml">
          <!ENTITY taskdefs_post_compile SYSTEM "file:../../../xmls/taskdefs_post_compile.xml">
          <!ENTITY targets SYSTEM "file:../../../xmls/targets.xml">
  ]>
  
  <!-- ===================================================================
  <description>
     Test/Sample Component file for Axis
  
  Notes:
     This is a build file for use with the Jakarta Ant build tool.
  
  Prerequisites:
  
     jakarta-ant from http://jakarta.apache.org
  
  Build Instructions:
     To compile
          ant compile
     To execute
          ant run
  
  Author:
    Matt Seibert mseibert@us.ibm.com
  
  Copyright:
    Copyright (c) 2002-2003 Apache Software Foundation.
  </description>
  ==================================================================== -->
  
  <project default="compile">
  
  <property name="axis.home" location="../../.." />
  <property name="componentName" value="test/wsdl/axis2098" />
          &properties;
          &paths;
          &taskdefs;
          &taskdefs_post_compile;
          &targets;
  
  <target name="clean">
      <echo message="Removing ${build.dir}/classes/${componentName} and ${build.dir}/work/${componentName}" />
      <delete dir="${build.dir}/classes/${componentName}"/>
      <delete dir="${build.dir}/work/${componentName}"/>
  </target>
  
  <target name="copy" depends="setenv"/>
  
  <target name="compile" depends="copy">
    <echo message="Compiling test.wsdl.axis2098"/>
      <!-- This tests element qualification.  -->
      <wsdl2java url="${axis.home}/test/wsdl/axis2098/helloworld.wsdl"
                 output="${axis.home}/build/work"
  			   serverSide="no"
  			   testcase="no"
  			   all="true">
          <mapping namespace="http://helloworld.ch/schema/service" package="test.wsdl.axis2098"/>
          <mapping namespace="http://helloworld.ch/schema/types" package="test.wsdl.axis2098"/>
      </wsdl2java>
  
      <copy todir="${build.dir}/work/test/wsdl/axis2098" overwrite="yes">
        <fileset dir="${axis.home}/test/wsdl/axis2098">
          <include name="*TestCase.java"/>
          <include name="*Impl.java"/>
          <include name="*Handler.java"/>
  		<include name="*.wsdd"/> 
        </fileset>
      </copy>
  
      <javac srcdir="${build.dir}/work" destdir="${build.dest}" nowarn="${nowarn}" source="${source}" fork="${javac.fork}"
             debug="${debug}">
        <classpath refid="classpath" />
        <include name="test/wsdl/axis2098/*.java" />
      </javac>
  
  </target>
  
  <target name="run" >
    <antcall target="execute-Component" />
  </target>
  
  </project>
  
  
  
  1.1                  ws-axis/java/test/wsdl/axis2098/deploy.wsdd
  
  Index: deploy.wsdd
  ===================================================================
  <!-- Use this file to deploy some handlers/chains and services      -->
  <!-- Two ways to do this:                                           -->
  <!--   java org.apache.axis.client.AdminClient deploy.wsdd          -->
  <!--      after the axis server is running                          -->
  <!-- or                                                             -->
  <!--   java org.apache.axis.utils.Admin client|server deploy.wsdd   -->
  <!--      from the same directory that the Axis engine runs         -->
  
  <deployment
      xmlns="http://xml.apache.org/axis/wsdd/"
      xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
  
    <!-- Services from MyService WSDL service -->
  
    <service name="HelloWorld" provider="java:RPC" style="document" use="literal">
        <parameter name="wsdlTargetNamespace" value="http://helloworld.ch/schema/service"/>
        <parameter name="wsdlServiceElement" value="MyService"/>
        <parameter name="schemaQualified" value="http://helloworld.ch/schema/types"/>
        <parameter name="wsdlServicePort" value="HelloWorld"/>
        <parameter name="className" value="test.wsdl.axis2098.MySOAPBindingImpl"/>
        <parameter name="wsdlPortType" value="MyPort"/>
        <parameter name="typeMappingVersion" value="1.2"/>
        <operation name="helloWorld" qname="HelloWorld" returnQName="retNS:MyResponse" xmlns:retNS="http://helloworld.ch/schema/types" returnType="rtns:MyResponseType" xmlns:rtns="http://helloworld.ch/schema/types" >
          <parameter qname="pns:MyRequest" xmlns:pns="http://helloworld.ch/schema/types" type="tns:MyRequestType" xmlns:tns="http://helloworld.ch/schema/types"/>
        </operation>
        <parameter name="allowedMethods" value="helloWorld"/>
        <parameter name="scope" value="Session"/>
  
        <requestFlow>
            <handler type="java:test.wsdl.axis2098.TestHandler"/>
        </requestFlow>
  
        <responseFlow>
            <handler type="java:test.wsdl.axis2098.TestHandler"/>
        </responseFlow>
  
        <typeMapping
          xmlns:ns="http://helloworld.ch/schema/types"
          qname="ns:StringType"
          type="java:java.lang.String"
          serializer="org.apache.axis.encoding.ser.SimpleSerializerFactory"
          deserializer="org.apache.axis.encoding.ser.SimpleDeserializerFactory"
          encodingStyle=""
        />
        <typeMapping
          xmlns:ns="http://helloworld.ch/schema/types"
          qname="ns:LogicType"
          type="java:boolean"
          serializer="org.apache.axis.encoding.ser.SimpleSerializerFactory"
          deserializer="org.apache.axis.encoding.ser.SimpleDeserializerFactory"
          encodingStyle=""
        />
        <typeMapping
          xmlns:ns="http://helloworld.ch/schema/types"
          qname="ns:>StringElem"
          type="java:java.lang.String"
          serializer="org.apache.axis.encoding.ser.SimpleSerializerFactory"
          deserializer="org.apache.axis.encoding.ser.SimpleDeserializerFactory"
          encodingStyle=""
        />
        <typeMapping
          xmlns:ns="http://helloworld.ch/schema/types"
          qname="ns:MyRequestType"
          type="java:test.wsdl.axis2098.MyRequestType"
          serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
          deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
          encodingStyle=""
        />
        <typeMapping
          xmlns:ns="http://helloworld.ch/schema/types"
          qname="ns:RestrictionType"
          type="java:test.wsdl.axis2098.RestrictionType"
          serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
          deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
          encodingStyle=""
        />
        <typeMapping
          xmlns:ns="http://helloworld.ch/schema/types"
          qname="ns:XsiTestType"
          type="java:test.wsdl.axis2098.XsiTestType"
          serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
          deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
          encodingStyle=""
        />
        <typeMapping
          xmlns:ns="http://helloworld.ch/schema/types"
          qname="ns:MyResponseType"
          type="java:test.wsdl.axis2098.MyResponseType"
          serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
          deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
          encodingStyle=""
        />
    </service>
  </deployment>
  
  
  
  1.1                  ws-axis/java/test/wsdl/axis2098/helloworld.wsdl
  
  Index: helloworld.wsdl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <wsdl:definitions
      xmlns:tns="http://helloworld.ch/schema/service"
      xmlns:types="http://helloworld.ch/schema/types"
      xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
      xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
      targetNamespace="http://helloworld.ch/schema/service"
      name="SalaryDeclarationService">
  
      <wsdl:types>
          <xs:schema
              targetNamespace="http://helloworld.ch/schema/types"
              xmlns:xs="http://www.w3.org/2001/XMLSchema"
              elementFormDefault="qualified" attributeFormDefault="unqualified">
              <xs:include schemaLocation="./helloworld.xsd"/>
          </xs:schema>
      </wsdl:types>
  
      <wsdl:message name="HelloWorldRequest">
          <wsdl:part name="body" element="types:MyRequest"/>
      </wsdl:message>
      <wsdl:message name="HelloWorldResponse">
          <wsdl:part name="body" element="types:MyResponse"/>
      </wsdl:message>
  
      <wsdl:portType name="MyPort">
          <wsdl:operation name="HelloWorld">
              <wsdl:input message="tns:HelloWorldRequest"/>
              <wsdl:output message="tns:HelloWorldResponse"/>
          </wsdl:operation>
      </wsdl:portType>
  
      <wsdl:binding name="MySOAPBinding" type="tns:MyPort">
          <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
          <wsdl:operation name="HelloWorld">
              <soap:operation style="document"/>
              <wsdl:input>
                  <soap:body use="literal"/>
              </wsdl:input>
              <wsdl:output>
                  <soap:body use="literal"/>
              </wsdl:output>
          </wsdl:operation>
      </wsdl:binding>
  
      <wsdl:service name="MyService">
          <wsdl:port name="HelloWorld" binding="tns:MySOAPBinding">
              <soap:address location="http://localhost:8080/axis/services/HelloWorld"/>
          </wsdl:port>
      </wsdl:service>
  </wsdl:definitions>
  
  
  
  1.1                  ws-axis/java/test/wsdl/axis2098/helloworld.xsd
  
  Index: helloworld.xsd
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  <xs:schema
      targetNamespace="http://helloworld.ch/schema/types"
      xmlns:tns="http://helloworld.ch/schema/types"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      elementFormDefault="qualified"
      attributeFormDefault="unqualified"
      version="0.1">
  
      <xs:element name="MyRequest" type="tns:MyRequestType"/>
  
      <xs:element name="MyResponse" type="tns:MyResponseType"/>
  
      <xs:complexType name="MyRequestType">
          <xs:sequence>
              <xs:element name="Helloworld" type="tns:XsiTestType"/>
          </xs:sequence>
      </xs:complexType>
  
      <xs:complexType name="MyResponseType">
          <xs:sequence>
              <xs:element name="Helloworld" type="tns:XsiTestType"/>
          </xs:sequence>
      </xs:complexType>
  
      <xs:complexType name="XsiTestType">
          <xs:sequence>
              <!-- simple -->
              <xs:element name="Logic" type="tns:LogicType"/>
              <xs:element name="String" type="tns:StringType"/>
              <!-- complex -->
              <xs:element name="Restriction" type="tns:RestrictionType"/>
              <xs:element ref="tns:StringElem"/>
          </xs:sequence>
      </xs:complexType>
  
      <xs:simpleType name="LogicType">
          <xs:restriction base="xs:boolean">
              <xs:pattern value="true"/>
              <xs:pattern value="false"/>
          </xs:restriction>
      </xs:simpleType>
  
      <xs:simpleType name="StringType">
          <xs:restriction base="xs:string">
              <xs:minLength value="10"/>
          </xs:restriction>
      </xs:simpleType>
  
      <xs:complexType name="BaseType" abstract="true" >
          <xs:sequence>
              <xs:element name="FirstName" type="xs:string" minOccurs="0" nillable="false"/>
              <xs:element name="LastName" type="xs:string"/>
          </xs:sequence>
      </xs:complexType>
  
      <xs:complexType name="RestrictionType">
          <xs:complexContent>
              <xs:restriction base="tns:BaseType">
                  <xs:sequence>
                      <xs:element name="LastName" type="xs:string"/>
                  </xs:sequence>
              </xs:restriction>
          </xs:complexContent>
      </xs:complexType>
      
      <xs:element name="StringElem">
      	<xs:simpleType>
      		<xs:restriction base="xs:string">
      			<xs:minLength value="3"/>
      			<xs:maxLength value="4"/>
      		</xs:restriction>
      	</xs:simpleType>
      </xs:element>
  </xs:schema>
  
  
  1.1                  ws-axis/java/test/wsdl/axis2098/MyServiceTestCase.java
  
  Index: MyServiceTestCase.java
  ===================================================================
  /**
   * MyServiceTestCase.java
   *
   * This file was auto-generated from WSDL
   * by the Apache Axis 1.3 Jul 05, 2005 (04:50:41 KST) WSDL2Java emitter.
   */
  
  package test.wsdl.axis2098;
  
  public class MyServiceTestCase extends junit.framework.TestCase {
      public MyServiceTestCase(java.lang.String name) {
          super(name);
      }
  
      public void testHelloWorldWSDL() throws Exception {
          javax.xml.rpc.ServiceFactory serviceFactory = javax.xml.rpc.ServiceFactory.newInstance();
          java.net.URL url = new java.net.URL(new test.wsdl.axis2098.MyServiceLocator().getHelloWorldAddress() + "?WSDL");
          javax.xml.rpc.Service service = serviceFactory.createService(url, new test.wsdl.axis2098.MyServiceLocator().getServiceName());
          assertTrue(service != null);
      }
  
      public void test1HelloWorldHelloWorld() throws Exception {
          test.wsdl.axis2098.MySOAPBindingStub binding;
          try {
              binding = (test.wsdl.axis2098.MySOAPBindingStub)
                            new test.wsdl.axis2098.MyServiceLocator().getHelloWorld();
  
          }
          catch (javax.xml.rpc.ServiceException jre) {
              if(jre.getLinkedCause()!=null)
                  jre.getLinkedCause().printStackTrace();
              throw new junit.framework.AssertionFailedError("JAX-RPC ServiceException caught: " + jre);
          }
          assertNotNull("binding is null", binding);
  
          // Time out after a minute
          binding.setTimeout(60000);
  
  		// Thread.sleep(10*1000);
  
  		MyRequestType request = new MyRequestType();
  
          // Test operation
          MyResponseType value = null;
  
  		XsiTestType test = new XsiTestType();
  
          test.setString("Hello World --------------------------!");
  
          //  Will give a validation error: cvc-elt.4.3: Type 'xsd:boolean' is not validly derived from the type definition, 'LogicType', of element 'Logic'.
          // It will add a xsi:type boolean but should not: <Logic xsi:type="xsd:boolean">true</Logic>
          test.setLogic(true);
  
          RestrictionType r = new RestrictionType();
          // r.setFirstName("Hello"); //we do not set this but  <firstName xsi:nil="true"/> is still sent over the wire
          r.setLastName("World");
          test.setRestriction(r);
          
          test.setStringElem("String Ref");
  
          request.setHelloworld(test);
  
          // Invoke webservice
          MyResponseType response = binding.helloWorld(request);
  
          System.out.println("Response from the webservice:");
          System.out.println("\t"+response.getHelloworld());
          // TBD - validate results
      }
  
  }
  
  
  
  1.1                  ws-axis/java/test/wsdl/axis2098/MySOAPBindingImpl.java
  
  Index: MySOAPBindingImpl.java
  ===================================================================
  package test.wsdl.axis2098;
  
  public class MySOAPBindingImpl implements test.wsdl.axis2098.MyPort {
  
      public test.wsdl.axis2098.MyResponseType helloWorld(test.wsdl.axis2098.MyRequestType body)
              throws java.rmi.RemoteException {
  
          MyResponseType resp = new MyResponseType();
          resp.setHelloworld(body.getHelloworld());
          return resp;
      }
  }
  
  
  
  1.1                  ws-axis/java/test/wsdl/axis2098/TestHandler.java
  
  Index: TestHandler.java
  ===================================================================
  package test.wsdl.axis2098;
  
  import java.io.ByteArrayOutputStream;
  
  import org.apache.axis.AxisFault;
  import org.apache.axis.MessageContext;
  import org.apache.axis.handlers.BasicHandler;
  
  public class TestHandler extends BasicHandler {
      public void invoke(MessageContext msgContext) throws AxisFault {
          ByteArrayOutputStream baos = new ByteArrayOutputStream();
  		
          try {
              msgContext.getCurrentMessage().writeTo(baos);
          } catch (Exception e) {
              throw new AxisFault("exception", e);
          }
          String msg = baos.toString();
          System.out.println("msg = " + msg);
          if (msg.indexOf("xsi:type") >= 0) {
              throw new AxisFault("message contains xsi:type");
          }
      }
  }
  
  
  
  1.1                  ws-axis/java/test/wsdl/axis2098/undeploy.wsdd
  
  Index: undeploy.wsdd
  ===================================================================
  <undeployment name="test" xmlns="http://xml.apache.org/axis/wsdd/">
    <service name="HelloWorld"/>
  </undeployment>
  
  
  
  1.53      +10 -1     ws-axis/java/src/org/apache/axis/wsdl/toJava/JavaBeanHelperWriter.java
  
  Index: JavaBeanHelperWriter.java
  ===================================================================
  RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/wsdl/toJava/JavaBeanHelperWriter.java,v
  retrieving revision 1.52
  retrieving revision 1.53
  diff -u -r1.52 -r1.53
  --- JavaBeanHelperWriter.java	29 Apr 2005 13:54:50 -0000	1.52
  +++ JavaBeanHelperWriter.java	1 Aug 2005 18:23:29 -0000	1.53
  @@ -18,6 +18,7 @@
   import org.apache.axis.utils.Messages;
   import org.apache.axis.wsdl.symbolTable.ContainedAttribute;
   import org.apache.axis.utils.JavaUtils;
  +import org.apache.axis.wsdl.symbolTable.DefinedElement;
   import org.apache.axis.wsdl.symbolTable.DefinedType;
   import org.apache.axis.wsdl.symbolTable.ElementDecl;
   import org.apache.axis.wsdl.symbolTable.SchemaUtils;
  @@ -335,7 +336,15 @@
                           // be a SOAP array derived type.  In this case, use
                           // the refType's QName for the metadata.
                           elemType = elemType.getRefType();
  -                    } else {
  +                    } else if (elemType.getClass() == DefinedElement.class
  +                            && elemType.getRefType() != null) {
  +                        // If we have a DefinedElement which references other element
  +                        //  (eg. <element ref="aRefEleme"/>)
  +                        // use the refType's QName for the metadata (which can be anonymous type.)
  +                        // see the schema of test/wsdl/axis2098
  +                        elemType = elemType.getRefType();
  +                    }                    
  +                    else {
                           // Otherwise, use the first non-Collection type we
                           // encounter up the ref chain.
                           while (elemType instanceof CollectionTE) {
  
  
  
  1.155     +4 -2      ws-axis/java/src/org/apache/axis/wsdl/toJava/JavaStubWriter.java
  
  Index: JavaStubWriter.java
  ===================================================================
  RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/wsdl/toJava/JavaStubWriter.java,v
  retrieving revision 1.154
  retrieving revision 1.155
  diff -u -r1.154 -r1.155
  --- JavaStubWriter.java	1 Aug 2005 03:16:45 -0000	1.154
  +++ JavaStubWriter.java	1 Aug 2005 18:23:29 -0000	1.155
  @@ -993,8 +993,10 @@
               pw.println("            cachedSerFactories.add(enumsf);");
               pw.println("            cachedDeserFactories.add(enumdf);");
           } else if (type.isSimpleType()) {
  -            pw.println("            cachedSerFactories.add(simplesf);");
  -            pw.println("            cachedDeserFactories.add(simpledf);");
  +            pw.println("            cachedSerFactories.add(org.apache.axis.encoding.ser.BaseSerializerFactory.createFactory(" +
  +                    "org.apache.axis.encoding.ser.SimpleSerializerFactory.class, cls, qName));");
  +            pw.println("            cachedDeserFactories.add(org.apache.axis.encoding.ser.BaseDeserializerFactory.createFactory(" +
  +                    "org.apache.axis.encoding.ser.SimpleDeserializerFactory.class, cls, qName));");
           } else if (type.getBaseType() != null) {
   
               // serializers are not required for types derived from base types
  
  
  
  1.120     +21 -0     ws-axis/java/src/org/apache/axis/utils/JavaUtils.java
  
  Index: JavaUtils.java
  ===================================================================
  RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/utils/JavaUtils.java,v
  retrieving revision 1.119
  retrieving revision 1.120
  diff -u -r1.119 -r1.120
  --- JavaUtils.java	27 Jul 2005 02:46:47 -0000	1.119
  +++ JavaUtils.java	1 Aug 2005 18:23:29 -0000	1.120
  @@ -139,6 +139,27 @@
           
           return null;
       }
  +    
  +    public static Class getPrimitiveClassFromName(String primitive) {
  +        if (primitive.equals("int"))
  +            return int.class;
  +        else if (primitive.equals("short"))
  +            return short.class;
  +        else if (primitive.equals("boolean"))
  +            return boolean.class;
  +        else if (primitive.equals("byte"))
  +            return byte.class;
  +        else if (primitive.equals("long"))
  +            return long.class;
  +        else if (primitive.equals("double"))
  +            return double.class;
  +        else if (primitive.equals("float"))
  +            return float.class;
  +        else if (primitive.equals("char"))
  +            return char.class;
  +        
  +        return null;
  +    }
   
       /*
            * Any builtin type that has a constructor that takes a String is a basic
  
  
  
  1.112     +111 -9    ws-axis/java/src/org/apache/axis/encoding/SerializationContext.java
  
  Index: SerializationContext.java
  ===================================================================
  RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/encoding/SerializationContext.java,v
  retrieving revision 1.111
  retrieving revision 1.112
  diff -u -r1.111 -r1.112
  --- SerializationContext.java	21 Jul 2005 02:08:00 -0000	1.111
  +++ SerializationContext.java	1 Aug 2005 18:23:29 -0000	1.112
  @@ -675,7 +675,7 @@
                             Attributes attributes,
                             Object value)
           throws IOException {
  -        serialize(elemQName, attributes, value, null, null, null);
  +        serialize(elemQName, attributes, value, null, null, null, null);
       }
   
       /**
  @@ -694,13 +694,42 @@
        * @param elemQName is the QName of the element
        * @param attributes are additional attributes
        * @param value is the object to serialize
  +     * @param xmlType is the qname of the type or null.
  +     * @deprecated use serialize(QName, Attributes, Object, QName, Class) instead
        */
       public void serialize(QName elemQName,
                             Attributes attributes,
                             Object value,
                             QName xmlType)
           throws IOException {
  -        serialize(elemQName, attributes, value, xmlType, null, null);
  +        serialize(elemQName, attributes, value, xmlType, null, null, null);
  +    }
  +    
  +    /**
  +     * Serialize the indicated value as an element with the name
  +     * indicated by elemQName.
  +     * The attributes are additional attribute to be serialized on the element.
  +     * The value is the object being serialized.  (It may be serialized
  +     * directly or serialized as an mult-ref'd item)
  +     * The value is an Object, which may be a wrapped primitive, the
  +     * javaType is the actual unwrapped object type.
  +     * The xmlType is the QName of the type that is used to set
  +     * xsi:type.  If not specified, xsi:type is set by using the javaType to
  +     * find an appopriate xmlType from the TypeMappingRegistry.
  +     * Null values and the xsi:type flag will be sent or not depending 
  +     * on previous configuration of this SerializationContext.
  +     * @param elemQName is the QName of the element
  +     * @param attributes are additional attributes
  +     * @param value is the object to serialize
  +     * @param xmlType is the qname of the type or null.
  +     * @param javaType is the java type of the value
  +     */
  +    public void serialize(QName elemQName,
  +                          Attributes attributes,
  +                          Object value,
  +                          QName xmlType, Class javaType)
  +        throws IOException {
  +        serialize(elemQName, attributes, value, xmlType, javaType, null, null);
       }
   
       /**
  @@ -734,7 +763,7 @@
                             Boolean sendType)
           throws IOException
       {
  -        serialize( elemQName, attributes, value, xmlType, 
  +        serialize( elemQName, attributes, value, xmlType, null, 
                      (sendNull) ? Boolean.TRUE : Boolean.FALSE, 
                      sendType);
       }
  @@ -765,6 +794,40 @@
                             QName xmlType,
                             Boolean sendNull,
                             Boolean sendType)
  +        throws IOException 
  +    {
  +        serialize(elemQName, attributes, value, xmlType, null, sendNull, sendType);
  +        
  +    }
  +    
  +    /**
  +     * Serialize the indicated value as an element with the name
  +     * indicated by elemQName.
  +     * The attributes are additional attribute to be serialized on the element.
  +     * The value is the object being serialized.  (It may be serialized
  +     * directly or serialized as an mult-ref'd item)
  +     * The value is an Object, which may be a wrapped primitive.
  +     * The xmlType (if specified) is the QName of the type that is used to set
  +     * xsi:type.
  +     * The sendNull flag indicates whether to end an element with an xsi:nil="true" attribute for null
  +     * variables (if Boolean.TRUE), or nothing (if Boolean.FALSE).
  +     * The sendType flag indicates whether the xsi:type flag should be sent
  +     * (default is true).
  +     * @param elemQName is the QName of the element
  +     * @param attributes are additional attributes
  +     * @param value is the object to serialize
  +     * @param xmlType is the qname of the type or null.
  +     * @param javaType is the java type of the value
  +     * @param sendNull determines whether to send null values.
  +     * @param sendType determines whether to set xsi:type attribute.
  +     */
  +    public void serialize(QName elemQName,
  +                          Attributes attributes,
  +                          Object value,
  +                          QName xmlType,
  +                          Class javaClass,
  +                          Boolean sendNull,
  +                          Boolean sendType)
           throws IOException
       {
           boolean sendXSITypeCache = sendXSIType;
  @@ -810,7 +873,7 @@
   
                       //Allow an the attachment to do its own serialization.
                       serializeActual(elemQName, attributes, value,
  -                                    xmlType, sendType);
  +                                    xmlType, javaClass, sendType);
   
                       //No need to add to mulitRefs. Attachment data stream handled by
                       // the message;
  @@ -861,7 +924,7 @@
                               attrs.setAttributes(attributes);
                           attrs.addAttribute("", Constants.ATTR_ID, "id", "CDATA",
                                              id);
  -                        serializeActual(elemQName, attrs, value, xmlType, sendType);
  +                        serializeActual(elemQName, attrs, value, xmlType, javaClass, sendType);
                           this.sendNull = sendNullCache;
                           return;
                       }
  @@ -912,7 +975,7 @@
                   forceSer = null;
   
               // Actually serialize the value.  (i.e. not an href like above)
  -            serializeActual(elemQName, attributes, value, xmlType, sendType);
  +            serializeActual(elemQName, attributes, value, xmlType, javaClass, sendType);
           } finally {
               sendXSIType = sendXSITypeCache;
           }
  @@ -989,6 +1052,7 @@
                   // ascertain the type in these circumstances (though Axis does).
                   serialize(multirefQName, attrs2, mri.value,
                             mri.xmlType,
  +                          null,
                             this.sendNull,
                             Boolean.TRUE);   // mri.sendType
               }
  @@ -1363,6 +1427,7 @@
                                   Attributes attributes,
                                   Object value,
                                   QName xmlType,
  +                                Class javaClass,
                                   Boolean sendType)
           throws IOException
       {
  @@ -1370,7 +1435,6 @@
               sendType.booleanValue();
   
           if (value != null) {
  -            Class javaType = value.getClass();
               TypeMapping tm = getTypeMapping();
   
               if (tm == null) {
  @@ -1393,6 +1457,9 @@
   
               // Try getting a serializer for the prefered xmlType
               QNameHolder actualXMLType = new QNameHolder();
  +                        
  +            Class javaType = getActualJavaClass(xmlType, javaClass, value);
  +                        
               Serializer ser = getSerializer(javaType, xmlType,
                                              actualXMLType);
   
  @@ -1407,7 +1474,10 @@
                       if(!isEncoded()) {
                           if (Constants.isSOAP_ENC(actualXMLType.value.getNamespaceURI())) {
                               // Don't write SOAP_ENC types (i.e. Array) if we're not using encoding
  -                        } else {
  +                        } else if (javaType.isPrimitive() && javaClass != null && JavaUtils.getWrapperClass(javaType) == javaClass) {
  +                            // Don't write xsi:type when serializing primitive wrapper value as primitive type.
  +                        }
  +                        else {
                               if(!(javaType.isArray() && xmlType != null && Constants.isSchemaXSD(xmlType.getNamespaceURI())) ) {
                                   writeXMLType = actualXMLType.value;
                               }
  @@ -1437,6 +1507,36 @@
           }
           // !!! Write out a generic null, or get type info from somewhere else?
       }
  +    
  +    /**
  +     * Returns the java class for serialization. 
  +     * If the xmlType is xsd:anyType or javaType is array or javaType is java.lang.Object
  +     * the java class for serialization is the class of obj.
  +     * If the obj is not array and the obj's class does not match with the javaType,
  +     * the java class for serialization is the javaType.
  +     * Otherwise, the java class for serialization is the obj's class.
  +     * 
  +     * @param xmlType    the qname of xml type
  +     * @param javaType   the java class from serializer 
  +     * @param obj        the object to serialize
  +     * @return the java class for serialization
  +     */
  +    private Class getActualJavaClass(QName xmlType, Class javaType, Object obj) {
  +        Class cls = obj.getClass();
  +        
  +        if ((xmlType != null 
  +                    && Constants.isSchemaXSD(xmlType.getNamespaceURI()) && "anyType".equals(xmlType.getLocalPart()))
  +                || (javaType != null 
  +                        && (javaType.isArray() || javaType == Object.class))) {
  +            return cls;
  +        }
  +        
  +        if (javaType != null && cls != javaType && !cls.isArray()) {
  +            return javaType;
  +        }
  +        
  +        return cls;
  +    }
   
       private Serializer getSerializerFromClass(Class javaType, QName qname) {
           
  @@ -1565,8 +1665,10 @@
           return ser;
       }
   
  -    public String getValueAsString(Object value, QName xmlType) throws IOException {
  +    public String getValueAsString(Object value, QName xmlType, Class javaClass) throws IOException {
           Class cls = value.getClass();
  +        cls = getActualJavaClass(xmlType, javaClass, value);
  +        
           Serializer ser = getSerializer(cls, xmlType, null);
           
           // The java type is an array, but we need a simple type.
  
  
  
  1.67      +14 -0     ws-axis/java/src/org/apache/axis/encoding/TypeMappingImpl.java
  
  Index: TypeMappingImpl.java
  ===================================================================
  RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/encoding/TypeMappingImpl.java,v
  retrieving revision 1.66
  retrieving revision 1.67
  diff -u -r1.66 -r1.67
  --- TypeMappingImpl.java	1 Aug 2005 03:16:45 -0000	1.66
  +++ TypeMappingImpl.java	1 Aug 2005 18:23:29 -0000	1.67
  @@ -340,6 +340,20 @@
               }
           }
           
  +        // find serializer with xmlType
  +        if (sf == null && !javaType.isArray() 
  +                && !Constants.isSchemaXSD(xmlType.getNamespaceURI()) 
  +                && !Constants.isSOAP_ENC(xmlType.getNamespaceURI())) {
  +            Pair pair2 = (Pair) qName2Pair.get(xmlType);
  +            if (pair2 != null && pair2.javaType != null 
  +                    && !pair2.javaType.isArray()                         // for array
  +                    && (javaType.isAssignableFrom(pair2.javaType) || 
  +                       (pair2.javaType.isPrimitive() && javaType == JavaUtils.getWrapperClass(pair2.javaType))))       // for derived type (xsd:restriction) 
  +            {
  +                sf = (javax.xml.rpc.encoding.SerializerFactory) pair2SF.get(pair2);
  +            }
  +        }
  +        
           return sf;
       }
       
  
  
  
  1.40      +2 -2      ws-axis/java/src/org/apache/axis/deployment/wsdd/WSDDTypeMapping.java
  
  Index: WSDDTypeMapping.java
  ===================================================================
  RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/deployment/wsdd/WSDDTypeMapping.java,v
  retrieving revision 1.39
  retrieving revision 1.40
  diff -u -r1.39 -r1.40
  --- WSDDTypeMapping.java	13 Jun 2005 14:25:37 -0000	1.39
  +++ WSDDTypeMapping.java	1 Aug 2005 18:23:29 -0000	1.40
  @@ -177,8 +177,8 @@
               }
               String loadName = JavaUtils.getLoadableClassName(typeQName.getLocalPart());
               if (JavaUtils.getWrapper(loadName) != null) {
  -                // in case of a primitive type by use its corresponding wrapper class. 
  -                loadName = "java.lang." + JavaUtils.getWrapper(loadName);
  +                Class cls = JavaUtils.getPrimitiveClassFromName(loadName);
  +                return cls;
               }
               return ClassUtils.forName(loadName);
           }