Axis2 wsdl2code code generation bug caused by "localName"
---------------------------------------------------------
Key: AXIS2-4976
URL: https://issues.apache.org/jira/browse/AXIS2-4976
Project: Axis2
Issue Type: Bug
Components: codegen, wsdl
Affects Versions: 1.5.4, 1.4.1
Environment: Java:
java -version
java version "1.6.0_21"
Java(TM) SE Runtime Environment (build 1.6.0_21-b07)
Java HotSpot(TM) Client VM (build 17.0-b17, mixed mode, sharing)
Ant:
ant -version
Apache Ant version 1.8.1 compiled on April 30 2010
Reporter: Barnabás Aszódi
Dear Axis2 Developers,
I am really impressed by your work.
I would like to help you make it even better.
I discovered a bug in axis2 wsdl2code codegeneration method.
It is caused by the "localXXX" naming convention.
If a variable type is defined with name: "name" in the WSDL it causes hidden
bug inside its "serialize" method.
A local "localName" variable hides the class level "localName" variable.
As a result the response XML contains the variable name instead of its value.
Regards,
Barnabas Aszodi
code segments:
WSDL:
<xsd:simpleType name="name">
<xsd:restriction base="xsd:string">
<xsd:maxLength value="50"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="customer">
<xsd:sequence>
<xsd:element name="FirstName" type="name"/>
</xsd:sequence>
</xsd:complexType>
Ant:
<wsdl2code
wsdlfilename="example.wsdl"
serverside="true"
generateservicexml="true"
skipbuildxml="true"
serversideinterface="true"
targetsourcefolderlocation="src_gen"
targetresourcesfolderlocation="src_gen/META-INF"
overwrite="true"/>
Name class: at the end of this descriotion
class level "localName" is defined at line 40
"serialize" method level "localName" is defined at line 134.
The bug: local "localName" is used in lines: 168 and 174 insted of the class
level one.
Usage:
Customer customer = new Customer();
Name firstName = new Name();
firstName.setName("Barnabas");
customer.setFirstName(firstName);
Generated SOAP message:
<ns5:Customer>
<ns1:FirstName xmlns:ns1="example">FirstName</ns1:FirstName>
</ns5:Customer>
/**
* Name.java
*
* This file was auto-generated from WSDL
* by the Apache Axis2 version: 1.5.4 Built on : Dec 19, 2010 (08:19:26 CET)
*/
package bfo;
/**
* Name bean class
*/
public class Name
implements org.apache.axis2.databinding.ADBBean{
public static final javax.xml.namespace.QName MY_QNAME = new
javax.xml.namespace.QName(
"bfo",
"name",
"ns1");
private static java.lang.String generatePrefix(java.lang.String
namespace) {
if(namespace.equals("bfo")){
return "ns1";
}
return
org.apache.axis2.databinding.utils.BeanUtil.getUniquePrefix();
}
/**
* field for Name
*/
protected java.lang.String localName ;
/**
* Auto generated getter method
* @return java.lang.String
*/
public java.lang.String getName(){
return localName;
}
/**
* Auto generated setter method
* @param param Name
*/
public void setName(java.lang.String param){
if (
(java.lang.String.valueOf(param).length() <= 50) ) {
this.localName=param;
}
else {
throw new
java.lang.RuntimeException();
}
}
public java.lang.String toString(){
return localName.toString();
}
/**
* isReaderMTOMAware
* @return true if the reader supports MTOM
*/
public static boolean isReaderMTOMAware(javax.xml.stream.XMLStreamReader
reader) {
boolean isReaderMTOMAware = false;
try{
isReaderMTOMAware =
java.lang.Boolean.TRUE.equals(reader.getProperty(org.apache.axiom.om.OMConstants.IS_DATA_HANDLERS_AWARE));
}catch(java.lang.IllegalArgumentException e){
isReaderMTOMAware = false;
}
return isReaderMTOMAware;
}
/**
*
* @param parentQName
* @param factory
* @return org.apache.axiom.om.OMElement
*/
public org.apache.axiom.om.OMElement getOMElement (
final javax.xml.namespace.QName parentQName,
final org.apache.axiom.om.OMFactory factory) throws
org.apache.axis2.databinding.ADBException{
org.apache.axiom.om.OMDataSource dataSource =
new
org.apache.axis2.databinding.ADBDataSource(this,MY_QNAME){
public void
serialize(org.apache.axis2.databinding.utils.writer.MTOMAwareXMLStreamWriter
xmlWriter) throws javax.xml.stream.XMLStreamException {
Name.this.serialize(MY_QNAME,factory,xmlWriter);
}
};
return new org.apache.axiom.om.impl.llom.OMSourcedElementImpl(
MY_QNAME,factory,dataSource);
}
public void serialize(final javax.xml.namespace.QName parentQName,
final org.apache.axiom.om.OMFactory
factory,
org.apache.axis2.databinding.utils.writer.MTOMAwareXMLStreamWriter xmlWriter)
throws javax.xml.stream.XMLStreamException,
org.apache.axis2.databinding.ADBException{
serialize(parentQName,factory,xmlWriter,false);
}
public void serialize(final javax.xml.namespace.QName parentQName,
final org.apache.axiom.om.OMFactory factory,
org.apache.axis2.databinding.utils.writer.MTOMAwareXMLStreamWriter xmlWriter,
boolean serializeType)
throws javax.xml.stream.XMLStreamException,
org.apache.axis2.databinding.ADBException{
//We can safely assume an element has only one type associated
with it
java.lang.String namespace =
parentQName.getNamespaceURI();
java.lang.String localName =
parentQName.getLocalPart();
if (! namespace.equals("")) {
java.lang.String prefix =
xmlWriter.getPrefix(namespace);
if (prefix == null) {
prefix = generatePrefix(namespace);
xmlWriter.writeStartElement(prefix,
localName, namespace);
xmlWriter.writeNamespace(prefix, namespace);
xmlWriter.setPrefix(prefix, namespace);
} else {
xmlWriter.writeStartElement(namespace,
localName);
}
} else {
xmlWriter.writeStartElement(localName);
}
// add the type details if this is used in a simple
type
if (serializeType){
java.lang.String namespacePrefix =
registerPrefix(xmlWriter,"bfo");
if ((namespacePrefix != null) &&
(namespacePrefix.trim().length() > 0)){
writeAttribute("xsi","http://www.w3.org/2001/XMLSchema-instance","type",
namespacePrefix+":name",
xmlWriter);
} else {
writeAttribute("xsi","http://www.w3.org/2001/XMLSchema-instance","type",
"name",
xmlWriter);
}
}
if (localName==null){
throw new
org.apache.axis2.databinding.ADBException("Value cannot be null !!");
}else{
xmlWriter.writeCharacters(localName);
}
xmlWriter.writeEndElement();
}
/**
* Util method to write an attribute with the ns prefix
*/
private void writeAttribute(java.lang.String prefix,java.lang.String
namespace,java.lang.String attName,
java.lang.String
attValue,javax.xml.stream.XMLStreamWriter xmlWriter) throws
javax.xml.stream.XMLStreamException{
if (xmlWriter.getPrefix(namespace) == null) {
xmlWriter.writeNamespace(prefix, namespace);
xmlWriter.setPrefix(prefix, namespace);
}
xmlWriter.writeAttribute(namespace,attName,attValue);
}
/**
* Util method to write an attribute without the ns prefix
*/
private void writeAttribute(java.lang.String
namespace,java.lang.String attName,
java.lang.String
attValue,javax.xml.stream.XMLStreamWriter xmlWriter) throws
javax.xml.stream.XMLStreamException{
if (namespace.equals(""))
{
xmlWriter.writeAttribute(attName,attValue);
}
else
{
registerPrefix(xmlWriter, namespace);
xmlWriter.writeAttribute(namespace,attName,attValue);
}
}
/**
* Util method to write an attribute without the ns prefix
*/
private void writeQNameAttribute(java.lang.String namespace,
java.lang.String attName,
javax.xml.namespace.QName qname,
javax.xml.stream.XMLStreamWriter xmlWriter) throws
javax.xml.stream.XMLStreamException {
java.lang.String attributeNamespace = qname.getNamespaceURI();
java.lang.String attributePrefix =
xmlWriter.getPrefix(attributeNamespace);
if (attributePrefix == null) {
attributePrefix = registerPrefix(xmlWriter,
attributeNamespace);
}
java.lang.String attributeValue;
if (attributePrefix.trim().length() > 0) {
attributeValue = attributePrefix + ":" +
qname.getLocalPart();
} else {
attributeValue = qname.getLocalPart();
}
if (namespace.equals("")) {
xmlWriter.writeAttribute(attName, attributeValue);
} else {
registerPrefix(xmlWriter, namespace);
xmlWriter.writeAttribute(namespace, attName,
attributeValue);
}
}
/**
* method to handle Qnames
*/
private void writeQName(javax.xml.namespace.QName qname,
javax.xml.stream.XMLStreamWriter xmlWriter)
throws javax.xml.stream.XMLStreamException {
java.lang.String namespaceURI = qname.getNamespaceURI();
if (namespaceURI != null) {
java.lang.String prefix = xmlWriter.getPrefix(namespaceURI);
if (prefix == null) {
prefix = generatePrefix(namespaceURI);
xmlWriter.writeNamespace(prefix, namespaceURI);
xmlWriter.setPrefix(prefix,namespaceURI);
}
if (prefix.trim().length() > 0){
xmlWriter.writeCharacters(prefix + ":" +
org.apache.axis2.databinding.utils.ConverterUtil.convertToString(qname));
} else {
// i.e this is the default namespace
xmlWriter.writeCharacters(org.apache.axis2.databinding.utils.ConverterUtil.convertToString(qname));
}
} else {
xmlWriter.writeCharacters(org.apache.axis2.databinding.utils.ConverterUtil.convertToString(qname));
}
}
private void writeQNames(javax.xml.namespace.QName[] qnames,
javax.xml.stream.XMLStreamWriter xmlWriter)
throws javax.xml.stream.XMLStreamException {
if (qnames != null) {
// we have to store this data until last moment since it is not
possible to write any
// namespace data after writing the charactor data
java.lang.StringBuffer stringToWrite = new
java.lang.StringBuffer();
java.lang.String namespaceURI = null;
java.lang.String prefix = null;
for (int i = 0; i < qnames.length; i++) {
if (i > 0) {
stringToWrite.append(" ");
}
namespaceURI = qnames[i].getNamespaceURI();
if (namespaceURI != null) {
prefix = xmlWriter.getPrefix(namespaceURI);
if ((prefix == null) || (prefix.length() == 0)) {
prefix = generatePrefix(namespaceURI);
xmlWriter.writeNamespace(prefix, namespaceURI);
xmlWriter.setPrefix(prefix,namespaceURI);
}
if (prefix.trim().length() > 0){
stringToWrite.append(prefix).append(":").append(org.apache.axis2.databinding.utils.ConverterUtil.convertToString(qnames[i]));
} else {
stringToWrite.append(org.apache.axis2.databinding.utils.ConverterUtil.convertToString(qnames[i]));
}
} else {
stringToWrite.append(org.apache.axis2.databinding.utils.ConverterUtil.convertToString(qnames[i]));
}
}
xmlWriter.writeCharacters(stringToWrite.toString());
}
}
/**
* Register a namespace prefix
*/
private java.lang.String
registerPrefix(javax.xml.stream.XMLStreamWriter xmlWriter, java.lang.String
namespace) throws javax.xml.stream.XMLStreamException {
java.lang.String prefix = xmlWriter.getPrefix(namespace);
if (prefix == null) {
prefix = generatePrefix(namespace);
while
(xmlWriter.getNamespaceContext().getNamespaceURI(prefix) != null) {
prefix =
org.apache.axis2.databinding.utils.BeanUtil.getUniquePrefix();
}
xmlWriter.writeNamespace(prefix, namespace);
xmlWriter.setPrefix(prefix, namespace);
}
return prefix;
}
/**
* databinding method to get an XML representation of this object
*
*/
public javax.xml.stream.XMLStreamReader
getPullParser(javax.xml.namespace.QName qName)
throws org.apache.axis2.databinding.ADBException{
//We can safely assume an element has only one type associated
with it
return new
org.apache.axis2.databinding.utils.reader.ADBXMLStreamReaderImpl(MY_QNAME,
new java.lang.Object[]{
org.apache.axis2.databinding.utils.reader.ADBXMLStreamReader.ELEMENT_TEXT,
org.apache.axis2.databinding.utils.ConverterUtil.convertToString(localName)
},
null);
}
/**
* Factory class that keeps the parse method
*/
public static class Factory{
public static Name fromString(java.lang.String value,
java.lang.String
namespaceURI){
Name returnValue = new Name();
returnValue.setName(
org.apache.axis2.databinding.utils.ConverterUtil.convertToString(value));
return returnValue;
}
public static Name fromString(javax.xml.stream.XMLStreamReader
xmlStreamReader,
java.lang.String content) {
if (content.indexOf(":") > -1){
java.lang.String prefix =
content.substring(0,content.indexOf(":"));
java.lang.String namespaceUri =
xmlStreamReader.getNamespaceContext().getNamespaceURI(prefix);
return Name.Factory.fromString(content,namespaceUri);
} else {
return Name.Factory.fromString(content,"");
}
}
/**
* static method to create the object
* Precondition: If this object is an element, the current or next
start element starts this object and any intervening reader events are ignorable
* If this object is not an element, it is a complex type
and the reader is at the event just after the outer start element
* Postcondition: If this object is an element, the reader is positioned
at its end element
* If this object is a complex type, the reader is
positioned at the end element of its outer element
*/
public static Name parse(javax.xml.stream.XMLStreamReader reader)
throws java.lang.Exception{
Name object =
new Name();
int event;
java.lang.String nillableValue = null;
java.lang.String prefix ="";
java.lang.String namespaceuri ="";
try {
while (!reader.isStartElement() && !reader.isEndElement())
reader.next();
// Note all attributes that were handled. Used to differ normal
attributes
// from anyAttributes.
java.util.Vector handledAttributes = new java.util.Vector();
while(!reader.isEndElement()) {
if (reader.isStartElement() || reader.hasText()){
if (reader.isStartElement() ||
reader.hasText()){
java.lang.String content =
reader.getElementText();
object.setName(
org.apache.axis2.databinding.utils.ConverterUtil.convertToString(content));
} // End of if for expected property start
element
else{
// A start element we are not expecting
indicates an invalid parameter was passed
throw new
org.apache.axis2.databinding.ADBException("Unexpected subelement " +
reader.getLocalName());
}
} else {
reader.next();
}
} // end of while loop
} catch (javax.xml.stream.XMLStreamException e) {
throw new java.lang.Exception(e);
}
return object;
}
}//end of factory class
}
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]