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]
