Jürgen Keil created AXIS2-5443:
----------------------------------

             Summary: 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.2, 1.6.1, 1.6.0
         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


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: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to