You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by "Andreas Vollmy (JIRA)" <ji...@apache.org> on 2012/11/22 09:54:59 UTC

[jira] [Commented] (AXIS2-5443) WSDL2C: incomplete code in axis2_extension_mapper.c for xsd choice type

    [ https://issues.apache.org/jira/browse/AXIS2-5443?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13502656#comment-13502656 ] 

Andreas Vollmy commented on AXIS2-5443:
---------------------------------------

I had a very similar problem, possibly same cause: AXIS2-5457
                
> WSDL2C: incomplete code in axis2_extension_mapper.c for xsd choice type
> -----------------------------------------------------------------------
>
>                 Key: AXIS2-5443
>                 URL: https://issues.apache.org/jira/browse/AXIS2-5443
>             Project: Axis2
>          Issue Type: Bug
>          Components: codegen, databinding
>    Affects Versions: 1.6.0, 1.6.1, 1.6.2
>         Environment: MacOS X 10.7.5
> $ java -version
> java version "1.6.0_37"
> Java(TM) SE Runtime Environment (build 1.6.0_37-b06-434-11M3909)
> Java HotSpot(TM) 64-Bit Server VM (build 20.12-b01-434, mixed mode)
>            Reporter: Jürgen Keil
>             Fix For: 1.5.6
>
>         Attachments: bug.wsdl, bug.xml, bug.xsd, test.c
>
>
> I'm trying to build an ANSI C xml (de)serializer for an xml schema using axis2c and axis2.
> The xml schema contains serveral choice elements.
> The xml deserializer build by axis2 WSDL2C has problems parsing these choice elements.
> The root cause is missing internal choice types in the generated axis2_extension_mapper.c file.
> Here's an example which reproduces the problem:
> bug.xsd schema file (contains a choice element)
> --------------------------------------------------------------------------------
> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
> <xs:schema xmlns="urn:axis2:choice:bug" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:axis2:choice:bug">
>     <xs:element name="Document" type="Document"/>
>     <xs:complexType name="Document">
>         <xs:sequence>
>             <xs:choice>
>                 <xs:element name="IBAN" type="IBAN2007Identifier"/>
>                 <xs:element name="Othr" type="GenericAccountIdentification1"/>
>             </xs:choice>
>         </xs:sequence>
>     </xs:complexType>
>     <xs:complexType name="GenericAccountIdentification1">
>         <xs:sequence>
>             <xs:element name="Id" type="Max34Text"/>
>         </xs:sequence>
>     </xs:complexType>
>     <xs:simpleType name="IBAN2007Identifier">
>         <xs:restriction base="xs:string">
>             <xs:pattern value="[A-Z]{2,2}[0-9]{2,2}[a-zA-Z0-9]{1,30}"/>
>         </xs:restriction>
>     </xs:simpleType>
>     <xs:simpleType name="Max34Text">
>         <xs:restriction base="xs:string">
>             <xs:minLength value="1"/>
>             <xs:maxLength value="34"/>
>         </xs:restriction>
>     </xs:simpleType>
> </xs:schema>
> --------------------------------------------------------------------------------
> bug.wsdl, references the bug.xsd schema file
> --------------------------------------------------------------------------------
> <definitions targetNamespace="http://localhost/bug/wsdl"
> 	xmlns="http://schemas.xmlsoap.org/wsdl/" 
> 	xmlns:tns="http://localhost/bug/wsdl"
> 	xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
> 	xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
> 	xmlns:types="urn:axis2:choice:bug"
> 	>
> 	<import namespace="urn:axis2:choice:bug" location="bug.xsd" />
> 	<message name="getReq">
> 		<part name="parameters" element="types:Document" />
> 	</message>
> 	<message name="getResp">
> 		<part name="parameters" element="types:Document" />
> 	</message>
> 	<portType name="PortType">
> 		<operation name="get">
> 			<input message="tns:getReq" />
> 			<output message="tns:getResp" />
> 		</operation>
> 	</portType>
> 	<binding name="SOAPBinding" type="tns:PortType">
> 		<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
> 		<operation name="get">
> 			<soap:operation style="document" soapAction="get" />
> 			<input>
> 				<soap:body use="literal" />
> 			</input>
> 			<output>
> 				<soap:body use="literal" />
> 			</output>
> 		</operation>
> 	</binding>
> 	<service name="Service">
> 		<port name="SOAPPort" binding="tns:SOAPBinding">
> 			<soap:address location="http://localhost:8080/axis2/services/Service" />
> 		</port>
> 	</service>
> </definitions>
> --------------------------------------------------------------------------------
> And a sample xml document, bug.xml
> --------------------------------------------------------------------------------
> <Document xmlns="urn:axis2:choice:bug" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:axis2:choice:bug bug.xsd">
> <IBAN>DE1234</IBAN>
> </Document>
> --------------------------------------------------------------------------------
> Now I generate the ANSI C xml (de)serializer code using WSDL2C,
> axis2c-bin-1.7.0-linux/bin/tools/wsdl2c/WSDL2C.sh -uri bug.wsdl -d adb -u -S bug
> And finally a simple test program to call the generated xml deserializer for the <Document> root element:
> --------------------------------------------------------------------------------
> #include <stdio.h>
> #include <axiom.h>
> #include <axis2_util.h>
> #include <axiom_stax_builder.h>
> #include "adb_Document.h"
> int
> main(int argc, char **argv)
> {
> 	char *filename = "bug.xml";
> 	const axutil_env_t *env = NULL;
> 	axis2_status_t st;
>         axiom_node_t* parent = NULL;
> 	axis2_bool_t is_early_node_valid;
> 	axiom_xml_reader_t *parser;
> 	axiom_stax_builder_t *builder;
> 	axiom_document_t *doc;
>         adb_Document_t* Document;
> 	
> 	env = axutil_env_create_all("/tmp/axis.log", AXIS2_LOG_LEVEL_TRACE);
> 	if (argv[1] != NULL)
> 		filename = argv[1];
> 	parser = axiom_xml_reader_create_for_file(env, filename, AXIS2_UTF_8);
> 	if (parser == NULL) {
> 		fprintf(stderr, "failed to create parser for %s\n", filename);
> 		exit(1);
> 	}
> 	builder = axiom_stax_builder_create(env, parser);
> 	doc = axiom_stax_builder_get_document(builder, env);
> 	parent = axiom_document_get_root_element(doc, env);
> 	Document = adb_Document_create(env);
>         st = adb_Document_deserialize(Document, env, &parent, &is_early_node_valid, 0);
> 	if (st == AXIS2_SUCCESS)
> 		printf("OK\n");
> 	else
> 		printf("status=%d\n", st),
> 	exit(0);
> }
> --------------------------------------------------------------------------------
> The parser fails with the following error message:
> $ cat /tmp/axis.log 
> [Sun Oct 28 15:15:36 2012] [error] adb_Document.c(263) failed in building adb object for element DocumentChoice_type0
> [Sun Oct 28 15:15:36 2012] [error] adb_Document.c(273) failed in setting the value for DocumentChoice_type0 
> When I look at the generated axis2_extension_mapper.c file, I notice that there are several places
> that handle the "adb_Document" type, but the internal "adb_DocumentChoice_type0" type is missing.
> As soon as I manually add "adb_DocumentChoice_type0" to the generated file
> axis2_extension_mapper.c I get a working xml deserializer.
> Workaround:  Use axis2 1.5.6 - the old axis2 1.5.6 WSDL2C is able to produce a working xml
> deserializer

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

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