[
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.