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 Sameer Pokarna <sp...@amberpoint.com> on 2007/09/28 14:41:49 UTC

Bug found, and proposed fix

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

 

 


RE: Bug found, and proposed fix

Posted by Sameer Pokarna <sp...@amberpoint.com>.
Tom,

 

Bug is already filed (jira-2699). I have attached the Types.java as
attachment, with the change as suggested in this email, and the bug.

I hope this fix is fine, and it gets in to the main codeline soon.

 

 

Regards,

Sameer

 

 

> -----Original Message-----

> From: Tom Jordahl [mailto:tjordahl@adobe.com]

> Sent: Tuesday, October 09, 2007 3:26 AM

> To: axis-dev@ws.apache.org; Sameer Pokarna

> Subject: RE: Bug found, and proposed fix

> 

> Sameer,

> 

> Please file a bug with a patch (diff format) in JIRA. Otherwise I am

> afraid this good information will get lost.

> 

> See http://ws.apache.org/axis/bugs.html

> 

> Thanks!

> 

> --

> Tom Jordahl

> 

> ________________________________________

> From: Sameer Pokarna [mailto:spokarna@amberpoint.com]

> Sent: Friday, September 28, 2007 8:42 AM

> To: axis-dev@ws.apache.org

> Subject: Bug found, and proposed fix

> 

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

> 

> 

> 

> ---------------------------------------------------------------------

> To unsubscribe, e-mail: axis-dev-unsubscribe@ws.apache.org

> For additional commands, e-mail: axis-dev-help@ws.apache.org

 


RE: Bug found, and proposed fix

Posted by Tom Jordahl <tj...@adobe.com>.
Sameer,

Please file a bug with a patch (diff format) in JIRA. Otherwise I am afraid this good information will get lost.

See http://ws.apache.org/axis/bugs.html

Thanks!

--
Tom Jordahl

________________________________________
From: Sameer Pokarna [mailto:spokarna@amberpoint.com] 
Sent: Friday, September 28, 2007 8:42 AM
To: axis-dev@ws.apache.org
Subject: Bug found, and proposed fix

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



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