axis-c-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Michael Xiong (JIRA)" <axis-c-...@ws.apache.org>
Subject [jira] Commented: (AXISCPP-1017) WSDL2Ws tool has serious problem when processing the schema: unbounded choice inside sequence
Date Thu, 25 Jan 2007 09:27:49 GMT

    [ https://issues.apache.org/jira/browse/AXISCPP-1017?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12467300
] 

Michael Xiong commented on AXISCPP-1017:
----------------------------------------

I'd like to add more comment on 'unbounded choice inside sequence' ,  so that make it much
easy to understand.

>From the same example which I put on the above description,
the 'unbounded choice inside sequence' means the below schema("AddFooResponse"):
...
 <xsd:element name="AddFooResponse"
type="usr:AddFooResponse" />
<xsd:complexType name="AddFooResponse">
<xs:sequence>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Foo" type="usr:Foo" />
<xs:element name="Fault" type="mgt:Fault" />
</xs:choice>
</xs:sequence>
</xsd:complexType>
...

>From the above schema, inside the sequence "AddFooResponse", there are two kind of repeatable
element: "Foo" and "Fault. Please notice that It means two kind of repeatable objects, not
two objects.

"AddFooResponse" is a sequence which contains two kind of repeatable objects, in detail it
contains repeatable "Foo" objects and repeatable "Fault" objects.

So that "AddFooResponse" should contain a Foo_Array and a Fault_Array in skeleton.
In response soap message, it should contain multi Foo objects and multi Fault objects.


