[ 
https://issues.apache.org/jira/browse/AXIS2-4607?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Holger King updated AXIS2-4607:
-------------------------------

    Description: 
When having a WSDL containing a Map (referencing 0..* MapItem) datatype that is 
used in some messages (here in "listObjects"):

...
<wsdl:types>
    <schema xmlns="http://www.w3.org/2001/XMLSchema"; 
targetNamespace="http://xml.apache.org/xml-soap";>
        <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
        <complexType name="mapItem">
            <sequence>
                <element name="key" nillable="true" type="xsd:anyType"/>
                <element name="value" nillable="true" type="xsd:anyType"/>
            </sequence>
        </complexType>
        <complexType name="Map">
            <sequence>
                <element name="item" minOccurs="0" maxOccurs="unbounded" 
type="apachesoap:mapItem"/>
            </sequence>
        </complexType>
    </schema>
</wsdl:types>
<wsdl:message name="listObjectsRequest">
    <wsdl:part name="in0" type="xsd:string"/>
    <wsdl:part name="in1" type="apachesoap:Map"/>
    <wsdl:part name="in2" type="xsd:string"/>
    <wsdl:part name="in3" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="listObjectsResponse">
    <wsdl:part name="listObjectsReturn" type="apachesoap:Map"/>
</wsdl:message>
<wsdl:portType name="IdentityService">
    <wsdl:operation name="listObjects" parameterOrder="in0 in1 in2 in3">
        <wsdl:input name="listObjectsRequest" 
message="impl:listObjectsRequest"/>
        <wsdl:output name="listObjectsResponse" 
message="impl:listObjectsResponse"/>
    </wsdl:operation>
</wsdl:portType>
...

the "WSDL2JAVA" codegenerator creates following classes "ListObjects.java" and 
"Map.java":

"ListObjects.java" calls the "parse(reader)" method of the statis inner class 
of the generated "Map.java":
...
while (!reader.isStartElement() && !reader.isEndElement())
    reader.next();
    if (reader.isStartElement() && new 
javax.xml.namespace.QName("","in1").equals(reader.getName())) {
        object.setIn1(com.bosch.fs.idm.axis2.types.Map.Factory.parse(reader));
        reader.next();
}  // End of if for expected property start element
...


generated class "*Map.java*" where the if-condition is never true (according to 
the below SOAP-Request!!!)
...
if (reader.isStartElement() && new 
javax.xml.namespace.QName("","item").equals(reader.getName())) {
    // Process the array and step past its final element's end.
    list1.add(com.bosch.fs.idm.axis2.types.MapItem.Factory.parse(reader));
                                                                
    //loop until we find a start element that is not part of this array
    boolean loopDone1 = false;
    while(!loopDone1) {
        // We should be at the end element, but make sure
        while (!reader.isEndElement())
            reader.next();
        // Step out of this element
        reader.next();
        // Step to next element event.
        while (!reader.isStartElement() && !reader.isEndElement())
            reader.next();
        if (reader.isEndElement()) {
            //two continuous end elements means we are exiting the xml structure
            loopDone1 = true;
        } else {
            if (new 
javax.xml.namespace.QName("","item").equals(reader.getName())) {
                
list1.add(com.bosch.fs.idm.axis2.types.MapItem.Factory.parse(reader));
            } else {
                loopDone1 = true;
            }
        }
    }
    // call the converter utility  to convert and set the array
    object.setItem((com.bosch.fs.idm.axis2.types.MapItem[])
    
org.apache.axis2.databinding.utils.ConverterUtil.convertToArray(com.bosch.fs.idm.axis2.types.MapItem.class,
 list1));
}
...

A SOAP-Request for the "listObjects" operation:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
        <soapenv:Body>
                <ns1:listObjects 
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
                        xmlns:ns1="urn:webservice.test.com">
                        <in0 xsi:type="xsd:string">ROLES</in0>
                        <in1 href="#id0" />
                        <in2 xsi:type="xsd:string">test</in2>
                        <in3 xsi:type="xsd:string">test</in3>
                </ns1:listObjects>
                <multiRef id="id0" soapenc:root="0"
                        
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
                        xsi:type="ns2:Map" 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/";
                        xmlns:ns2="http://xml.apache.org/xml-soap";>
                        <item>
                                <key 
xsi:type="soapenc:string">searchFilter</key>
                                <value href="#id1" />
                        </item>
                </multiRef>
                <multiRef id="id1" soapenc:root="0"
                        
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
                        xsi:type="ns3:Map" 
xmlns:ns3="http://xml.apache.org/xml-soap";
                        
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/";>
                        <item>
                                <key xsi:type="soapenc:string">role</key>
                                <value xsi:type="soapenc:string">*</value>
                        </item>
                </multiRef>
        </soapenv:Body>
</soapenv:Envelope>

  was:
When having a WSDL containing a Map (referencing 0..* MapItem) datatype that is 
used in some messages (here in "listObjects"):

...
<wsdl:types>
    <schema xmlns="http://www.w3.org/2001/XMLSchema"; 
targetNamespace="http://xml.apache.org/xml-soap";>
        <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
        <complexType name="mapItem">
            <sequence>
                <element name="key" nillable="true" type="xsd:anyType"/>
                <element name="value" nillable="true" type="xsd:anyType"/>
            </sequence>
        </complexType>
        <complexType name="Map">
            <sequence>
                <element name="item" minOccurs="0" maxOccurs="unbounded" 
type="apachesoap:mapItem"/>
            </sequence>
        </complexType>
    </schema>
</wsdl:types>
<wsdl:message name="listObjectsRequest">
    <wsdl:part name="in0" type="xsd:string"/>
    <wsdl:part name="in1" type="apachesoap:Map"/>
    <wsdl:part name="in2" type="xsd:string"/>
    <wsdl:part name="in3" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="listObjectsResponse">
    <wsdl:part name="listObjectsReturn" type="apachesoap:Map"/>
</wsdl:message>
<wsdl:portType name="IdentityService">
    <wsdl:operation name="listObjects" parameterOrder="in0 in1 in2 in3">
        <wsdl:input name="listObjectsRequest" 
message="impl:listObjectsRequest"/>
        <wsdl:output name="listObjectsResponse" 
message="impl:listObjectsResponse"/>
    </wsdl:operation>
</wsdl:portType>
...

the "WSDL2JAVA" codegenerator creates following classes "ListObjects.java" and 
"Map.java":

generated class "*ListObjects.java*" calls the "parse(reader)" method of the 
statis inner class of the generated "Map.java":
...
while (!reader.isStartElement() && !reader.isEndElement())
    reader.next();
    if (reader.isStartElement() && new 
javax.xml.namespace.QName("","in1").equals(reader.getName())) {
        object.setIn1(com.bosch.fs.idm.axis2.types.Map.Factory.parse(reader));
        reader.next();
}  // End of if for expected property start element
...


generated class "*Map.java*":
...
if (reader.isStartElement() && new 
javax.xml.namespace.QName("","item").equals(reader.getName())) {
    // Process the array and step past its final element's end.
    list1.add(com.bosch.fs.idm.axis2.types.MapItem.Factory.parse(reader));
                                                                
    //loop until we find a start element that is not part of this array
    boolean loopDone1 = false;
    while(!loopDone1) {
        // We should be at the end element, but make sure
        while (!reader.isEndElement())
            reader.next();
        // Step out of this element
        reader.next();
        // Step to next element event.
        while (!reader.isStartElement() && !reader.isEndElement())
            reader.next();
        if (reader.isEndElement()) {
            //two continuous end elements means we are exiting the xml structure
            loopDone1 = true;
        } else {
            if (new 
javax.xml.namespace.QName("","item").equals(reader.getName())) {
                
list1.add(com.bosch.fs.idm.axis2.types.MapItem.Factory.parse(reader));
            } else {
                loopDone1 = true;
            }
        }
    }
    // call the converter utility  to convert and set the array
    object.setItem((com.bosch.fs.idm.axis2.types.MapItem[])
    
org.apache.axis2.databinding.utils.ConverterUtil.convertToArray(com.bosch.fs.idm.axis2.types.MapItem.class,
 list1));
}
...

A SOAP-Request for "listObjects" contains the following structure:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
        <soapenv:Body>
                <ns1:listObjects 
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
                        xmlns:ns1="urn:webservice.test.com">
                        <in0 xsi:type="xsd:string">ROLES</in0>
                        <in1 href="#id0" />
                        <in2 xsi:type="xsd:string">test</in2>
                        <in3 xsi:type="xsd:string">test</in3>
                </ns1:listObjects>
                <multiRef id="id0" soapenc:root="0"
                        
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
                        xsi:type="ns2:Map" 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/";
                        xmlns:ns2="http://xml.apache.org/xml-soap";>
                        <item>
                                <key 
xsi:type="soapenc:string">searchFilter</key>
                                <value href="#id1" />
                        </item>
                </multiRef>
                <multiRef id="id1" soapenc:root="0"
                        
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
                        xsi:type="ns3:Map" 
xmlns:ns3="http://xml.apache.org/xml-soap";
                        
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/";>
                        <item>
                                <key xsi:type="soapenc:string">role</key>
                                <value xsi:type="soapenc:string">*</value>
                        </item>
                </multiRef>
        </soapenv:Body>
</soapenv:Envelope>


The above if-condition in the generated "Map.java"-ADBBean is never true, so 
the object could never be filled with the corresponding entries.

> WSDL2Java generates Java code for databindung (ADBBean) that is never reached 
> when using custom datatypes (Map) within a WSDL
> -----------------------------------------------------------------------------------------------------------------------------
>
>                 Key: AXIS2-4607
>                 URL: https://issues.apache.org/jira/browse/AXIS2-4607
>             Project: Axis2
>          Issue Type: Bug
>          Components: codegen
>    Affects Versions: 1.5.1
>         Environment: Axis2 official release 1.5.1
>            Reporter: Holger King
>            Priority: Blocker
>
> When having a WSDL containing a Map (referencing 0..* MapItem) datatype that 
> is used in some messages (here in "listObjects"):
> ...
> <wsdl:types>
>     <schema xmlns="http://www.w3.org/2001/XMLSchema"; 
> targetNamespace="http://xml.apache.org/xml-soap";>
>         <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
>         <complexType name="mapItem">
>             <sequence>
>                 <element name="key" nillable="true" type="xsd:anyType"/>
>                 <element name="value" nillable="true" type="xsd:anyType"/>
>             </sequence>
>         </complexType>
>         <complexType name="Map">
>             <sequence>
>                 <element name="item" minOccurs="0" maxOccurs="unbounded" 
> type="apachesoap:mapItem"/>
>             </sequence>
>         </complexType>
>     </schema>
> </wsdl:types>
> <wsdl:message name="listObjectsRequest">
>     <wsdl:part name="in0" type="xsd:string"/>
>     <wsdl:part name="in1" type="apachesoap:Map"/>
>     <wsdl:part name="in2" type="xsd:string"/>
>     <wsdl:part name="in3" type="xsd:string"/>
> </wsdl:message>
> <wsdl:message name="listObjectsResponse">
>     <wsdl:part name="listObjectsReturn" type="apachesoap:Map"/>
> </wsdl:message>
> <wsdl:portType name="IdentityService">
>     <wsdl:operation name="listObjects" parameterOrder="in0 in1 in2 in3">
>         <wsdl:input name="listObjectsRequest" 
> message="impl:listObjectsRequest"/>
>         <wsdl:output name="listObjectsResponse" 
> message="impl:listObjectsResponse"/>
>     </wsdl:operation>
> </wsdl:portType>
> ...
> the "WSDL2JAVA" codegenerator creates following classes "ListObjects.java" 
> and "Map.java":
> "ListObjects.java" calls the "parse(reader)" method of the statis inner class 
> of the generated "Map.java":
> ...
> while (!reader.isStartElement() && !reader.isEndElement())
>     reader.next();
>     if (reader.isStartElement() && new 
> javax.xml.namespace.QName("","in1").equals(reader.getName())) {
>         object.setIn1(com.bosch.fs.idm.axis2.types.Map.Factory.parse(reader));
>         reader.next();
> }  // End of if for expected property start element
> ...
> generated class "*Map.java*" where the if-condition is never true (according 
> to the below SOAP-Request!!!)
> ...
> if (reader.isStartElement() && new 
> javax.xml.namespace.QName("","item").equals(reader.getName())) {
>     // Process the array and step past its final element's end.
>     list1.add(com.bosch.fs.idm.axis2.types.MapItem.Factory.parse(reader));
>                                                                 
>     //loop until we find a start element that is not part of this array
>     boolean loopDone1 = false;
>     while(!loopDone1) {
>         // We should be at the end element, but make sure
>         while (!reader.isEndElement())
>             reader.next();
>         // Step out of this element
>         reader.next();
>         // Step to next element event.
>         while (!reader.isStartElement() && !reader.isEndElement())
>             reader.next();
>         if (reader.isEndElement()) {
>             //two continuous end elements means we are exiting the xml 
> structure
>             loopDone1 = true;
>         } else {
>             if (new 
> javax.xml.namespace.QName("","item").equals(reader.getName())) {
>                 
> list1.add(com.bosch.fs.idm.axis2.types.MapItem.Factory.parse(reader));
>             } else {
>                 loopDone1 = true;
>             }
>         }
>     }
>     // call the converter utility  to convert and set the array
>     object.setItem((com.bosch.fs.idm.axis2.types.MapItem[])
>     
> org.apache.axis2.databinding.utils.ConverterUtil.convertToArray(com.bosch.fs.idm.axis2.types.MapItem.class,
>  list1));
> }
> ...
> A SOAP-Request for the "listObjects" operation:
> <?xml version="1.0" encoding="UTF-8"?>
> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";
>       xmlns:xsd="http://www.w3.org/2001/XMLSchema"; 
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
>       <soapenv:Body>
>               <ns1:listObjects 
> soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
>                       xmlns:ns1="urn:webservice.test.com">
>                       <in0 xsi:type="xsd:string">ROLES</in0>
>                       <in1 href="#id0" />
>                       <in2 xsi:type="xsd:string">test</in2>
>                       <in3 xsi:type="xsd:string">test</in3>
>               </ns1:listObjects>
>               <multiRef id="id0" soapenc:root="0"
>                       
> soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
>                       xsi:type="ns2:Map" 
> xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/";
>                       xmlns:ns2="http://xml.apache.org/xml-soap";>
>                       <item>
>                               <key 
> xsi:type="soapenc:string">searchFilter</key>
>                               <value href="#id1" />
>                       </item>
>               </multiRef>
>               <multiRef id="id1" soapenc:root="0"
>                       
> soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
>                       xsi:type="ns3:Map" 
> xmlns:ns3="http://xml.apache.org/xml-soap";
>                       
> xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/";>
>                       <item>
>                               <key xsi:type="soapenc:string">role</key>
>                               <value xsi:type="soapenc:string">*</value>
>                       </item>
>               </multiRef>
>       </soapenv:Body>
> </soapenv:Envelope>

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

Reply via email to