scheu       02/02/15 15:02:19

  Modified:    java/src/org/apache/axis/wsdl/toJava SchemaUtils.java
  Log:
  Changes per axis-dev request from David Altenburg.
  
  The WSDL2Java emitter now parses choice and group elements underneath
  complexType elements.
  
  Need a testcase...
  
  Revision  Changes    Path
  1.9       +132 -21   xml-axis/java/src/org/apache/axis/wsdl/toJava/SchemaUtils.java
  
  Index: SchemaUtils.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/SchemaUtils.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- SchemaUtils.java  15 Feb 2002 19:41:17 -0000      1.8
  +++ SchemaUtils.java  15 Feb 2002 23:02:19 -0000      1.9
  @@ -163,33 +163,18 @@
               }
               if (groupNode != null) {
   
  -                // Process each of the element nodes under the group node
  +                // Process each of the choice or element nodes under the 
sequence/all node
                   Vector v = new Vector();
                   NodeList elements = groupNode.getChildNodes();
                   for (int i=0; i < elements.getLength(); i++) {
                       QName elementKind = Utils.getNodeQName(elements.item(i));
                       if (elementKind != null &&
  -                        elementKind.getLocalPart().equals("element") &&
                           Constants.isSchemaXSD(elementKind.getNamespaceURI())) {
  -
  -                        // Get the name and type qnames.
  -                        // The name of the element is the local part of the name's 
qname.
  -                        // The type qname is used to locate the TypeEntry, which is 
then
  -                        // used to retrieve the proper java name of the type.
  -                        Node elementNode = elements.item(i);
  -                        QName nodeName = Utils.getNodeNameQName(elementNode);
  -                        BooleanHolder forElement = new BooleanHolder();
  -                        QName nodeType = Utils.getNodeTypeRefQName(elementNode, 
forElement);
  -                        if (nodeType == null) { // The element may use an anonymous 
type
  -                            nodeType = nodeName;
  -                            forElement.value = false;
  -                        }
  -
  -                        TypeEntry type = (TypeEntry) 
symbolTable.getTypeEntry(nodeType, 
  -                                                                              
forElement.value);
  -                        if (type != null) {
  -                            v.add(type);
  -                            v.add(nodeName.getLocalPart());
  +                        if ( elementKind.getLocalPart().equals("element")) {
  +                            v.addAll(processChildElementNode(elements.item(i), 
symbolTable));
  +                        } else if (elementKind.getLocalPart().equals("choice")) {
  +                            Vector choiceElems = 
processChoiceNode(elements.item(i), symbolTable);
  +                            v.addAll(choiceElems);
                           }
                       }
                   }
  @@ -197,6 +182,132 @@
               }
           }
           return null;
  +    }
  +
  +    /**
  +     * Invoked by getComplexElementTypesAndNames to get the child element types
  +     * and child element names underneath a Choice Node
  +     */
  +    private static Vector processChoiceNode(Node choiceNode, SymbolTable 
symbolTable) {
  +        Vector v = new Vector();
  +        NodeList children = choiceNode.getChildNodes();
  +        for (int j = 0; j < children.getLength(); j++) {
  +            QName subNodeKind = Utils.getNodeQName(children.item(j));
  +            if (subNodeKind != null &&
  +                Constants.isSchemaXSD(subNodeKind.getNamespaceURI())) {
  +                if (subNodeKind.getLocalPart().equals("choice")) {
  +                    v.addAll(processChoiceNode(children.item(j), symbolTable));
  +                } else if (subNodeKind.getLocalPart().equals("sequence")) {
  +                    v.addAll(processSequenceNode(children.item(j), symbolTable));
  +                } else if (subNodeKind.getLocalPart().equals("group")) {
  +                    v.addAll(processGroupNode(children.item(j), symbolTable));
  +                } else if (subNodeKind.getLocalPart().equals("element")) {
  +                    v.addAll(processChildElementNode(children.item(j), 
symbolTable));
  +                }
  +            }
  +        }
  +        return v;
  +    }
  +
  +    /**
  +     * Invoked by getComplexElementTypesAndNames to get the child element types
  +     * and child element names underneath a Sequence Node
  +     */
  +    private static Vector processSequenceNode(Node sequenceNode, SymbolTable 
symbolTable) {
  +        Vector v = new Vector();
  +        NodeList children = sequenceNode.getChildNodes();
  +        for (int j = 0; j < children.getLength(); j++) {
  +            QName subNodeKind = Utils.getNodeQName(children.item(j));
  +            if (subNodeKind != null &&
  +                Constants.isSchemaXSD(subNodeKind.getNamespaceURI())) {
  +                if (subNodeKind.getLocalPart().equals("choice")) {
  +                    v.addAll(processChoiceNode(children.item(j), symbolTable));
  +                } else if (subNodeKind.getLocalPart().equals("sequence")) {
  +                    v.addAll(processSequenceNode(children.item(j), symbolTable));
  +                } else if (subNodeKind.getLocalPart().equals("group")) {
  +                    v.addAll(processGroupNode(children.item(j), symbolTable));
  +                } else if (subNodeKind.getLocalPart().equals("element")) {
  +                    v.addAll(processChildElementNode(children.item(j), 
symbolTable));
  +                }
  +            }
  +        }
  +        return v;
  +    }
  +
  +    /**
  +     * Invoked by getComplexElementTypesAndNames to get the child element types
  +     * and child element names underneath a group node.
  +     * (Currently the code only supports a defined group it does not
  +     * support a group that references a previously defined group)
  +     */
  +    private static Vector processGroupNode(Node groupNode, SymbolTable symbolTable) 
{
  +        Vector v = new Vector();
  +        NodeList children = groupNode.getChildNodes();
  +        for (int j = 0; j < children.getLength(); j++) {
  +            QName subNodeKind = Utils.getNodeQName(children.item(j));
  +            if (subNodeKind != null &&
  +                Constants.isSchemaXSD(subNodeKind.getNamespaceURI())) {
  +                if (subNodeKind.getLocalPart().equals("choice")) {
  +                    v.addAll(processChoiceNode(children.item(j), symbolTable));
  +                } else if (subNodeKind.getLocalPart().equals("sequence")) {
  +                    v.addAll(processSequenceNode(children.item(j), symbolTable));
  +                } else if (subNodeKind.getLocalPart().equals("all")) {
  +                    v.addAll(processAllNode(children.item(j), symbolTable));
  +                }
  +            }
  +        }
  +        return v;
  +    }
  +
  +    /**
  +     * Invoked by getComplexElementTypesAndNames to get the child element types
  +     * and child element names underneath an all node.
  +     */
  +    private static Vector processAllNode(Node allNode, SymbolTable symbolTable) {
  +        Vector v = new Vector();
  +        NodeList children = allNode.getChildNodes();
  +        for (int j = 0; j < children.getLength(); j++) {
  +            QName subNodeKind = Utils.getNodeQName(children.item(j));
  +            if (subNodeKind != null &&
  +                Constants.isSchemaXSD(subNodeKind.getNamespaceURI())) {
  +                if (subNodeKind.getLocalPart().equals("element")) {
  +                    v.addAll(processChildElementNode(children.item(j), 
symbolTable));
  +                }
  +            }
  +        }
  +        return v;
  +    }
  +
  +
  +    /**
  +     * Invoked by getComplexElementTypesAndNames to get the child element type
  +     * and child element name for a child element node.
  +     *
  +     * If the specified node represents a supported JAX-RPC child element,
  +     * a Vector is returned which contains the child element type and
  +     * child element name.  The 0th index is the element types (TypeEntry) and
  +     * the 1st index is the corresponding name (Strings).
  +     */
  +    private static Vector processChildElementNode(Node elementNode, SymbolTable 
symbolTable) {
  +        Vector v = new Vector();
  +        // Get the name and type qnames.
  +        // The name of the element is the local part of the name's qname.
  +        // The type qname is used to locate the TypeEntry, which is then
  +        // used to retrieve the proper java name of the type.
  +        QName nodeName = Utils.getNodeNameQName(elementNode);
  +        BooleanHolder forElement = new BooleanHolder();
  +        QName nodeType = Utils.getNodeTypeRefQName(elementNode, forElement);
  +        if (nodeType == null) { // The element may use an anonymous type
  +             nodeType = nodeName;
  +             forElement.value = false;
  +        }
  +
  +        TypeEntry type = (TypeEntry) symbolTable.getTypeEntry(nodeType, 
forElement.value);
  +        if (type != null) {
  +            v.add(type);
  +            v.add(nodeName.getLocalPart());
  +        }
  +        return v;
       }
   
       /**
  
  
  


Reply via email to