> WSDL2Ws tool has serious problem when processing the schema: unbounded choice inside
sequence
> ---------------------------------------------------------------------------------------------
>
>                 Key: AXISCPP-1017
>                 URL: https://issues.apache.org/jira/browse/AXISCPP-1017
>             Project: Axis-C++
>          Issue Type: Bug
>          Components: WSDL processing - Doc
>    Affects Versions:  1.6 Beta
>         Environment: OS:    Linux fedora 3.0
> Axiscpp version:    Server-side Axis C++ 1.6Beta
> XML Parser Lib: xersesc 2.6
> WSDL2ws tool by using axis java 1.4
> Http Server Version: Apache 2.0.53
>            Reporter: Michael Xiong
>            Priority: Critical
>
> When I was developing some web service based on axiscpp1.6b/apache2.0, I found that axiscpp1.6b's
WSDL2Ws tool has serious problem to generate code for one kind of complex composite schema
type: unbounded choice inside sequence.
> I'd like to give a piece of sample schema to replay this problem like the below:
> [FooMan.wsdl/FooMan.xsd]:
> ...	
> 		<xsd:element name="AddFoo" type="usr:AddFoo" />
> 			<xsd:complexType name="AddFoo">
> 				<xs:sequence>
> 					<xs:element minOccurs="1" maxOccurs="unbounded"
> 						name="Foo" type="usr:FooAddRequest" />
> 				</xs:sequence>
> 			</xsd:complexType>
> 			<xsd:element name="AddFooResponse"
> 				type="usr:AddFooResponse" />
> 			<xsd:complexType name="AddFooResponse">
> 				<xs:sequence>
> 					<xs:choice minOccurs="0" maxOccurs="unbounded">
> 						<xs:element name="Foo" type="usr:Foo" />
> 						<xs:element name="Fault" type="mgt:Fault" />
> 					</xs:choice>
> 				</xs:sequence>
> 			</xsd:complexType>
> ...
> The generated code(interface): FooMan.hpp looks like the below:
> ...
> 		void AddFoo(FooAddRequest_Array * Value0, AXIS_OUT_PARAM Foo* * OutValue0, AXIS_OUT_PARAM
Fault* * OutValue1);
> ...
> Though the generated code can be compiled without problem, and even it can be executed
and communicate with some corresponding soap client(only simple & special case) without
problem, but it's not correct according to the syntax definition from it's schema definition.
> For example, the generated code can only support the below case(simple & special
case):
> [Request-1]:
> ...
> <AddFoo xmlns="http://www.foo.bar.com/foo">
> <Foo>
> <FooID>Foo1</FooID>
> <Password>FooPaa1</Password>
> </Foo>
> <Foo>
> <FooID>Foo2</FooID>
> <Password>FooPaa2</Password>
> </Foo>
> </AddFoo>
> ...
> [Response-1]:
> ...
> <AddFooResponse xmlns="http://www.foo.bar.com/foo">
> <Foo>
> <FooID>Foo1</FooID>
> <Index>FooDee1</Index>
> </Foo>
> <Fault>
> <FooID>Foo2</FooID>
> <Reason>WrongPassword</Reason>
> </Fault>
> </AddFooResponse>
> ...
> But the generated code can not support more general & complex case like the below:
> [Request-2]:
> ...
> <AddFoo xmlns="http://www.foo.bar.com/foo">
> <Foo>
> <FooID>Foo1</FooID>
> <Password>FooPaa1</Password>
> </Foo>
> <Foo>
> <FooID>Foo2</FooID>
> <Password>FooPaa2</Password>
> </Foo>
> <Foo>
> <FooID>Foo3</FooID>
> <Password>FooPaa3</Password>
> </Foo>
> <Foo>
> <FooID>Foo4</FooID>
> <Password>FooPaa4</Password>
> </Foo>
> </AddFoo>
> ...
> [Response-2]:
> ...
> <AddFooResponse xmlns="http://www.foo.bar.com/foo">
> <Foo>
> <FooID>Foo1</FooID>
> <Index>FooDee1</Index>
> </Foo>
> <Foo>
> <FooID>Foo2</FooID>
> <Index>FooDee2</Index>
> </Foo>
> <Fault>
> <FooID>Foo3</FooID>
> <Reason>WrongPassword</Reason>
> </Fault>
> <Fault>
> <FooID>Foo4</FooID>
> <Reason>UnknowError</Reason>
> </Fault>
> </AddFooResponse>
> ...
> The key-point for this problem is that, in C++ implementation, the "AddFooResponse" should
be regarded as two complex arrays, not two simple objects.
> In order to let my web service work strictly like what the wsdl and schema defined, I
have to correct the generated FooMan.hpp(and of course the corresponding FooMan.cpp) like
the below:
> [FooMan.hpp]:
> ...
> //<-+ mxiong 2007/1/24 Modify "AddFoo" to fix schema problem
> //		void AddFoo(FooAddRequest_Array * Value0, AXIS_OUT_PARAM Foo* * OutValue0, AXIS_OUT_PARAM
Fault* * OutValue1);
> 		void AddFoo(FooAddRequest_Array * Value0, AXIS_OUT_PARAM Foo_Array & OutValue0,
AXIS_OUT_PARAM Fault_Array & OutValue1);
> //>-+ mxiong 2007/1/24 Modify "AddFoo" to fix schema problem
> ...
> To let the above modification to work correctly, the FooManWrapper.cpp also need to be
modified like the below:
> [FooManWrapper.cpp]:
> ...
> int FooManWrapper::AddFoo(void* pMsg)
> {
> 	IMessageData* mc = (IMessageData*)pMsg;
> 	int nStatus;
> 	IWrapperSoapSerializer* pIWSSZ = NULL;
> 	mc->getSoapSerializer(&pIWSSZ);
> 	if (!pIWSSZ)
> 	{
> 		return AXIS_FAIL;
> 	}
> 	IWrapperSoapDeSerializer* pIWSDZ = NULL;
> 	mc->getSoapDeSerializer(&pIWSDZ);
> 	if (!pIWSDZ)
> 	{
> 		return AXIS_FAIL;
> 	}
> 	/* check whether we have got correct message */
> 	if (AXIS_SUCCESS != pIWSDZ->checkMessageBody("AddFoo", "http://www.fujixerox.co.jp/2003/12/ssm/management/user"))
> 	{
> 		return AXIS_FAIL;
> 	}
> 	pIWSSZ->createSoapMethod("AddFooResponse", "http://www.fujixerox.co.jp/2003/12/ssm/management/user");
> 	FooAddRequest_Array * v0 = new FooAddRequest_Array();
> 	pIWSDZ->getCmplxArray(v0, (void*)Axis_DeSerialize_FooAddRequest,
> 		(void*)Axis_Create_FooAddRequest, (void*)Axis_Delete_FooAddRequest,
> 		(void*)Axis_GetSize_FooAddRequest, "Foo", Axis_URI_FooAddRequest);
> 	if (AXIS_SUCCESS != (nStatus = pIWSDZ->getStatus()))
> 	{
> 		return nStatus;
> 	}
> //<-+ mxiong 2007/1/24 Modify "AddFoo" to fix schema problem
> //	Foo* out0;
> //	Fault* out1;
> //	try
> //	{
> //	pWs->AddFoo(v0,&out0,&out1);
> //	pIWSSZ->addOutputCmplxParam(out0, (void*)Axis_Serialize_Foo, (void*)Axis_Delete_Foo,
"Foo", Axis_URI_Foo);
> //	pIWSSZ->addOutputCmplxParam(out1, (void*)Axis_Serialize_Fault, (void*)Axis_Delete_Fault,
"Fault", Axis_URI_Fault);
> //	return AXIS_SUCCESS;
> //	}
> //	catch(...)
> //	{
> //		return AXIS_FAIL;
> //	}
> 	Foo_Array out0;
> 	Fault_Array out1;
> 	try
> 	{
> 	pWs->AddFoo(v0,out0,out1);
> 	pIWSSZ->addOutputCmplxArrayParam(&out0,(void*) Axis_Serialize_Foo, (void*) Axis_Delete_Foo,
(void*) Axis_GetSize_Foo, "Foo", Axis_URI_Foo);
> 	pIWSSZ->addOutputCmplxArrayParam(&out1,(void*) Axis_Serialize_Fault, (void*)
Axis_Delete_Fault, (void*) Axis_GetSize_Fault, "Fault", Axis_URI_Fault);
> 	return AXIS_SUCCESS;
> 	}
> 	catch(...)
> 	{
> 		return AXIS_FAIL;
> 	}
> //>-+ mxiong 2007/1/24 Modify "AddFoo" to fix schema problem
> }
> ...
> P.S. Because the necessary class Fault_Array.hpp/.cpp was not generated by WSDL2Ws tool,
I also have to write the necessary class manually.
> After modifying FooMan.hpp/.cpp and FooManWrapper.cpp, adding necessary class, my web
service can work strictly like the wsdl & schema defined.
> Though I have modified the generated code manually to let my web service to strictly
follow the wsdl and schema definition, the more general solution should be to modify the WSDL2Ws
tool to processing the related wsdl and schema definition correctly.
> Could some one to take an eye on this problem and take necessary modification to WSDL2Ws
tool?

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


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


Mime
View raw message