Hi,
We use Axis 1.3 for generating WSDL for Java classes. I found a bug while
generating a WSDL for the enclosed class (MultipleEnumeration.java).
When I compile this class and run this against the Java2WSDL utility, I get
the wsdl as attached (MultipleEnumerationIncorrect.wsdl). I am also
attaching a correct WSDL after making the fix.
Bug:
The WSDL is not using xsd:anyType for one of the Enumeration fields. The
schema for http://util.java <http://util.java/> is missing too leading to
an incorrect WSDL.
The bug seems to be in the org.apache.axis.wsdl.fromJava.Types class,
private boolean makeTypeElement(Class type, QName qName, Element
containingElement) method.
The original code looks like this:
// If we've already got this type (because it's a native type or
// because we've already written it), just add the type="" attribute
// (if appropriate) and return.
if (!addToTypesList(qName) && !anonymous) {
if (containingElement != null) {
containingElement.setAttribute("type",
getQNameString(qName));
}
return true;
}
// look up the serializer in the TypeMappingRegistry
SerializerFactory factory;
factory = (SerializerFactory) tm.getSerializer(type, qName);
// If no factory is found, use the BeanSerializerFactory
// if applicable, otherwise issue errors and treat as an anyType
if (factory == null) {
if (isEnumClass(type)) {
factory = new EnumSerializerFactory(type, qName);
} else if (isBeanCompatible(type, true)) {
factory = new BeanSerializerFactory(type, qName);
} else {
return false;
}
}
// factory is not null
Serializer ser = (Serializer)
factory.getSerializerAs(Constants.AXIS_SAX);
// if we can't get a serializer, that is bad.
if (ser == null) {
throw new AxisFault(Messages.getMessage("NoSerializer00",
type.getName()));
}
Element typeEl;
try {
typeEl = ser.writeSchema(type, this);
} catch (Exception e) {
throw AxisFault.makeFault(e);
}
Here, please note that the types list is constructed before checking if a
factory exists for the type. For some types which result in anyType, the
subsequent code returns false, and the schema for it is not written.
Fix:
The fix for this is to add the type to the typed list only if the factory is
found for the class under consideration, and before the schema is written.
So, the code will look like this.
// look up the serializer in the TypeMappingRegistry
SerializerFactory factory;
factory = (SerializerFactory) tm.getSerializer(type, qName);
// If no factory is found, use the BeanSerializerFactory
// if applicable, otherwise issue errors and treat as an anyType
if (factory == null) {
if (isEnumClass(type)) {
factory = new EnumSerializerFactory(type, qName);
} else if (isBeanCompatible(type, true)) {
factory = new BeanSerializerFactory(type, qName);
} else {
return false;
}
}
// If we've already got this type (because it's a native type or
// because we've already written it), just add the type="" attribute
// (if appropriate) and return.
if (!addToTypesList(qName) && !anonymous) {
if (containingElement != null) {
containingElement.setAttribute("type",
getQNameString(qName));
}
return true;
}
// factory is not null
Serializer ser = (Serializer)
factory.getSerializerAs(Constants.AXIS_SAX);
// if we can't get a serializer, that is bad.
if (ser == null) {
throw new AxisFault(Messages.getMessage("NoSerializer00",
type.getName()));
}
Element typeEl;
try {
typeEl = ser.writeSchema(type, this);
} catch (Exception e) {
throw AxisFault.makeFault(e);
}
Any comments are welcome. Of course, I will follow the regular procedure to
report and fix this, but wanted to get any comments before I do that.
Regards,
Sameer
import java.util.Enumeration;
public class MultipleEnumeration
{
EnumDO enum;
public MultipleEnumeration()
{
enum = new EnumDO();
}
public EnumDO getEnum()
{
return enum;
}
}
class EnumDO
{
private Enumeration linkKeys;
private Enumeration linkKeys2;
public EnumDO()
{
}
public Enumeration getLiNkKeys()
{
return linkKeys;
}
public Enumeration getLiNkKeys2()
{
return linkKeys2;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://DefaultNamespace" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://DefaultNamespace" xmlns:intf="http://DefaultNamespace" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns2="http://util.java" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDL created by Apache Axis version: 1.3
Built on Sep 28, 2007 (03:18:31 IST)-->
<wsdl:types>
<schema targetNamespace="http://DefaultNamespace" xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://util.java"/>
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<complexType name="EnumDO">
<sequence>
<element name="liNkKeys" nillable="true" type="xsd:anyType"/>
<element name="liNkKeys2" nillable="true" type="tns2:Enumeration"/>
</sequence>
</complexType>
</schema>
</wsdl:types>
<wsdl:message name="getEnumResponse">
<wsdl:part name="getEnumReturn" type="impl:EnumDO"/>
</wsdl:message>
<wsdl:message name="getEnumRequest">
</wsdl:message>
<wsdl:portType name="MultipleEnumeration">
<wsdl:operation name="getEnum">
<wsdl:input message="impl:getEnumRequest" name="getEnumRequest"/>
<wsdl:output message="impl:getEnumResponse" name="getEnumResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="abcSoapBinding" type="impl:MultipleEnumeration">
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getEnum">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getEnumRequest">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://DefaultNamespace" use="encoded"/>
</wsdl:input>
<wsdl:output name="getEnumResponse">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://DefaultNamespace" use="encoded"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="MultipleEnumerationService">
<wsdl:port binding="impl:abcSoapBinding" name="abc">
<wsdlsoap:address location="http://host:port/abc"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://DefaultNamespace" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://DefaultNamespace" xmlns:intf="http://DefaultNamespace" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDL created by Apache Axis version: 1.3
Built on Sep 28, 2007 (03:18:31 IST)-->
<wsdl:types>
<schema targetNamespace="http://DefaultNamespace" xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<complexType name="EnumDO">
<sequence>
<element name="liNkKeys" nillable="true" type="xsd:anyType"/>
<element name="liNkKeys2" nillable="true" type="xsd:anyType"/>
</sequence>
</complexType>
</schema>
</wsdl:types>
<wsdl:message name="getEnumResponse">
<wsdl:part name="getEnumReturn" type="impl:EnumDO"/>
</wsdl:message>
<wsdl:message name="getEnumRequest">
</wsdl:message>
<wsdl:portType name="MultipleEnumeration">
<wsdl:operation name="getEnum">
<wsdl:input message="impl:getEnumRequest" name="getEnumRequest"/>
<wsdl:output message="impl:getEnumResponse" name="getEnumResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="abcSoapBinding" type="impl:MultipleEnumeration">
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getEnum">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getEnumRequest">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://DefaultNamespace" use="encoded"/>
</wsdl:input>
<wsdl:output name="getEnumResponse">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://DefaultNamespace" use="encoded"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="MultipleEnumerationService">
<wsdl:port binding="impl:abcSoapBinding" name="abc">
<wsdlsoap:address location="http://host:port/abc"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]