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/02/01 18:09:26 UTC

cvs commit: ws-axis/c/tests/auto_build/testcases/output ComplexTypeAll.request NilValuesTest.cpp.out NilValuesTest.request

dicka       2005/02/01 09:09:26

  Modified:    c/src/common BasicTypeSerializer.cpp
               c/tests/auto_build/testcases/client/cpp
                        ComplexTypeAllClient.cpp
               c/tests/auto_build/testcases/tests ComplexTypeAll.xml
  Added:       c/tests/auto_build/testcases/client/cpp
                        NilValuesTestClient.cpp
               c/tests/auto_build/testcases/tests NilValuesTest.xml
               c/tests/auto_build/testcases/output ComplexTypeAll.request
                        NilValuesTest.cpp.out NilValuesTest.request
  Log:
  Amend problem with omission of namespace from opening XML tag when serializing simple types as an element, and nil.
  Corrected ComplexTypeAll test, as it should not be passing nil, but am introducing new test, based on ComplexTypeAll, to detect any regressions in the future when passing nil.
  
  PR: AXISCPP-403
  Submitted by: Adrian Dick
  
  Revision  Changes    Path
  1.50      +232 -198  ws-axis/c/src/common/BasicTypeSerializer.cpp
  
  Index: BasicTypeSerializer.cpp
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/common/BasicTypeSerializer.cpp,v
  retrieving revision 1.49
  retrieving revision 1.50
  diff -u -r1.49 -r1.50
  --- BasicTypeSerializer.cpp	28 Jan 2005 11:57:18 -0000	1.49
  +++ BasicTypeSerializer.cpp	1 Feb 2005 17:09:26 -0000	1.50
  @@ -61,206 +61,240 @@
           m_sSZ += "\"";
       }
       m_sSZ += ">";
  -    switch (type)
  +    
  +    if (!pValue)
       {
  -        case XSD_INT:
  -            {
  -                Int intSerializer;
  -                m_sSZ += intSerializer.serialize(pValue);
  -            }
  -            break;
  -        case XSD_BOOLEAN:
  -        	{
  -        		Boolean booleanSerializer;
  -           		m_sSZ += booleanSerializer.serialize(pValue);
  -        	}
  -            break;
  -        case XSD_UNSIGNEDINT:
  -            {
  -                UnsignedInt unsignedIntSerializer;
  -                m_sSZ += unsignedIntSerializer.serialize(pValue);
  -            }
  -            break;
  -        case XSD_SHORT:
  -            {
  -                Short shortSerializer;
  -                m_sSZ += shortSerializer.serialize(pValue);
  -            }
  -            break;
  -        case XSD_UNSIGNEDSHORT:
  -            {
  -                UnsignedShort unsignedShortSerializer;
  -                m_sSZ += unsignedShortSerializer.serialize(pValue);
  -            }
  -            break;
  -        case XSD_BYTE:
  -            {
  -                Byte byteSerializer;
  -                m_sSZ += byteSerializer.serialize(pValue);
  -            }
  -            break;
  -        case XSD_UNSIGNEDBYTE:
  -            {
  -                UnsignedByte unsignedByteSerializer;
  -                m_sSZ += unsignedByteSerializer.serialize(pValue);
  -            }
  -            break;
  -        case XSD_LONG:
  -            {
  -                Long longSerializer;
  -                m_sSZ += longSerializer.serialize(pValue);
  -            }
  -            break;
  -        case XSD_INTEGER:
  -            {
  -                Integer integerSerializer;
  -                m_sSZ += integerSerializer.serialize(pValue);
  -            }
  -            break;
  -        case XSD_DURATION:
  -        	{
  -        		Duration durationSerializer;
  -        		m_sSZ += durationSerializer.serialize(pValue);
  -        	}
  -            break;
  -        case XSD_UNSIGNEDLONG:
  -            {
  -                UnsignedLong unsignedLongSerializer;
  -                m_sSZ += unsignedLongSerializer.serialize(pValue);
  -            }
  -            break;
  -        case XSD_FLOAT:
  -        	{
  -        		Float floatSerializer;
  -        		m_sSZ += floatSerializer.serialize(pValue);
  -        	}
  -            break;
  -        case XSD_DOUBLE:
  -        	{
  -        		Double doubleSerializer;
  -        		m_sSZ += doubleSerializer.serialize(pValue);
  -        	}
  -        	break;
  -        case XSD_DECIMAL:
  -        	{
  -        		Decimal decimalSerializer;
  -        		m_sSZ += decimalSerializer.serialize(pValue);
  -        	}
  -            break;
  -        case XSD_STRING:
  -	        pStr = *((char**)(pValue));
  -            if (!pStr)
  -            {
  -                /*
  -                 * It is a null value not an empty value.
  -                 */
  -                m_sSZ = "<";
  -                m_sSZ += pName;
  -           // direct return not good for maintainability 
  -           //     m_sSZ += " xsi:nil=\"true\"/>\n";
  -           //     return m_sSZ.c_str ();
  -				m_sSZ += " xsi:nil=\"true\">";
  -            }
  -            else
  -            {
  -            	String stringSerializer;
  -            	m_sSZ += stringSerializer.serialize(pStr);
  -            }
  -            break;
  -        case XSD_ANYURI:
  -            pStr = *((char**)(pValue));
  -            if (!pStr)
  -            {
  -                /*
  -                 * It is a null value not an empty value.
  -                 */
  -                m_sSZ = "<";
  -                m_sSZ += pName;
  -           // direct return not good for maintainability 
  -           //     m_sSZ += " xsi:nil=\"true\"/>\n";
  -           //     return m_sSZ.c_str ();
  -				m_sSZ += " xsi:nil=\"true\">";
  -            }
  -            else
  -            {
  -            	AnyURI anyURISerializer;
  -            	m_sSZ += anyURISerializer.serialize(pStr);
  -            }
  -            break;
  -        case XSD_QNAME:
  -	        pStr = *((char**)(pValue));
  -            if (!pStr)
  -            {
  -                /*
  -                 * It is a null value not an empty value.
  -                 */
  -                m_sSZ = "<";
  -                m_sSZ += pName;
  -           // direct return not good for maintainability 
  -           //     m_sSZ += " xsi:nil=\"true\"/>\n";
  -           //     return m_sSZ.c_str ();
  -				m_sSZ += " xsi:nil=\"true\">";
  -            }
  -            else
  -            {
  -            	XSD_QName QNameSerializer;
  -            	m_sSZ += QNameSerializer.serialize(pStr);
  -            }
  -            break;
  -        case XSD_NOTATION:
  -            pStr = *((char**)(pValue));
  -            if (!pStr)
  -            {
  -                /*
  -                 * It is a null value not an empty value.
  -                 */
  -                m_sSZ = "<";
  -                m_sSZ += pName;
  -           // direct return not good for maintainability 
  -           //     m_sSZ += " xsi:nil=\"true\"/>\n";
  -           //     return m_sSZ.c_str ();
  -				m_sSZ += " xsi:nil=\"true\">";
  -            }
  -            else
  -            {
  -            	NOTATION notationSerializer;
  -            	m_sSZ += notationSerializer.serialize(pStr);
  -            }
  -            break;
  -        case XSD_HEXBINARY:
  -        	{
  -        		HexBinary hexBinarySerializer;
  -        		m_sSZ += hexBinarySerializer.serialize(pValue);
  -        	}
  -            break;
  -        case XSD_BASE64BINARY:
  -        	{
  -        		Base64Binary base64BinarySerializer;
  -        		m_sSZ += base64BinarySerializer.serialize(pValue);
  -        	}
  -            break;
  -        case XSD_DATETIME:
  -        	{
  -        		DateTime dateTimeSerializer;
  -        		m_sSZ += dateTimeSerializer.serialize(pValue);
  -        	}
  -        	break;
  -        case XSD_DATE:
  -        	{
  -        		Date dateSerializer;
  -        		m_sSZ += dateSerializer.serialize(pValue);
  -        	}
  -        	break;
  -        case XSD_TIME:
  -        	{
  -        		Time timeSerializer;
  -        		m_sSZ += timeSerializer.serialize(pValue);
  -        	}
  -            break;
  -        default:
  -            return NULL;
  +        /*
  +         * It is a null value not an empty value.
  +         */
  +        m_sSZ = "<";
  +        if (NULL != pPrefix)
  +        { 
  +            m_sSZ += pPrefix;
  +            m_sSZ += ":";
  +        }
  +        m_sSZ += pName;
  +        m_sSZ += " xsi:nil=\"true\">";
  +    }
  +    else
  +    {
  +        switch (type)
  +        {
  +            case XSD_INT:
  +                {
  +                    Int intSerializer;
  +                    m_sSZ += intSerializer.serialize(pValue);
  +                }
  +                break;
  +            case XSD_BOOLEAN:
  +            	{
  +            		Boolean booleanSerializer;
  +               		m_sSZ += booleanSerializer.serialize(pValue);
  +            	}
  +                break;
  +            case XSD_UNSIGNEDINT:
  +                {
  +                    UnsignedInt unsignedIntSerializer;
  +                    m_sSZ += unsignedIntSerializer.serialize(pValue);
  +                }
  +                break;
  +            case XSD_SHORT:
  +                {
  +                    Short shortSerializer;
  +                    m_sSZ += shortSerializer.serialize(pValue);
  +                }
  +                break;
  +            case XSD_UNSIGNEDSHORT:
  +                {
  +                    UnsignedShort unsignedShortSerializer;
  +                    m_sSZ += unsignedShortSerializer.serialize(pValue);
  +                }
  +                break;
  +            case XSD_BYTE:
  +                {
  +                    Byte byteSerializer;
  +                    m_sSZ += byteSerializer.serialize(pValue);
  +                }
  +                break;
  +            case XSD_UNSIGNEDBYTE:
  +                {
  +                    UnsignedByte unsignedByteSerializer;
  +                    m_sSZ += unsignedByteSerializer.serialize(pValue);
  +                }
  +                break;
  +            case XSD_LONG:
  +                {
  +                    Long longSerializer;
  +                    m_sSZ += longSerializer.serialize(pValue);
  +                }
  +                break;
  +            case XSD_INTEGER:
  +                {
  +                    Integer integerSerializer;
  +                    m_sSZ += integerSerializer.serialize(pValue);
  +                }
  +                break;
  +            case XSD_DURATION:
  +            	{
  +            		Duration durationSerializer;
  +            		m_sSZ += durationSerializer.serialize(pValue);
  +            	}
  +                break;
  +            case XSD_UNSIGNEDLONG:
  +                {
  +                    UnsignedLong unsignedLongSerializer;
  +                    m_sSZ += unsignedLongSerializer.serialize(pValue);
  +                }
  +                break;
  +            case XSD_FLOAT:
  +            	{
  +            		Float floatSerializer;
  +            		m_sSZ += floatSerializer.serialize(pValue);
  +            	}
  +                break;
  +            case XSD_DOUBLE:
  +            	{
  +            		Double doubleSerializer;
  +            		m_sSZ += doubleSerializer.serialize(pValue);
  +            	}
  +            	break;
  +            case XSD_DECIMAL:
  +            	{
  +            		Decimal decimalSerializer;
  +            		m_sSZ += decimalSerializer.serialize(pValue);
  +            	}
  +                break;
  +            case XSD_STRING:
  +    	        pStr = *((char**)(pValue));
  +                if (!pStr)
  +                {
  +                    /*
  +                     * It is a null value not an empty value.
  +                     */
  +                    m_sSZ = "<";
  +                    if (NULL != pPrefix)
  +                    { 
  +                        m_sSZ += pPrefix;
  +                        m_sSZ += ":";
  +                    }
  +                    m_sSZ += pName;
  +    				m_sSZ += " xsi:nil=\"true\">";
  +                }
  +                else
  +                {
  +                	String stringSerializer;
  +                	m_sSZ += stringSerializer.serialize(pStr);
  +                }
  +                break;
  +            case XSD_ANYURI:
  +                pStr = *((char**)(pValue));
  +                if (!pStr)
  +                {
  +                    /*
  +                     * It is a null value not an empty value.
  +                     */
  +                    m_sSZ = "<";
  +                    if (NULL != pPrefix)
  +                    { 
  +                        m_sSZ += pPrefix;
  +                        m_sSZ += ":";
  +                    }
  +                    m_sSZ += pName;
  +               // direct return not good for maintainability 
  +               //     m_sSZ += " xsi:nil=\"true\"/>\n";
  +               //     return m_sSZ.c_str ();
  +    				m_sSZ += " xsi:nil=\"true\">";
  +                }
  +                else
  +                {
  +                	AnyURI anyURISerializer;
  +                	m_sSZ += anyURISerializer.serialize(pStr);
  +                }
  +                break;
  +            case XSD_QNAME:
  +    	        pStr = *((char**)(pValue));
  +                if (!pStr)
  +                {
  +                    /*
  +                     * It is a null value not an empty value.
  +                     */
  +                    m_sSZ = "<";
  +                    if (NULL != pPrefix)
  +                    { 
  +                        m_sSZ += pPrefix;
  +                        m_sSZ += ":";
  +                    }
  +                    m_sSZ += pName;
  +               // direct return not good for maintainability 
  +               //     m_sSZ += " xsi:nil=\"true\"/>\n";
  +               //     return m_sSZ.c_str ();
  +    				m_sSZ += " xsi:nil=\"true\">";
  +                }
  +                else
  +                {
  +                	XSD_QName QNameSerializer;
  +                	m_sSZ += QNameSerializer.serialize(pStr);
  +                }
  +                break;
  +            case XSD_NOTATION:
  +                pStr = *((char**)(pValue));
  +                if (!pStr)
  +                {
  +                    /*
  +                     * It is a null value not an empty value.
  +                     */
  +                    m_sSZ = "<";
  +                    if (NULL != pPrefix)
  +                    { 
  +                        m_sSZ += pPrefix;
  +                        m_sSZ += ":";
  +                    }
  +                    m_sSZ += pName;
  +               // direct return not good for maintainability 
  +               //     m_sSZ += " xsi:nil=\"true\"/>\n";
  +               //     return m_sSZ.c_str ();
  +    				m_sSZ += " xsi:nil=\"true\">";
  +                }
  +                else
  +                {
  +                	NOTATION notationSerializer;
  +                	m_sSZ += notationSerializer.serialize(pStr);
  +                }
  +                break;
  +            case XSD_HEXBINARY:
  +            	{
  +            		HexBinary hexBinarySerializer;
  +            		m_sSZ += hexBinarySerializer.serialize(pValue);
  +            	}
  +                break;
  +            case XSD_BASE64BINARY:
  +            	{
  +            		Base64Binary base64BinarySerializer;
  +            		m_sSZ += base64BinarySerializer.serialize(pValue);
  +            	}
  +                break;
  +            case XSD_DATETIME:
  +            	{
  +            		DateTime dateTimeSerializer;
  +            		m_sSZ += dateTimeSerializer.serialize(pValue);
  +            	}
  +            	break;
  +            case XSD_DATE:
  +            	{
  +            		Date dateSerializer;
  +            		m_sSZ += dateSerializer.serialize(pValue);
  +            	}
  +            	break;
  +            case XSD_TIME:
  +            	{
  +            		Time timeSerializer;
  +            		m_sSZ += timeSerializer.serialize(pValue);
  +            	}
  +                break;
  +            default:
  +                return NULL;
  +        }
       }
  -
       m_sSZ += "</";
   	if (NULL != pPrefix) {
   		m_sSZ += pPrefix;
  
  
  
  1.9       +3 -0      ws-axis/c/tests/auto_build/testcases/client/cpp/ComplexTypeAllClient.cpp
  
  Index: ComplexTypeAllClient.cpp
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/tests/auto_build/testcases/client/cpp/ComplexTypeAllClient.cpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- ComplexTypeAllClient.cpp	1 Feb 2005 13:30:53 -0000	1.8
  +++ ComplexTypeAllClient.cpp	1 Feb 2005 17:09:26 -0000	1.9
  @@ -34,6 +34,9 @@
         ws = new operations();
   
       aRecord* input = new aRecord();
  +    input->field1 = "Hello World!";
  +    input->field2 = "I'm still here!";
  +    input->field3 = "Now I go!";
       xsd__boolean result = (xsd__boolean)0;
       result = ws->myOperation(input);
   
  
  
  
  1.1                  ws-axis/c/tests/auto_build/testcases/client/cpp/NilValuesTestClient.cpp
  
  Index: NilValuesTestClient.cpp
  ===================================================================
  #include <axis/AxisException.hpp>
  #include "operations.hpp" 
  
  #include <stdlib.h> // For malloc(), calloc(), strdup() and free()
  #include <iostream>
  #include <fstream>
  
  #define WSDL_DEFAULT_ENDPOINT "http://localhost:9080/ComplexTypeAll/services/Service"
  
  // If we re-direct cout it will be to this ofstream
  ofstream output_file;
  
  // Prototype
  bool parse_args_for_endpoint(int *argc, char *argv[], char **endpoint);
  void shift_args(int i, int *argc, char *argv[]);
  void setLogOptions(const char *output_filename);
  
  int main(int argc, char* argv[])
  { 
    operations *ws;
  
    char *endpoint = WSDL_DEFAULT_ENDPOINT;
    bool endpoint_set = false;
    int returnValue = 1; // Assume Failure
  
    endpoint_set = parse_args_for_endpoint(&argc, argv, &endpoint);
  
    try {
      if(endpoint_set) {
        ws = new operations(endpoint, APTHTTP1_1);
        free(endpoint);
        endpoint_set = false;
      } else
        ws = new operations();
  
      aRecord* input = new aRecord();
      xsd__boolean result = (xsd__boolean)0;
      result = ws->myOperation(input);
  
      cout << "Result " << result << endl;
  
      returnValue = 0; // Success
  
    } catch(AxisException &e) {
      cerr << e.what() << endl;
      if(endpoint_set)
        free(endpoint);
    } catch(...) {
      cerr << "Unknown Exception occured." << endl;
      if(endpoint_set)
        free(endpoint);
    }
    
    // Samisa : clean up memory allocated for stub
    try
    {
     delete ws; 
    }
    catch(exception& exception)
    {
      cout << "Exception on clean up of ws : " << exception.what()<<endl;
    }
    catch(...)
    {
     cout << "Unknown exception on clean up of ws : " << endl;
    }
    cout << "---------------------- TEST COMPLETE -----------------------------"<< endl;
  
    return returnValue;
  }
  
  /* Spin through args list and check for -e -p and -s options.
     Option values are expected to follow the option letter as the next
     argument.
   
     These options and values are removed from the arg list.
     If both -e and -s and or -p, then -e takes priority
  */
  bool parse_args_for_endpoint(int *argc, char *argv[], char **endpoint) {
  
      // We need at least 2 extra arg after program name
      if(*argc < 3)
          return false;
  
      char *server = "localhost";
      int  port = 80;
      bool ep_set = false;
      bool server_set = false;
      bool port_set = false;
  
      for(int i=1; i<*argc; i++) {
          if(*argv[i] == '-') {
              switch(*(argv[i]+1)) {
              case 'e':
                  *endpoint = strdup(argv[i+1]);
                  ep_set = true;
                  shift_args(i, argc, argv);
                  i--;
                  break;
              case 's':
                  server = strdup(argv[i+1]);
                  server_set = true;
                  shift_args(i, argc, argv);
                  i--;
                  break;
              case 'p':
                  port = atoi(argv[i+1]);
                  if(port >80) port_set = true;
                  shift_args(i, argc, argv);
                  i--;
                  break;
              case 'o':
                  setLogOptions(argv[i+1]);
                  shift_args(i, argc, argv);
                  i--;
                  break;
              default:
                  break;
              }
          }
      }
  
      // use the supplied server and/or port to build the endpoint
      if(ep_set == false && (server_set || port_set)) {
          // Set p to the location of the first '/' after the http:// (7 chars)
          // e.g. from http://localhost:80/axis/base gets /axis/base
          char *ep_context = strpbrk(&(*endpoint)[7], "/");
  
          // http://:/ is 9 characters + terminating NULL character so add 10.
          // Allow space for port number upto 999999 6 chars
          *endpoint = (char *)calloc(1, 10 + strlen(ep_context) + strlen(server) + 6);
          sprintf(*endpoint, "http://%s:%d/%s", server, port, ep_context+1);
          if(server_set) free(server);
          ep_set = true;
      }
  
      return ep_set;
  }
  
  void shift_args(int i, int *argc, char *argv[]) {
      for(int j=i, k=i+2; j<*(argc)-2; j++, k++)
          argv[j]=argv[k];
      *argc-=2;
  }
  void setLogOptions(const char *output_filename) {
      output_file.open(output_filename, ios::out);
      if(output_file.is_open()){
          cout.rdbuf( output_file.rdbuf() );
      }
  }
  
  
  
  
  1.2       +3 -0      ws-axis/c/tests/auto_build/testcases/tests/ComplexTypeAll.xml
  
  Index: ComplexTypeAll.xml
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/tests/auto_build/testcases/tests/ComplexTypeAll.xml,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ComplexTypeAll.xml	11 Dec 2004 15:26:15 -0000	1.1
  +++ ComplexTypeAll.xml	1 Feb 2005 17:09:26 -0000	1.2
  @@ -8,6 +8,9 @@
           <output>
               ComplexTypeAll.cpp.out
           </output>
  +		<request>
  +			ComplexTypeAll.request
  +		</request>
       </expected>
   	<endpoint>-e http://localhost:9080/ComplexTypeAll/services/Service</endpoint>
   </test>
  
  
  
  1.1                  ws-axis/c/tests/auto_build/testcases/tests/NilValuesTest.xml
  
  Index: NilValuesTest.xml
  ===================================================================
  <test>
      <name>NilValuesTest</name>
      <description>NilValuesTest</description>
      <clientLang>cpp</clientLang>
      <clientCode>NilValuesTestClient.cpp</clientCode>
      <wsdl>ComplexTypeAll.wsdl</wsdl>
      <expected>
          <output>
              NilValuesTest.cpp.out
          </output>
  		<request>
  			NilValuesTest.request
  		</request>
      </expected>
  	<endpoint>-e http://localhost:9080/ComplexTypeAll/services/Service</endpoint>
  </test>
  
  
  
  1.1                  ws-axis/c/tests/auto_build/testcases/output/ComplexTypeAll.request
  
  Index: ComplexTypeAll.request
  ===================================================================
  POST /ComplexTypeAll/services/Service HTTP/1.1
  Host: localhost:13260
  Content-Type: text/xml; charset=UTF-8
  SOAPAction: "http://complextype.test.apache.org"
  Content-Length: 500
  
  <?xml version='1.0' encoding='utf-8' ?>
  <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <SOAP-ENV:Body>
  <ns1:myOperation xmlns:ns1="http://complextype.test.apache.org">
  <ns1:aType><ns1:field1>Hello World!</ns1:field1>
  <ns1:field2>I&apos;m still here!</ns1:field2>
  <ns1:field3>Now I go!</ns1:field3>
  </ns1:aType>
  </ns1:myOperation>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>
  
  
  
  
  1.1                  ws-axis/c/tests/auto_build/testcases/output/NilValuesTest.cpp.out
  
  Index: NilValuesTest.cpp.out
  ===================================================================
  Result 1
  ---------------------- TEST COMPLETE -----------------------------
  
  
  
  1.1                  ws-axis/c/tests/auto_build/testcases/output/NilValuesTest.request
  
  Index: NilValuesTest.request
  ===================================================================
  POST /ComplexTypeAll/services/Service HTTP/1.1
  Host: localhost:13260
  Content-Type: text/xml; charset=UTF-8
  SOAPAction: "http://complextype.test.apache.org"
  Content-Length: 504
  
  <?xml version='1.0' encoding='utf-8' ?>
  <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <SOAP-ENV:Body>
  <ns1:myOperation xmlns:ns1="http://complextype.test.apache.org">
  <ns1:aType><ns1:field1 xsi:nil="true"></ns1:field1>
  <ns1:field2 xsi:nil="true"></ns1:field2>
  <ns1:field3 xsi:nil="true"></ns1:field3>
  </ns1:aType>
  </ns1:myOperation>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>