You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-dev@axis.apache.org by Franz Fehringer <fe...@isogmbh.de> on 2006/07/07 11:47:36 UTC

[Fwd: [jira] Updated: (AXISCPP-977) axiscpp engine & wsdl2ws: In server response, basic array element no namespace prefix added]

Hello.

Is it possible to review and perhaps apply Michaels patches?

Greetings

Franz

-------- Original-Nachricht --------
Betreff: 	[jira] Updated: (AXISCPP-977) axiscpp engine & wsdl2ws: In 
server response, basic array element no namespace prefix added
Datum: 	Tue, 27 Jun 2006 15:35:30 +0000 (GMT+00:00)
Von: 	Michael Xiong (JIRA) <ax...@ws.apache.org>
Antwort an: 	Apache AXIS C Developers List <ax...@ws.apache.org>
An: 	axis-c-dev@ws.apache.org



     [ http://issues.apache.org/jira/browse/AXISCPP-977?page=all ]

Michael Xiong updated AXISCPP-977:
----------------------------------

    Attachment: axis-c-1.6b-mxiong-20060616.patch

I created this patch for all the bug fix to axis-c-1.6beta which I've reported before:
1. AXISCPP-966
2. AXISCPP-967
3. AXISCPP-968
4. AXISCPP-970
5. AXISCPP-971
6. AXISCPP-972
7. AXISCPP-973
8. AXISCPP-975
9. AXISCPP-977

> axiscpp engine & wsdl2ws: In server response, basic array element no namespace prefix added
> -------------------------------------------------------------------------------------------
>
>          Key: AXISCPP-977
>          URL: http://issues.apache.org/jira/browse/AXISCPP-977
>      Project: Axis-C++
>         Type: Improvement

>   Components: Serialization, WSDL processing - RPC, Server - Engine
>     Versions:  1.6 Beta
>  Environment:     Platform:
>         Linux fedora 3.0
> Axis version:
>         Server-side Axis C++ 1.6Beta
> XML Parser Lib:
> xersesc 2.6
> WSDL2ws tool by using axis java 1.3
> Client-side version Axis java 1.3
> Http Server Version:
> Apache 2.0.53
> Tomcat 2.0.58
>     Reporter: Michael Xiong
>  Attachments: axis-c-1.6b-mxiong-20060616.patch
>
> 1. sample WSDL
> ... ...
> 		<xs:schema elementFormDefault="qualified" targetNamespace="http://www.foo.bar/foo/bar">
> 			<xs:element name="AddDog""> 
> 				<xs:complexType>
> 					<xs:sequence>
> 						<xs:element maxOccurs="unbounded" name="Dog" type="mb:DogRequest"/>
> 					</xs:sequence>
> 				</xs:complexType>
> 			</xs:element>
> 			<xs:element name="AddDogResponse">
> 				<xs:complexType>
> 					<xs:sequence>
> 						<xs:element minOccurs="0" maxOccurs="unbounded" name="Dog" type="mb:DogInfo"/>
> 					</xs:sequence>
> 				</xs:complexType>
> 			</xs:element>
> 			<xs:element name="DeleteDog">
> 				<xs:complexType>
> 					<xs:sequence>
> 						<xs:element maxOccurs="unbounded" name="Dog" type="mb:DogRequest"/>
> 						<xs:element minOccurs="0" maxOccurs="1" name="Forced" type="xs:boolean" default="false"/>
> 					</xs:sequence>
> 				</xs:complexType>
> 			</xs:element>
> 			<xs:element name="DeleteDogResponse">
> 				<xs:complexType>
> 					<xs:sequence>
> 						<xs:element minOccurs="0" maxOccurs="unbounded" name="DogId" type="xs:string"/>
> 					</xs:sequence>
> 				</xs:complexType>
> 			</xs:element>
> 		</xs:schema>
> ... ...
> 2. I created a c++ server by axiscpp1.6beta  and a java client by axisjava1.3
> 3. Response from c++ server when do DeleteDog operation from the created java client:
>          <ns1:DeleteDogResponse xmlns:ns1="http://www.foo.bar/foo/bar">
>             <DogId>1</DogId>
>              <DogId>2</DogId>
>         </ns1:DeleteDogResponse >
> The client can not recognize the response because the expected response seems should be like the below:
>          <ns1:DeleteDogResponse xmlns:ns1="http://www.foo.bar/foo/bar">
>             <ns1:DogId>1</ns1:DogId>
>              <ns1:DogId>2</ns1:DogId>
>         </ns1:DeleteDogResponse >
> The difference is the lack of ns1: prefix.
> 4. I've read the related source code of axiscpp and find that the reason is that axiscpp does not pass namespace information when serializing/descrializing basic array parameter.
> 5. I have succeeded in the modification to axis-c-1.6beta to improve it to support namespace prefix for basic array element like the below:
> 5.1: Add an interface in IWrapperSoapSerializer(include/axis/IWrapperSoapSerializer.hpp)
> //<mxiong debug 2006/6/27 ++
>     /* Method used by wrappers to set a to-be-serialized Array of basic types */
>     virtual int AXISCALL addOutputBasicArrayParam(const Axis_Array* pArray, 
>         XSDTYPE nType, const AxisChar* pName, const AxisChar* pNamespace)=0;
> //>mxiong debug 2006/6/27 ++
> 5.2: Derive the above interface in class SoapSerializer(src/soap/SoapSerializer.h)
> //<mxiong debug 2006/6/27 ++
>     /* Method used by wrappers to set a to-be-serialized Array of basic types */
>     int AXISCALL addOutputBasicArrayParam(const Axis_Array* pArray, 
>         XSDTYPE nType, const AxisChar* pName,
>         const AxisChar* pNamespace);
> //>mxiong debug 2006/6/27 ++
> 5.3: Implement the above method like the below(src/soap/SoapSerializer.cpp):
> //<mxiong debug 2006/6/27 ++
> int SoapSerializer::addOutputBasicArrayParam( const Axis_Array * pArray, 
>                                               XSDTYPE nType,
>                                               const AxisChar * pName,
>                                               const AxisChar* pNamespace)
> {
> //<mxiong debug 2006/5/19 ++
> 	std::cerr << "SoapSerializer::addOutputBasicArrayParam with namespace, begin, pName=" << pName << std::endl;			
> //>mxiong debug 2006/5/19 ++
> 	#ifdef ENABLE_AXISTRACE
> 		if (axiscpp::AxisTrace::isTraceOn())
> 			axiscpp::AxisTrace::traceEntry("SoapSerializer", "addOutputBasicArrayParam", this, 3,
> 					TRACETYPE_POINTER, sizeof(Axis_Array), ((void*)&pArray),
> 					TRACETYPE_DATA, sizeof(XSDTYPE), ((void*)&nTrype),
> 					TRACETYPE_STRING, 0, ((void*)&pName));	  /* AUTOINSERTED TRACE */
> 	#endif
> 	int	iSuccess = AXIS_SUCCESS;
>     Axis_Array * pLocalArray = pArray->clone();
>     ArrayBean * pAb = makeArrayBean( nType, (void**) (pLocalArray->m_Array));
>     pAb->SetDimension(pLocalArray->m_Size);
>     /*
>      * We're now finished with the local array object, so it can be deleted
>      * However, we need to de-couple from the internal array, which is now owned
>      * by the ArrayBean.
>      */
>     pLocalArray->m_Array = NULL;
>     pLocalArray->m_Size = 0;
>     delete pLocalArray;
>     pLocalArray = NULL;
>     Param* pParam = new Param();
>     if( RPC_ENCODED == m_nStyle)
>     {
>         pAb->SetItemName("item");
>         pParam->setName(pName);
> //<mxiong debug 2006/6/27 ++
>         std::cerr << "SoapSerializer::addOutputBasicArrayParam with namespace, RPC_ENCODED == m_nStyle" << std::endl;
>         pAb->SetUri( pNamespace);
> //>mxiong debug 2006/6/27 ++
>     }
>     else
>     {
>         pAb->SetItemName(pName);
>         pParam->setName("array");       
> //<mxiong debug 2006/6/27 ++
>         std::cerr << "SoapSerializer::addOutputBasicArrayParam with namespace, RPC_ENCODED != m_nStyle" << std::endl;
> 	    if( NULL != pNamespace)
> 		{
> 		    pParam->setURI( pNamespace);
> 		} 
> //>mxiong debug 2006/6/27 ++
>     }
>     
>     pParam->m_Value.pArray = pAb;
>     pParam->m_Type = XSD_ARRAY;
>     if( m_pSoapEnvelope && (m_pSoapEnvelope->m_pSoapBody) && 
>         (m_pSoapEnvelope->m_pSoapBody->m_pSoapMethod)) 
>     {
> //<mxiong debug 2006/5/19 ++
> 	std::cerr << "SoapSerializer::addOutputBasicArrayParam, addOutputParam" <<  std::endl;			
> //>mxiong debug 2006/5/19 ++
>         m_pSoapEnvelope->m_pSoapBody->m_pSoapMethod->addOutputParam( pParam);
>     }
> //<mxiong debug 2006/5/19 ++
> 	std::cerr << "SoapSerializer::addOutputBasicArrayParam, end, pName=" << pName << std::endl;			
> //>mxiong debug 2006/5/19 ++
>     	{
> 		#ifdef ENABLE_AXISTRACE
> 			int traceRet = (iSuccess);
> 			if (axiscpp::AxisTrace::isTraceOn())
> 				axiscpp::AxisTrace::traceExit("SoapSerializer", "addOutputBasicArrayParam", this, 0,
> 					TRACETYPE_INT, 0, ((void*)&traceRet));	  /* AUTOINSERTED TRACE */
> 			return traceRet;
> 		#else
> 			return iSuccess;
> 		#endif
> 	}
>   // Can it only be successful?
> }
> //>mxiong debug 2006/6/27 ++
> 6. For WSDL2WS, src/wsdl/org/apache/axis/wsdl/wsdl2ws/cpp/literal/WrapWriter.java, in method "writeMethodInWrapper", modify it like the below:
> ... ...
>             /* set the result */
>             if (returntypeissimple)
>             {
>                 if (returntype.isArray())
>                 { /*parameters that are declared as arrays in the wrapping element.*/
>                     String containedType =
>                    CUtils.getclass4qname(retType.getName());
>                     writer.write(
>                         "\t\tnStatus = pIWSSZ->addOutputBasicArrayParam(ret, "
>                             + CUtils.getXSDTypeForBasicType(containedType)
>                             + ", \""
>                             + returnParamName
> //<mxiong debug 2006/6/27 ++
>                             + "\", \""
>                             + minfo.getOutputMessage().getNamespaceURI()
> //>mxiong debug 2006/6/27 ++                                 
>                             + "\");\n");
>                     writer.write("\t\tdelete ret;\n");
>                     writer.write("\t\treturn nStatus;\n");
>                 }
>                 else
>                 {
> ... ...
> 7. I've verified my modification for axis-c-1.6b engine and WSDL2WS tool, it works well.
> Could you please give my report a kindly  check ?

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: axis-c-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-c-dev-help@ws.apache.org