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:[EMAIL PROTECTED]

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

> To: [email protected]; 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:[EMAIL PROTECTED]

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

> To: [email protected]

> 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: [EMAIL PROTECTED]

> For additional commands, e-mail: [EMAIL PROTECTED]

 

Reply via email to