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 "Michael Xiong (JIRA)" <ax...@ws.apache.org> on 2006/06/27 17:35:30 UTC
[jira] Updated: (AXISCPP-977) axiscpp engine & wsdl2ws: In server
response, basic array element no namespace prefix added
[ 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