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;
}
/**