axis-c-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From krishna <kris...@lac.uic.edu>
Subject Re: AXISCPP-634
Date Fri, 24 Feb 2006 17:46:27 GMT
Hi Chinthana

I would like to enquire if a patch for AXISCPP-674 has been developed.
( AXISCPP-674 deals with adding attribute to complex types in the 
SOAP-RESPONSE -
I did look through the mailing list and was unable to find it )

My understanding is that as the attributes have to be for 
serialized/deserialized
changes would be required to the stub code generated by the wsdl2ws tool.
Is there an alternate method of implementing this?

Thanks
Krishna

Chinthana C. Dinapala wrote:

>Hi Krishna,
>
>See the comments bellow. If you attached your modification (diff) I'll
>be able to test the patch and commit the code in to SVN. Also used SVN
>code which is latest code.
>About SVN checkout see following site.
>http://ws.apache.org/axis/cpp/windev-guide.html#svncheckout
>
>
>My basic question is:
>Do I need to call getElementForAttributes before calling
>getAttributeAs...?
>
>[Chinthana C. Dinapala] yes. As it's now you have to call this function
>first. 
>
>And if so will it become a part of IWrapperSoapDeSerializer in the
>future?
>
>[Chinthana C. Dinapala] seems to me it has to be adding to solve the
>problem.
>
>Thanks
>Chinthana
> 
>
>
>krishna wrote:
>
>  
>
>>Hi All
>>
>>This is in regard to AXISCPP-634. I was trying to use the method
>>getAttributeAsString() in IWrapperSoapDeSerializer and was unable to 
>>get the required result.
>>
>>On Looking up SoapDeSerializer.cpp I understood that 
>>getElementForAttribute was to be called before
>>calling getAttributeAsString.
>>** Code/Comments from SoapDeSerializer.cpp **
>>           /*
>>  1463  * Before calling any of getAttributeAs... API functions the 
>>user should move
>>  1464  * current Element to the right Element by calling 
>>GetElementForAttributes(..)
>>  1465  */
>>  1466 xsd__int *
>>  1467     SoapDeSerializer::getAttributeAsInt (const AxisChar *
>>    
>>
>pName,
>  
>
>>  1468                                          const AxisChar * 
>>pNamespace)
>>  1469 {
>>  1470     Int simpleType;
>>  1471     getAttribute(pName, pNamespace, &simpleType);
>>  1472         return simpleType.getInt();
>>  1473 }
>>
>>But getElementForAttribute is not available in
>>    
>>
>IWrapperSoapDeSerializer
>  
>
>>which is the object accessible in the stubs.
>>
>>Also getElementForAttribute is a private method in SoapDeSerializer
>>
>>SOAP - RESPONSE
>><ns1:echoIntArrayResponse xmlns:ns1="http://soapinterop.org/">
>><intArrayType xsi:type="ns2:intArrayType" 
>>xmlns:ns2="http://soapinterop.org/xsd" 
>>ref="http://www.lac.uic.edu:8080" >
>><item>0</item>
>>
>>What I would ideally like to do is
>>extract the ref tag above in the axis client stub code within the 
>>deserialize function found in intArrayType.cpp
>>
>>int Axis_DeSerialize_intArrayType(intArrayType* param, 
>>IWrapperSoapDeSerializer* pIWSDZ)
>>    72 {
>>    73         *printf("\n The attribute is 
>>%s",pIWSDZ->getAttributeAsString("ref",0));*
>>    74         param->intItem = 
>>(xsd__int_Array&)pIWSDZ->getBasicArray(XSD_INT, "intItem",0);
>>    75         return pIWSDZ->getStatus();
>>    76 }
>>
>>Currently the above code returns null. output
>>--- The attribute is (null) ----
>>
>>Line 73 was the only line added by me to the stubs.
>>But after doing some changes to IWrapperSoapDeSerializer to make 
>>getElementForAttribute accessible and adding
>>
>>     getElementForAttribute("intArrayType",0); before line 73 makes 
>>things work.
>>
>>Is this the way of getting the attributes from the soap message or am 
>>I missing something?
>>
>>I have attached the client stub code. I am using axiscpp checked out 
>>from the CVS on 25th July 2005
>>
>>Thanks
>>Krishna
>>
>>Dushshantha Chandradasa wrote:
>>
>>    
>>
>>>HI Krishna,
>>>
>>> 
>>>
>>>If you are not a committer, you cannot assign the issue to yourself. 
>>>If you can please attach the diff with respect to the svn head to the
>>>      
>>>
>
>  
>
>>>issue, I can test the changes and commit it to the SVN.
>>>
>>> **
>>>
>>> 
>>>
>>>
>>>      
>>>
>------------------------------------------------------------------------
>  
>
>>>*From:* krishna [mailto:krishna@lac.uic.edu]
>>>*Sent:* Wednesday, October 12, 2005 6:17 AM
>>>*To:* axis-c-dev@ws.apache.org
>>>*Subject:* AXISCPP-634
>>>
>>> 
>>>
>>>Hi All
>>>
>>>I am currently implementing a webservices solution using Axis C++. My
>>>      
>>>
>
>  
>
>>>webservices solution urgently requires
>>>functionality provided by AXISCPP-634. ( Setting attributes for 
>>>complex types in the SOAP-RESPONSE )
>>>http://issues.apache.org/jira/browse/AXISCPP-634.
>>>
>>>      
>>>
>>>>>From JIRA I understand that it is still unassigned.
>>>>        
>>>>
>>>If nobody is working on it, would it be possible for me to contribute
>>>      
>>>
>
>  
>
>>>in resolving AXISCPP-634??
>>>
>>>Thanks
>>>Krishna Kumar Rajagopalan
>>>http://uic.edu/~krajag2 <http://uic.edu/%7Ekrajag2>
>>>
>>>      
>>>
>>-----------------------------------------------------------------------
>>    
>>
>-
>  
>
>>/*
>>*Sample Code for Array: By Krishna Kumar Rajagopalan
>>*Uses a RPC Web Service
>>*
>>*/
>>
>>#include "ArrayTestPortType.hpp"
>>#include <stdio.h>
>>#include <iostream>
>>
>>unsigned int ARRAY_SIZE=1;
>>
>>int main(int argc,char *argv[])
>>{
>>	char serverurl[500]="http://localhost/axis/arrayPS";
>>	intArrayType arr_in;
>>	intArrayType *arr_out;
>>	arr_in.intItem.m_Size = 1;
>>	int arr[1];
>>	if( argc > 1 )
>>	{
>>		switch(argc)
>>		{
>>	  	        default: printf("\n Extra parameters specified!!
>>    
>>
>Neglecting extra parameters \n");
>  
>
>>		  	case 3:	strcpy(serverurl,argv[2]);
>>			case 2: arr[0]=atoi(argv[1]);
>>		}
>>	}
>>	else
>>	{		
>>		printf("\n Switching to defaults \n");
>>		arr[0]=0;
>>		strcpy(serverurl,"http://localhost/axis/arrayPS");
>>	}
>>
>>	arr_in.intItem.m_Array = new int*;
>>	arr_in.intItem.m_Array[0] = &arr[0];
>>	
>>	ArrayTestPortType ws(serverurl);
>>	printf("\n Invoking Echo int Array \n");
>>	try
>>	{
>>		ws.setTransportTimeout(10000);
>>		if ((arr_out =
>>    
>>
>ws.echoIntArray(&arr_in))->intItem.m_Array == NULL )
>  
>
>>		{
>>			printf("\n Received Null \n");
>>		}
>>		else
>>		{
>>			printf("\n Not null output !! ");
>>			cout<<"Array size is
>>    
>>
>"<<arr_out->intItem.m_Size<<endl;
>  
>
>>			for( int i=0; i < arr_out->intItem.m_Size; i++)
>>			{
>>				printf("\n Item %d is
>>    
>>
>%d",i,*(arr_out->intItem.m_Array[i]));
>  
>
>>			}
>>		}
>>	}
>>	catch(AxisException& e)
>>	{
>>	         printf("Exception : %s\n", e.what());
>>	}
>>       catch(exception& e)
>>	{
>>	         printf("Unknown exception has occured\n");
>>	}
>>	catch(...)
>>	{
>>	         printf("Unknown exception has occured\n");
>>	}
>>	return 0;
>>}
>> 
>>
>>-----------------------------------------------------------------------
>>    
>>
>-
>  
>
>>/*
>>* This file was auto-generated by the Axis C++ Web Service Generator
>>    
>>
>(WSDL2Ws)
>  
>
>>* This file contains Client Stub implementation for remote web
>>    
>>
>service.
>  
>
>>*/
>>
>>#include "ArrayTestPortType.hpp"
>>
>>#include <axis/AxisWrapperAPI.hpp>
>>#include <string.h>
>>
>>using namespace std;
>>
>>extern int Axis_DeSerialize_intArrayType(intArrayType* param,
>>    
>>
>IWrapperSoapDeSerializer* pDZ);
>  
>
>>extern void* Axis_Create_intArrayType(intArrayType *Obj, bool bArray =
>>    
>>
>false, int nSize=0);
>  
>
>>extern void Axis_Delete_intArrayType(intArrayType* param, bool bArray =
>>    
>>
>false, int nSize=0);
>  
>
>>extern int Axis_Serialize_intArrayType(intArrayType* param,
>>    
>>
>IWrapperSoapSerializer* pSZ, bool bArray = false);
>  
>
>>extern int Axis_GetSize_intArrayType();
>>
>>ArrayTestPortType::ArrayTestPortType(const char* pchEndpointUri,
>>    
>>
>AXIS_PROTOCOL_TYPE eProtocol)
>  
>
>>:Stub(pchEndpointUri, eProtocol)
>>{
>>}
>>
>>ArrayTestPortType::ArrayTestPortType()
>>:Stub(" ", APTHTTP1_1)
>>{
>>	m_pCall->setEndpointURI("http://localhost/axis/arrayPS");
>>}
>>
>>ArrayTestPortType::~ArrayTestPortType()
>>{
>>}
>>
>>
>>/*Methods corresponding to the web service methods*/
>>
>>/*
>>* This method wrap the service method echoIntArray
>>*/
>>intArrayType* ArrayTestPortType::echoIntArray(intArrayType* Value0)
>>{
>>	intArrayType* pReturn = NULL;
>>	const char* pcCmplxFaultName;
>>	try
>>	{
>>		if (AXIS_SUCCESS !=
>>    
>>
>m_pCall->initialize(CPP_RPC_PROVIDER)) 
>  
>
>>			return pReturn;
>>	if (NULL==m_pCall->getTransportProperty("SOAPAction",false))
>>	{
>>		m_pCall->setTransportProperty(SOAPACTION_HEADER ,
>>    
>>
>"arrayPS#echoIntArray");
>  
>
>>	}
>>		m_pCall->setSOAPVersion(SOAP_VER_1_1);
>>		m_pCall->setOperation("echoIntArray",
>>    
>>
>"http://soapinterop.org/");
>  
>
>>		applyUserPreferences();
>>	m_pCall->addCmplxParameter(Value0,
>>    
>>
>(void*)Axis_Serialize_intArrayType, (void*)Axis_Delete_intArrayType,
>"inputIntArrayType", Axis_URI_intArrayType);
>  
>
>>		if (AXIS_SUCCESS == m_pCall->invoke())
>>		{
>>			if(AXIS_SUCCESS ==
>>    
>>
>m_pCall->checkMessage("echoIntArrayResponse",
>"http://soapinterop.org/"))
>  
>
>>			{
>>				pReturn =
>>    
>>
>(intArrayType*)m_pCall->getCmplxObject((void*)
>Axis_DeSerialize_intArrayType, (void*) Axis_Create_intArrayType, (void*)
>Axis_Delete_intArrayType,"_return", 0);
>  
>
>>		}
>>		}
>>	m_pCall->unInitialize();
>>		return pReturn;
>>	}
>>	catch(AxisException& e)
>>	{
>>		int iExceptionCode = e.getExceptionCode();
>>		if(AXISC_NODE_VALUE_MISMATCH_EXCEPTION !=
>>    
>>
>iExceptionCode)
>  
>
>>		{
>>			throw SoapFaultException(e);
>>		}
>>		ISoapFault* pSoapFault = (ISoapFault*)
>>
>>    
>>
>m_pCall->checkFault("Fault","http://localhost/axis/arrayPS" );
>  
>
>>		if(pSoapFault)
>>		{
>>			m_pCall->unInitialize();
>>			throw SoapFaultException(e);
>>		}
>>		else throw;
>>	}
>>}
>>
>> 
>>
>>-----------------------------------------------------------------------
>>    
>>
>-
>  
>
>>/*
>>* This file was auto-generated by the Axis C++ Web Service Generator
>>    
>>
>(WSDL2Ws)
>  
>
>>* This file contains Client Stub Class for remote web service 
>>*/
>>
>>#if !defined(__ARRAYTESTPORTTYPE_CLIENTSTUB_H__INCLUDED_)
>>#define __ARRAYTESTPORTTYPE_CLIENTSTUB_H__INCLUDED_
>>
>>#include <axis/client/Stub.hpp>
>>#include <axis/SoapFaultException.hpp>
>>#include <axis/ISoapFault.hpp>
>>AXIS_CPP_NAMESPACE_USE
>>#include "intArrayType.hpp"
>>
>>class ArrayTestPortType :public Stub
>>{
>>public:
>>	STORAGE_CLASS_INFO ArrayTestPortType(const char* pchEndpointUri,
>>    
>>
>AXIS_PROTOCOL_TYPE eProtocol=APTHTTP1_1);
>  
>
>>	STORAGE_CLASS_INFO ArrayTestPortType();
>>public:
>>	STORAGE_CLASS_INFO virtual ~ArrayTestPortType();
>>public: 
>>	STORAGE_CLASS_INFO intArrayType* echoIntArray(intArrayType*
>>    
>>
>Value0);
>  
>
>>};
>>
>>#endif /* !defined(__ARRAYTESTPORTTYPE_CLIENTSTUB_H__INCLUDED_)*/
>> 
>>
>>-----------------------------------------------------------------------
>>    
>>
>-
>  
>
>>/*
>>* Copyright 2003-2004 The Apache Software Foundation.
>>
>>*
>>* Licensed under the Apache License, Version 2.0 (the "License");
>>* you may not use this file except in compliance with the License.
>>* You may obtain a copy of the License at
>>*
>>*		http://www.apache.org/licenses/LICENSE-2.0
>>*
>>* Unless required by applicable law or agreed to in writing, software
>>* distributed under the License is distributed on an "AS IS" BASIS,
>>* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>>    
>>
>implied.
>  
>
>>* See the License for the specific language governing permissions and
>>* limitations under the License.
>>*
>>* This file was auto-generated by the Axis C++ Web Service Generator
>>    
>>
>(WSDL2Ws)
>  
>
>>* This file contains functions to manipulate complex type intArrayType
>>*/
>>
>>#include "intArrayType.hpp"
>>#include <axis/AxisWrapperAPI.hpp>
>>#include <iostream>
>>
>>using namespace std;
>>
>>xsd__int_Array intArrayType::getintItem()
>>{
>>	return intItem ; 
>>}
>>
>>void intArrayType::setintItem(xsd__int_Array InValue)
>>{
>>	intItem = InValue ; 
>>}
>>/*
>>* This static method serialize a intArrayType type of object
>>*/
>>int Axis_Serialize_intArrayType(intArrayType* param,
>>    
>>
>IWrapperSoapSerializer* pSZ, bool bArray = false)
>  
>
>>{
>>	if (bArray)
>>	{
>>		pSZ->serialize("<", Axis_TypeName_intArrayType, ">",
>>    
>>
>NULL);
>  
>
>>	}
>>	else
>>	{
>>		bool blnIsNewPrefix = false;
>>		const AxisChar* sPrefix =
>>    
>>
>pSZ->getNamespacePrefix(Axis_URI_intArrayType, blnIsNewPrefix);
>  
>
>>		if (!blnIsNewPrefix)
>>		{
>>			pSZ->serialize("<", Axis_TypeName_intArrayType,
>>    
>>
>" xsi:type=\"", sPrefix, ":",
>  
>
>>				Axis_TypeName_intArrayType, "\">",
>>    
>>
>NULL);
>  
>
>>		}
>>		else
>>		{
>>			pSZ->serialize("<", Axis_TypeName_intArrayType,
>>    
>>
>" xsi:type=\"", sPrefix, ":",
>  
>
>>				Axis_TypeName_intArrayType, "\" xmlns:",
>>    
>>
>sPrefix, "=\"",
>  
>
>>				Axis_URI_intArrayType, "\">", NULL);
>>		}
>>	}
>>
>>	pSZ->serializeBasicArray((Axis_Array*)(&param->intItem),XSD_INT,
>>    
>>
>"intItem");
>  
>
>>	pSZ->serialize("</", Axis_TypeName_intArrayType, ">", NULL);
>>	return AXIS_SUCCESS;
>>}
>>
>>/*
>>* This static method deserialize a intArrayType type of object
>>*/
>>int Axis_DeSerialize_intArrayType(intArrayType* param,
>>    
>>
>IWrapperSoapDeSerializer* pIWSDZ)
>  
>
>>{
>>	//printf("\n The attribute is
>>    
>>
>%s",pIWSDZ->getAttributeAsString("ref",0));
>  
>
>>	param->intItem = (xsd__int_Array&)pIWSDZ->getBasicArray(XSD_INT,
>>    
>>
>"intItem",0);
>  
>
>>	return pIWSDZ->getStatus();
>>}
>>void* Axis_Create_intArrayType(intArrayType* pObj, bool bArray = false,
>>    
>>
>int nSize=0)
>  
>
>>{
>>	if (bArray && (nSize > 0))
>>	{
>>		if (pObj)
>>		{
>>			intArrayType* pNew = new intArrayType[nSize];
>>			memcpy(pNew, pObj,
>>    
>>
>sizeof(intArrayType)*nSize/2);
>  
>
>>			memset(pObj, 0, sizeof(intArrayType)*nSize/2);
>>			delete [] pObj;
>>			return pNew;
>>		}
>>		else
>>		{
>>			return new intArrayType[nSize];
>>		}
>>	}
>>	else
>>		return new intArrayType;
>>}
>>
>>/*
>>* This static method delete a intArrayType type of object
>>*/
>>void Axis_Delete_intArrayType(intArrayType* param, bool bArray = false,
>>    
>>
>int nSize=0)
>  
>
>>{
>>	if (bArray)
>>	{
>>		delete [] param;
>>	}
>>	else
>>	{
>>		delete param;
>>	}
>>}
>>/*
>>* This static method gives the size of intArrayType type of object
>>*/
>>int Axis_GetSize_intArrayType()
>>{
>>	return sizeof(intArrayType);
>>}
>>
>>intArrayType::intArrayType()
>>{
>>	/*do not allocate memory to any pointer members here
>>	 because deserializer will allocate memory anyway. */
>>	intItem.m_Array = 0;
>>	intItem.m_Size = 0;
>>}
>>
>>intArrayType::~intArrayType()
>>{
>>	/*delete any pointer and array members here*/
>>	delete [] ((xsd__int*)intItem.m_Array);
>>}
>> 
>>
>>-----------------------------------------------------------------------
>>    
>>
>-
>  
>
>>/*
>>* Copyright 2003-2004 The Apache Software Foundation.
>>
>>*
>>* Licensed under the Apache License, Version 2.0 (the "License");
>>* you may not use this file except in compliance with the License.
>>* You may obtain a copy of the License at
>>*
>>*		http://www.apache.org/licenses/LICENSE-2.0
>>*
>>* Unless required by applicable law or agreed to in writing, software
>>* distributed under the License is distributed on an "AS IS" BASIS,
>>* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>>    
>>
>implied.
>  
>
>>* See the License for the specific language governing permissions and
>>* limitations under the License.
>>*
>>* This file was auto-generated by the Axis C++ Web Service Generator
>>    
>>
>(WSDL2Ws)
>  
>
>>* This file contains functions to manipulate complex type intArrayType
>>*/
>>
>>#if !defined(__INTARRAYTYPE_PARAM_H__INCLUDED_)
>>#define __INTARRAYTYPE_PARAM_H__INCLUDED_
>>
>>#include <axis/AxisUserAPI.hpp>
>>AXIS_CPP_NAMESPACE_USE 
>>
>>/*Local name and the URI for the type*/
>>static const char* Axis_URI_intArrayType =
>>    
>>
>"http://soapinterop.org/xsd";
>  
>
>>static const char* Axis_TypeName_intArrayType = "intArrayType";
>>
>>class intArrayType
>>{
>>public:
>>	xsd__int_Array	intItem;
>>
>>	xsd__int_Array getintItem();
>>	void setintItem(xsd__int_Array InValue);
>>
>>	intArrayType();
>>	virtual ~intArrayType();
>>};
>>
>>#endif /* !defined(__INTARRAYTYPE_PARAM_H__INCLUDED_)*/
>> 
>>
>>    
>>
>
>
>
>  
>


Mime
View raw message