[ http://issues.apache.org/jira/browse/AXISCPP-977?page=comments#action_12437987 ] Michael Xiong commented on AXISCPP-977: ---------------------------------------
Dear all, Environment: Tomcat 2.0.58 should be --> Tomcat 5.0.28 Could someboday help me to update the "Environment:" info ? Thanks a lot ! Michael Xiong > 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++ > Issue Type: Improvement > Components: Serialization, WSDL processing - RPC, Server - Engine > Affects 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: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
