scheu 02/03/20 12:53:57
Modified: java/src/org/apache/axis/wsdl/toJava JavaStubWriter.java
SymbolTable.java Utils.java
java/test/wsdl/types ComprehensiveTypes.wsdl
VerifyTestCase.java
Log:
Cool changes to more fully support derived type usage!
Changes made to support:
1) Marking derived types as referenced if base type is referenced.
2) Missing type attribute (and no other type info) should be accepted as an
xsd:anyType.
3) Mark all types as referenced if anyType is referenced.
Details:
1) Added Utils.getDerivedTypes method that gets the derived types of
the indicated TypeEntry type. If the indicated type is an xsd:anyType, then
all the TypeEntries in the symbol table are returned. I also
added some code to getDerivedTypes and getNestedTypes to check the size
of the current set versus the size of the symbol table. Obviously if the
sizes are the same, no more processing needs to be performed.
2) Changed Utils.getNestedTypes to use a TypeEntry parameters instead of a Node
parameters.
Also added a derivedFlag parameter. If this flag is set, the nested and
derived types are returned.
3) Changed setTypeReferences to consider derived types.
4) Changed Utils.getNodeTypeRefQName to handle defaulting of type attribute
on an element/attribute.
5) Changed comprehensive test to test these new features.
Revision Changes Path
1.48 +4 -5
xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaStubWriter.java
Index: JavaStubWriter.java
===================================================================
RCS file:
/home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaStubWriter.java,v
retrieving revision 1.47
retrieving revision 1.48
diff -u -r1.47 -r1.48
--- JavaStubWriter.java 19 Mar 2002 20:15:28 -0000 1.47
+++ JavaStubWriter.java 20 Mar 2002 20:53:56 -0000 1.48
@@ -313,16 +313,15 @@
firstPassTypes.addAll(getTypesInOperation(op));
}
- // Extract those types which are complex types.
+ // Add all the types nested and derived from the types
+ // in the first pass.
Iterator i = firstPassTypes.iterator();
while (i.hasNext()) {
TypeEntry type = (TypeEntry) i.next();
if (!types.contains(type)) {
types.add(type);
- if ((type.getNode() != null) && type.getBaseType() == null) {
- types.addAll(
- Utils.getNestedTypes(type.getNode(), symbolTable));
- }
+ types.addAll(
+ Utils.getNestedTypes(type, symbolTable, true));
}
}
return types;
1.49 +13 -4 xml-axis/java/src/org/apache/axis/wsdl/toJava/SymbolTable.java
Index: SymbolTable.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/SymbolTable.java,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -r1.48 -r1.49
--- SymbolTable.java 20 Mar 2002 13:36:47 -0000 1.48
+++ SymbolTable.java 20 Mar 2002 20:53:56 -0000 1.49
@@ -540,8 +540,8 @@
else if (isXSD && localPart.equals("element")) {
// If the element has a type/ref attribute, create
// a Type representing the referenced type.
- if (Utils.getAttribute(node, "type") != null ||
- Utils.getAttribute(node, "ref") != null) {
+ if (Utils.getNodeTypeRefQName(node, "type") != null ||
+ Utils.getNodeTypeRefQName(node, "ref") != null) {
createTypeFromRef(node);
}
@@ -561,7 +561,7 @@
else if (isXSD && localPart.equals("attribute")) {
// If the attribute has a type/ref attribute, create
// a Type representing the referenced type.
- if (Utils.getAttribute(node, "type") != null) {
+ if (Utils.getNodeTypeRefQName(node, "type") != null) {
createTypeFromRef(node);
}
@@ -1340,6 +1340,9 @@
/**
* Set each SymTabEntry's isReferenced flag. The default is false. If no
other symbol
* references this symbol, then leave it false, otherwise set it to true.
+ * (An exception to the rule is that derived types are set as referenced if
+ * their base type is referenced. This is necessary to support generation and
+ * registration of derived types.)
*/
private void setReferences(Definition def, Document doc) {
Map stuff = def.getServices();
@@ -1401,6 +1404,12 @@
private void setTypeReferences(TypeEntry entry, Document doc,
boolean literal) {
+ // Check to see if already processed.
+ if ((entry.isReferenced() && !literal) ||
+ (entry.isOnlyLiteralReferenced() && literal)) {
+ return;
+ }
+
if (wrapped) {
// If this type is ONLY referenced from a literal usage in a binding,
// then isOnlyLiteralReferenced should return true.
@@ -1443,7 +1452,7 @@
}
}
- HashSet nestedTypes = Utils.getNestedTypes(node, this);
+ HashSet nestedTypes = Utils.getNestedTypes(entry, this, true);
Iterator it = nestedTypes.iterator();
while (it.hasNext()) {
TypeEntry nestedType = (TypeEntry) it.next();
1.23 +111 -16 xml-axis/java/src/org/apache/axis/wsdl/toJava/Utils.java
Index: Utils.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/Utils.java,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- Utils.java 19 Mar 2002 23:29:28 -0000 1.22
+++ Utils.java 20 Mar 2002 20:53:56 -0000 1.23
@@ -68,6 +68,7 @@
import java.util.HashSet;
import java.util.StringTokenizer;
import java.util.Vector;
+import java.util.Iterator;
import org.apache.axis.utils.JavaUtils;
import org.apache.axis.Constants;
@@ -361,6 +362,26 @@
return null;
}
String prefixedName = getAttribute(node, typeAttrName);
+
+ // The type attribute defaults to xsd:anyType if there
+ // are no other conflicting attributes and no anonymous type.
+ if (prefixedName == null &&
+ typeAttrName.equals("type")) {
+ if (getAttribute(node, "ref") == null &&
+ getAttribute(node, "base") == null &&
+ getAttribute(node, "element") == null &&
+ SchemaUtils.getElementAnonQName(node) == null) {
+ QName nodeName = getNodeQName(node);
+ if (nodeName != null &&
+ Constants.isSchemaXSD(nodeName.getNamespaceURI()) &&
+ (nodeName.getLocalPart().equals("element") ||
+ nodeName.getLocalPart().equals("attribute"))) {
+ return getWSDLQName(Constants.XSD_ANYTYPE);
+ }
+ }
+ }
+
+ // Return null if not found
if (prefixedName == null) {
return null;
}
@@ -602,46 +623,123 @@
/**
+ * This method returns a set of all types that are derived
+ * from this type via an extension of a complexType
+ */
+ public static HashSet getDerivedTypes(TypeEntry type, SymbolTable symbolTable) {
+ HashSet types = new HashSet();
+ if (type != null && type.getNode() != null) {
+ getDerivedTypes(type, types, symbolTable);
+ } else if (Constants.isSchemaXSD(type.getQName().getNamespaceURI()) &&
+ type.getQName().getLocalPart().equals("anyType")) {
+ // All types are derived from anyType
+ types.addAll(symbolTable.getTypes());
+ }
+ return types;
+ } // getNestedTypes
+
+ private static void getDerivedTypes(
+ TypeEntry type, HashSet types, SymbolTable symbolTable) {
+
+ // If all types are in the set, return
+ if (types.size() == symbolTable.getTypes().size()) {
+ return;
+ }
+
+ // Search the dictionary for derived types of type
+ Vector allTypes = symbolTable.getTypes();
+ Iterator it = allTypes.iterator();
+ while(it.hasNext()) {
+ TypeEntry derivedType = (TypeEntry) it.next();
+ if (derivedType instanceof DefinedType &&
+ derivedType.getNode() != null &&
+ !types.contains(derivedType) &&
+ SchemaUtils.getComplexElementExtensionBase(
+ derivedType.getNode(),
+ symbolTable) == type) {
+ types.add(derivedType);
+ getDerivedTypes(derivedType, types, symbolTable);
+ }
+ }
+ } // getDerivedTypes
+
+ /**
* This method returns a set of all the nested types.
* Nested types are types declared within this TypeEntry (or descendents)
* plus any extended types and the extended type nested types
* The elements of the returned HashSet are Types.
+ * @param type is the type entry to consider
+ * @param symbolTable is the symbolTable
+ * @param derivedFlag should be set if all dependendent derived types should
also be
+ * returned.
*/
- public static HashSet getNestedTypes(Node type, SymbolTable symbolTable) {
+ public static HashSet getNestedTypes(TypeEntry type, SymbolTable symbolTable,
+ boolean derivedFlag) {
HashSet types = new HashSet();
- getNestedTypes(type, types, symbolTable);
+ getNestedTypes(type, types, symbolTable, derivedFlag);
return types;
} // getNestedTypes
private static void getNestedTypes(
- Node type, HashSet types, SymbolTable symbolTable) {
+ TypeEntry type, HashSet types, SymbolTable symbolTable,
+ boolean derivedFlag) {
+
+ if (type == null) {
+ return;
+ }
+
+ // If all types are in the set, return
+ if (types.size() == symbolTable.getTypes().size()) {
+ return;
+ }
+
+ // Process types derived from this type
+ if (derivedFlag) {
+ HashSet derivedTypes = getDerivedTypes(type, symbolTable);
+ Iterator it = derivedTypes.iterator();
+ while(it.hasNext()) {
+ TypeEntry derivedType = (TypeEntry) it.next();
+ if (!types.contains(derivedType)) {
+ types.add(derivedType);
+ getNestedTypes(derivedType, types, symbolTable, derivedFlag);
+ }
+ }
+ }
+
+ // Continue only if the node exists
+ if(type.getNode() == null) {
+ return;
+ }
+ Node node = type.getNode();
+
// Process types declared in this type
- Vector v = SchemaUtils.getContainedElementDeclarations(type, symbolTable);
+ Vector v = SchemaUtils.getContainedElementDeclarations(node, symbolTable);
if (v != null) {
for (int i = 0; i < v.size(); i++) {
ElementDecl elem = (ElementDecl)v.get(i);
if (!types.contains(elem.getType())) {
types.add(elem.getType());
- getNestedTypes(elem.getType().getNode(),
+ getNestedTypes(elem.getType(),
types,
- symbolTable);
+ symbolTable, derivedFlag);
}
}
}
+
// Process attributes declared in this type
- v = SchemaUtils.getContainedAttributeTypes(type, symbolTable);
+ v = SchemaUtils.getContainedAttributeTypes(node, symbolTable);
if (v != null) {
for (int i = 0; i < v.size(); i+=2) {
if (!types.contains(v.get(i))) {
types.add(v.get(i));
getNestedTypes(
- ((TypeEntry) v.get(i)).getNode(), types, symbolTable);
+ ((TypeEntry) v.get(i)), types, symbolTable,
derivedFlag);
}
}
}
// Get the anonymous type of the element
- QName anonQName = SchemaUtils.getElementAnonQName(type);
+ QName anonQName = SchemaUtils.getElementAnonQName(node);
if (anonQName != null) {
TypeEntry anonType = symbolTable.getType(anonQName);
if (anonType != null && !types.contains(anonType)) {
@@ -650,26 +748,23 @@
}
// Process extended types
- TypeEntry extendType = SchemaUtils.getComplexElementExtensionBase(type,
symbolTable);
+ TypeEntry extendType = SchemaUtils.getComplexElementExtensionBase(node,
symbolTable);
if (extendType != null) {
if (!types.contains(extendType)) {
types.add(extendType);
- getNestedTypes(extendType.getNode(), types, symbolTable);
+ getNestedTypes(extendType, types, symbolTable, derivedFlag);
}
}
// Process array element types
- QName elementQName = SchemaUtils.getArrayElementQName(type, new
IntHolder(0));
+ QName elementQName = SchemaUtils.getArrayElementQName(node, new
IntHolder(0));
TypeEntry elementType = symbolTable.getType(elementQName);
if (elementType != null) {
if (!types.contains(elementType)) {
types.add(elementType);
- getNestedTypes(elementType.getNode(), types, symbolTable);
+ getNestedTypes(elementType, types, symbolTable, derivedFlag);
}
}
-
-
-
} // getNestedTypes
/**
1.20 +20 -0 xml-axis/java/test/wsdl/types/ComprehensiveTypes.wsdl
Index: ComprehensiveTypes.wsdl
===================================================================
RCS file: /home/cvs/xml-axis/java/test/wsdl/types/ComprehensiveTypes.wsdl,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- ComprehensiveTypes.wsdl 11 Mar 2002 16:25:32 -0000 1.19
+++ ComprehensiveTypes.wsdl 20 Mar 2002 20:53:57 -0000 1.20
@@ -157,6 +157,26 @@
</xsd:complexType>
<xsd:element name="Cat" nillable="true" type="typens:Cat"/>
+ <!-- Even though PersionCat is not directly referenced, it should
+ be generated and registered because its base class (Cat) is referenced -->
+ <xsd:complexType name="PersionCat">
+ <xsd:complexContent>
+ <xsd:extension base="typens:Cat">
+ <xsd:all>
+ <xsd:element name="Color" type="xsd:string"/>
+ <xsd:element name="Toy" /> <!-- Defaults to xsd:anyType -->
+ </xsd:all>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <!-- Even though Yarn is not directly referenced, it should
+ be generated and registered because the Toy above is an anyType -->
+ <xsd:complexType name="Yarn">
+ <xsd:all>
+ <xsd:element name="Color" type="xsd:string"/>
+ </xsd:all>
+ </xsd:complexType>
<!-- The following test all of the valid enum basic types -->
<xsd:simpleType name="enumString">
1.16 +19 -0 xml-axis/java/test/wsdl/types/VerifyTestCase.java
Index: VerifyTestCase.java
===================================================================
RCS file: /home/cvs/xml-axis/java/test/wsdl/types/VerifyTestCase.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- VerifyTestCase.java 19 Mar 2002 23:29:29 -0000 1.15
+++ VerifyTestCase.java 20 Mar 2002 20:53:57 -0000 1.16
@@ -37,6 +37,8 @@
import test.wsdl.types.comprehensive_types.ArrayMHolder;
import test.wsdl.types.comprehensive_types.Cat;
import test.wsdl.types.comprehensive_types.CatHolder;
+import test.wsdl.types.comprehensive_types.PersionCat;
+import test.wsdl.types.comprehensive_types.Yarn;
import test.wsdl.types.comprehensive_types.ComplexAll;
import test.wsdl.types.comprehensive_types.ComplexAllHolder;
import test.wsdl.types.comprehensive_types.ComplexSequence;
@@ -312,6 +314,12 @@
}
Cat cat = new Cat();
cat.setPurr("meow");
+ PersionCat persion = new PersionCat();
+ Yarn yarn = new Yarn();
+ yarn.setColor("green");
+ persion.setPurr("meow meow");
+ persion.setColor("blue");
+ persion.setToy(yarn);
try {
binding.animalIn(cat);
} catch (java.rmi.RemoteException re) {
@@ -344,6 +352,17 @@
} catch (java.rmi.RemoteException re) {
throw new junit.framework.AssertionFailedError("Remote Exception
caught: " + re );
}
+ try {
+ binding.catIn(persion);
+ } catch (java.rmi.RemoteException re) {
+ throw new junit.framework.AssertionFailedError("Remote Exception
caught: " + re );
+ }
+ try {
+ binding.catInout(new CatHolder(persion));
+ } catch (java.rmi.RemoteException re) {
+ throw new junit.framework.AssertionFailedError("Remote Exception
caught: " + re );
+ }
+
try {
BooleanHolder bh = new BooleanHolder(true);
boolean actual = binding.methodBoolean(true, bh);