private static QName getArrayComponentQName_JAXRPC()

in axis-rt-core/src/main/java/org/apache/axis/wsdl/symbolTable/SchemaUtils.java [1472:1697]


    private static QName getArrayComponentQName_JAXRPC(Node node,
                                                       IntHolder dims,
                                                       BooleanHolder underlTypeNillable,
                                                       SymbolTable symbolTable)
    {

        dims.value = 0;    // Assume 0
        underlTypeNillable.value = false;
        if (node == null) {
            return null;
        }

        // If the node kind is an element, dive into it.
        if (isXSDNode(node, "element")) {
            NodeList children = node.getChildNodes();

            for (int j = 0; j < children.getLength(); j++) {
                Node kid = children.item(j);

                if (isXSDNode(kid, "complexType")) {
                    node = kid;

                    break;
                }
            }
        }

        // Get the node kind, expecting a schema complexType
        if (isXSDNode(node, "complexType")) {

            // Under the complexType there should be a complexContent.
            // (There may be other #text nodes, which we will ignore).
            NodeList children = node.getChildNodes();
            Node complexContentNode = null;

            for (int j = 0; j < children.getLength(); j++) {
                Node kid = children.item(j);

                if (isXSDNode(kid, "complexContent")
                        || isXSDNode(kid, "simpleContent")) {
                    complexContentNode = kid;

                    break;
                }
            }

            // Under the complexContent there should be a restriction.
            // (There may be other #text nodes, which we will ignore).
            Node restrictionNode = null;

            if (complexContentNode != null) {
                children = complexContentNode.getChildNodes();

                for (int j = 0; j < children.getLength(); j++) {
                    Node kid = children.item(j);

                    if (isXSDNode(kid, "restriction")) {
                        restrictionNode = kid;

                        break;
                    }
                }
            }

            // The restriction node must have a base of soapenc:Array.
            QName baseType = null;

            if (restrictionNode != null) {
                baseType = Utils.getTypeQName(restrictionNode,
                        new BooleanHolder(), false);

                if (baseType != null) {
                    if (!baseType.getLocalPart().equals("Array") ||
                            !Constants.isSOAP_ENC(baseType.getNamespaceURI())) {
                        if (!symbolTable.arrayTypeQNames.contains(baseType)) {
                            baseType = null; // Did not find base=soapenc:Array
                        }
                    }
                }
            }

            // Under the restriction there should be an attribute OR a sequence/all group node.
            // (There may be other #text nodes, which we will ignore).
            Node groupNode = null;
            Node attributeNode = null;

            if (baseType != null) {
                children = restrictionNode.getChildNodes();

                for (int j = 0; (j < children.getLength())
                        && (groupNode == null)
                        && (attributeNode == null); j++) {
                    Node kid = children.item(j);

                    if (isXSDNode(kid, "sequence") || isXSDNode(kid, "all")) {
                        groupNode = kid;

                        if (groupNode.getChildNodes().getLength() == 0) {

                            // This covers the rather odd but legal empty sequence.
                            // <complexType name="ArrayOfString">
                            // <complexContent>
                            // <restriction base="soapenc:Array">
                            // <sequence/>
                            // <attribute ref="soapenc:arrayType" wsdl:arrayType="string[]"/>
                            // </restriction>
                            // </complexContent>
                            // </complexType>
                            groupNode = null;
                        }
                    }

                    if (isXSDNode(kid, "attribute")) {

                        // If the attribute node does not have ref="soapenc:arrayType"
                        // then keep looking.
                        BooleanHolder isRef = new BooleanHolder();
                        QName refQName = Utils.getTypeQName(kid, isRef,
                                false);

                        if ((refQName != null) && isRef.value
                                && refQName.getLocalPart().equals("arrayType")
                                && Constants.isSOAP_ENC(
                                        refQName.getNamespaceURI())) {
                            attributeNode = kid;
                        }
                    }
                }
            }

            // If there is an attribute node, look at wsdl:arrayType to get the element type
            if (attributeNode != null) {
                String wsdlArrayTypeValue = null;
                Vector attrs =
                        Utils.getAttributesWithLocalName(attributeNode,
                                "arrayType");

                for (int i = 0;
                     (i < attrs.size()) && (wsdlArrayTypeValue == null);
                     i++) {
                    Node attrNode = (Node) attrs.elementAt(i);
                    String attrName = attrNode.getNodeName();
                    QName attrQName =
                            Utils.getQNameFromPrefixedName(attributeNode, attrName);

                    if (Constants.isWSDL(attrQName.getNamespaceURI())) {
                        wsdlArrayTypeValue = attrNode.getNodeValue();
                    }
                }

                // The value could have any number of [] or [,] on the end
                // Strip these off to get the prefixed name.
                // The convert the prefixed name into a qname.
                // Count the number of [ and , to get the dim information.
                if (wsdlArrayTypeValue != null) {
                    int i = wsdlArrayTypeValue.indexOf('[');

                    if (i > 0) {
                        String prefixedName = wsdlArrayTypeValue.substring(0,
                                i);
                        String mangledString = wsdlArrayTypeValue.replace(',',
                                '[');

                        dims.value = 0;

                        int index = mangledString.indexOf('[');

                        while (index > 0) {
                            dims.value++;

                            index = mangledString.indexOf('[', index + 1);
                        }

                        return Utils.getQNameFromPrefixedName(restrictionNode,
                                prefixedName);
                    }
                }
            } else if (groupNode != null) {

                // Get the first element node under the group node.
                NodeList elements = groupNode.getChildNodes();
                Node elementNode = null;

                for (int i = 0;
                     (i < elements.getLength()) && (elementNode == null);
                     i++) {
                    Node kid = elements.item(i);

                    if (isXSDNode(kid, "element")) {
                        elementNode = elements.item(i);

                        break;
                    }
                }

                // The element node should have maxOccurs="unbounded" and
                // a type
                if (elementNode != null) {

                    String underlTypeNillableValue = Utils.getAttribute(elementNode,
                        "nillable");

                    if (underlTypeNillableValue != null
                            && underlTypeNillableValue.equals("true")) {

                        underlTypeNillable.value = true;
                    }

                    String maxOccursValue = Utils.getAttribute(elementNode,
                            "maxOccurs");

                    if ((maxOccursValue != null)
                            && maxOccursValue.equalsIgnoreCase("unbounded")) {

                        // Get the QName of the type without considering maxOccurs
                        dims.value = 1;

                        return Utils.getTypeQName(elementNode,
                                new BooleanHolder(), true);
                    }
                }
            }
        }

        return null;
    }