[ http://issues.apache.org/jira/browse/AXIS-2409?page=all ]
Martin Genhart updated AXIS-2409:
---------------------------------
Attachment: design.zip
The WSDL / schema used to reproduce the problem.
> WSDL processing does not resolve references made within sequences to global
> elements.
> -------------------------------------------------------------------------------------
>
> Key: AXIS-2409
> URL: http://issues.apache.org/jira/browse/AXIS-2409
> Project: Apache Axis
> Type: Bug
> Components: WSDL processing
> Versions: 1.3
> Environment: Windows XP professional
> Reporter: Martin Genhart
> Priority: Blocker
> Attachments: design.zip
>
> The following schema element PSKeyword/Choices references a globally defined
> element PSKeywordChoice in a sequence. This will not be resolved during WSDL
> processing while creating the type description in the produced java object.
> Because of that the array serializer produces the wrong XML and of course the
> array deserializer fails because it did expect XML as defined in the schema.
> If the same schema construct if made with local elements it is processed
> fine, see PSHierarchyNode/Properties in the schema below.
> <xsd:schema targetNamespace="urn:www.percussion.com/6.0.0/contentServices"
> xmlns:cons="urn:www.percussion.com/6.0.0/contentServices"
> xmlns:com="urn:www.percussion.com/6.0.0/common"
> xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
> attributeFormDefault="qualified">
> <xsd:simpleType name="NodeType">
> <xsd:restriction base="xsd:string">
> <xsd:enumeration value="folder"/>
> <xsd:enumeration value="placeholder"/>
> </xsd:restriction>
> </xsd:simpleType>
> <xsd:element name="PSHierarchyNode">
> <xsd:complexType>
> <xsd:sequence>
> <xsd:element name="Properties" minOccurs="0">
> <xsd:complexType>
> <xsd:sequence>
> <xsd:element name="Property" maxOccurs="unbounded">
> <xsd:complexType>
> <xsd:attribute name="parentId" type="xsd:string"/>
> <xsd:attribute name="name" type="xsd:string"
> use="required"/>
> <xsd:attribute name="value" type="xsd:string"/>
> </xsd:complexType>
> </xsd:element>
> </xsd:sequence>
> </xsd:complexType>
> </xsd:element>
> </xsd:sequence>
> <xsd:attribute name="id" type="xsd:string"/>
> <xsd:attribute name="parentId" type="xsd:string"/>
> <xsd:attribute name="type" type="cons:NodeType" use="required"/>
> <xsd:attribute name="name" type="xsd:string" use="required"/>
> </xsd:complexType>
> </xsd:element>
> <xsd:element name="PSKeyword">
> <xsd:complexType>
> <xsd:simpleContent>
> <xsd:extension base="xsd:string">
> <xsd:attribute name="label" type="xsd:string" use="required">
> <xsd:annotation>
> <xsd:documentation>The label of the keyword as displayed
> to end users.</xsd:documentation>
> </xsd:annotation>
> </xsd:attribute>
> <xsd:attribute name="value" type="xsd:string" use="required"/>
> <xsd:attribute name="keywordType" type="xsd:string"
> use="required"/>
> <xsd:attribute name="sequence" type="xsd:int"/>
> </xsd:extension>
> </xsd:simpleContent>
> </xsd:complexType>
> </xsd:element>
> <xsd:element name="PSKeywordChoice">
> <xsd:complexType>
> <xsd:attribute name="label" type="xsd:string" use="required"/>
> <xsd:attribute name="value" type="xsd:string" use="required"/>
> <xsd:attribute name="description" type="xsd:string"/>
> <xsd:attribute name="sequence" type="xsd:int" default="0"/>
> </xsd:complexType>
> </xsd:element>
> </xsd:schema>
> I will upload the WSLD / schema so that you are able to reproduce the
> problem. I run org.apache.axis.wsdl.WSDL2Java with these arguments:
> -o d:\temp\wsdl -W -s -S false -d Request -T 1.1
> D:\temp\wsdl\design\rhythmyx.wsdl
> The meta data produced for PSKeyword are:
> static {
> typeDesc.setXmlType(new
> javax.xml.namespace.QName("urn:www.percussion.com/6.0.0/contentServices",
> ">PSKeyword"));
> org.apache.axis.description.AttributeDesc attrField = new
> org.apache.axis.description.AttributeDesc();
> attrField.setFieldName("label");
> attrField.setXmlName(new javax.xml.namespace.QName("", "label"));
> attrField.setXmlType(new
> javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
> typeDesc.addFieldDesc(attrField);
> attrField = new org.apache.axis.description.AttributeDesc();
> attrField.setFieldName("value");
> attrField.setXmlName(new javax.xml.namespace.QName("", "value"));
> attrField.setXmlType(new
> javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
> typeDesc.addFieldDesc(attrField);
> attrField = new org.apache.axis.description.AttributeDesc();
> attrField.setFieldName("keywordType");
> attrField.setXmlName(new javax.xml.namespace.QName("",
> "keywordType"));
> attrField.setXmlType(new
> javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
> typeDesc.addFieldDesc(attrField);
> attrField = new org.apache.axis.description.AttributeDesc();
> attrField.setFieldName("sequence");
> attrField.setXmlName(new javax.xml.namespace.QName("", "sequence"));
> attrField.setXmlType(new
> javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int"));
> typeDesc.addFieldDesc(attrField);
> org.apache.axis.description.ElementDesc elemField = new
> org.apache.axis.description.ElementDesc();
> elemField.setFieldName("choices");
> elemField.setXmlName(new
> javax.xml.namespace.QName("urn:www.percussion.com/6.0.0/contentServices",
> "Choices"));
> elemField.setXmlType(new
> javax.xml.namespace.QName("urn:www.percussion.com/6.0.0/contentServices",
> "PSKeywordChoice"));
> elemField.setMinOccurs(0);
> elemField.setNillable(false);
> typeDesc.addFieldDesc(elemField);
> }
> But it should be:
> static {
> typeDesc.setXmlType(new
> javax.xml.namespace.QName("urn:www.percussion.com/6.0.0/contentServices",
> ">PSKeyword"));
> org.apache.axis.description.AttributeDesc attrField = new
> org.apache.axis.description.AttributeDesc();
> attrField.setFieldName("label");
> attrField.setXmlName(new javax.xml.namespace.QName("", "label"));
> attrField.setXmlType(new
> javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
> typeDesc.addFieldDesc(attrField);
> attrField = new org.apache.axis.description.AttributeDesc();
> attrField.setFieldName("value");
> attrField.setXmlName(new javax.xml.namespace.QName("", "value"));
> attrField.setXmlType(new
> javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
> typeDesc.addFieldDesc(attrField);
> attrField = new org.apache.axis.description.AttributeDesc();
> attrField.setFieldName("keywordType");
> attrField.setXmlName(new javax.xml.namespace.QName("",
> "keywordType"));
> attrField.setXmlType(new
> javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
> typeDesc.addFieldDesc(attrField);
> attrField = new org.apache.axis.description.AttributeDesc();
> attrField.setFieldName("sequence");
> attrField.setXmlName(new javax.xml.namespace.QName("", "sequence"));
> attrField.setXmlType(new
> javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int"));
> typeDesc.addFieldDesc(attrField);
> org.apache.axis.description.ElementDesc elemField = new
> org.apache.axis.description.ElementDesc();
> elemField.setFieldName("choices");
> elemField.setXmlName(new
> javax.xml.namespace.QName("urn:www.percussion.com/6.0.0/contentServices",
> "Choices"));
> elemField.setXmlType(new
> javax.xml.namespace.QName("urn:www.percussion.com/6.0.0/contentServices",
> "PSKeywordChoice"));
> elemField.setMinOccurs(0);
> elemField.setNillable(false);
> elemField.setItemQName(new
> javax.xml.namespace.QName("urn:www.percussion.com/6.0.0/contentServices",
> "PSKeywordChoice"));
> typeDesc.addFieldDesc(elemField);
> }
> I found that the problem is in class
> org.apache.axis.wsdl.symbolTable.SchemUtils.java:
> public static QName getCollectionComponentQName(Node node,
> QNameHolder itemQName,
> BooleanHolder forElement,
> SymbolTable symbolTable) {
> // If we're going to turn "wrapped" arrays into types such that
> // <complexType><sequence>
> // <element name="foo" type="xs:string" maxOccurs="unbounded"/>
> // </sequence></complexType>
> // becomes just "String []", we need to keep track of the inner
> // element name "foo" in metadata... This flag indicates whether to
> // do so.
> boolean storeComponentQName = false;
> if (node == null) {
> return null;
> }
> if (itemQName != null && isXSDNode(node, "complexType")) {
> // If this complexType is a sequence of exactly one element
> // we will continue processing below using that element, and
> // let the type checking logic determine if this is an array
> // or not.
> Node sequence = SchemaUtils.getChildByName(node, "sequence");
> if (sequence == null) {
> return null;
> }
> NodeList children = sequence.getChildNodes();
> Node element = null;
> for (int i = 0; i < children.getLength(); i++) {
> if (children.item(i).getNodeType() == Node.ELEMENT_NODE) {
> if (element == null) {
> element = children.item(i);
> } else {
> return null;
> }
> }
> }
> if (element == null) {
> return null;
> }
> // OK, exactly one element child of <sequence>,
> // continue the processing using that element ...
> node = element;
> storeComponentQName = true;
> try {
> symbolTable.createTypeFromRef(node);
> } catch (IOException e) {
> throw new
> RuntimeException(Messages.getMessage("exception01",e.toString()));
> }
> }
> // If the node kind is an element, dive to get its type.
> if (isXSDNode(node, "element")) {
> // Compare the componentQName with the name of the
> // full name. If different, return componentQName
> QName componentTypeQName = Utils.getTypeQName(node,
> forElement,
> true);
> if (componentTypeQName != null) {
> QName fullQName = Utils.getTypeQName(node, forElement, false);
> if (!componentTypeQName.equals(fullQName)) {
> if (storeComponentQName) {
> String name = Utils.getAttribute(node, "name");
>
> +++ // maybe its a reference
> +++ if (name == null)
> +++ {
> +++ String ref = Utils.getAttribute(node, "ref");
> +++ if (ref != null)
> +++ {
> +++ // strip any namespace info, it will be
> added later
> +++ String[] parts = ref.split(":");
> +++ name = parts[parts.length-1];
> +++ }
> }
>
> if (name != null) {
> // check elementFormDefault on schema element
> String def = Utils.getScopedAttribute(node,
> "elementFormDefault");
> String namespace = "";
> if ((def != null) && def.equals("qualified")) {
> namespace = Utils.getScopedAttribute(node,
> "targetNamespace");
> }
> itemQName.value = new QName(namespace, name);
> }
> }
> return componentTypeQName;
> }
> }
> }
> return null;
> }
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira