owenb 2002/11/08 08:51:24 Modified: java/src/org/apache/wsif/schema SimpleType.java SchemaType.java Schema.java ComplexType.java Parser.java Added: java/src/org/apache/wsif/schema ElementType.java Log: Added support for mappings based on top level <element> elements in the schema Revision Changes Path 1.2 +18 -6 xml-axis-wsif/java/src/org/apache/wsif/schema/SimpleType.java Index: SimpleType.java =================================================================== RCS file: /home/cvs/xml-axis-wsif/java/src/org/apache/wsif/schema/SimpleType.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- SimpleType.java 15 Oct 2002 15:33:12 -0000 1.1 +++ SimpleType.java 8 Nov 2002 16:51:24 -0000 1.2 @@ -69,15 +69,20 @@ public class SimpleType extends SchemaType { private String name = ""; - private QName type = null; + private QName typeName = null; /** * Constructor * @param el The dom element for this simpleType */ SimpleType(Element el, String tns) { - type = getAttributeQName(el, "name", tns); - name = type.getLocalPart(); + typeName = getAttributeQName(el, "name", tns); + + // If the element has no name, we cannot map it. Don't do any more processing + // of this type + if (typeName == null) return; + + name = typeName.getLocalPart(); } /** @@ -88,9 +93,16 @@ } /** - * @see SchemaType#getType() + * @see SchemaType#getTypeName() */ - public QName getType() { - return type; + public QName getTypeName() { + return typeName; } + + /** + * @see SchemaType#isSimple() + */ + public boolean isSimple() { + return false; + } } 1.2 +28 -3 xml-axis-wsif/java/src/org/apache/wsif/schema/SchemaType.java Index: SchemaType.java =================================================================== RCS file: /home/cvs/xml-axis-wsif/java/src/org/apache/wsif/schema/SchemaType.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- SchemaType.java 15 Oct 2002 15:33:12 -0000 1.1 +++ SchemaType.java 8 Nov 2002 16:51:24 -0000 1.2 @@ -57,6 +57,7 @@ package org.apache.wsif.schema; +import java.util.List; import javax.xml.namespace.QName; import org.w3c.dom.Element; @@ -79,6 +80,22 @@ } /** + * Get a flag to indicate if this type is a simpleType + * @return The boolean flag + */ + public boolean isSimple() { + return false; + } + + /** + * Get a flag to indicate if this type is an element type + * @return The boolean flag + */ + public boolean isElement() { + return false; + } + + /** * Get a flag to indicate if this type represents an array * @return The boolean flag */ @@ -103,10 +120,18 @@ } /** - * Get the "type" attribute of this type - * @return The type + * Get the "name" attribute of this type + * @return The type's name + */ + public QName getTypeName() { + return null; + } + + /** + * Get a the direct children (SimpleType or ComplexType only) for this element + * @return The children */ - public QName getType() { + public List getChildren() { return null; } 1.3 +3 -1 xml-axis-wsif/java/src/org/apache/wsif/schema/Schema.java Index: Schema.java =================================================================== RCS file: /home/cvs/xml-axis-wsif/java/src/org/apache/wsif/schema/Schema.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- Schema.java 18 Oct 2002 10:30:57 -0000 1.2 +++ Schema.java 8 Nov 2002 16:51:24 -0000 1.3 @@ -91,6 +91,8 @@ types.add(new ComplexType(subEl, targetNamespace)); } else if (elType.equals("simpleType")) { types.add(new SimpleType(subEl, targetNamespace)); + } else if (elType.equals("element")) { + types.add(new ElementType(subEl, targetNamespace)); } else if (elType.equals("import") || elType.equals("include")) { // If either an import or an include is defined, we need to get // the referenced file so store its location (if appropriate) @@ -125,7 +127,7 @@ * Get all the locations of imported/included schemas so that they can also be retrieved * @return An array of all the import/include schemaLocations */ - String[] getimportsAndIncludes() { + String[] getImportsAndIncludes() { return (String[]) iai.toArray(new String[iai.size()]); } } 1.2 +11 -6 xml-axis-wsif/java/src/org/apache/wsif/schema/ComplexType.java Index: ComplexType.java =================================================================== RCS file: /home/cvs/xml-axis-wsif/java/src/org/apache/wsif/schema/ComplexType.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- ComplexType.java 15 Oct 2002 15:33:12 -0000 1.1 +++ ComplexType.java 8 Nov 2002 16:51:24 -0000 1.2 @@ -75,7 +75,7 @@ private boolean isAnArray = false; private String name = ""; - private QName type = null; + private QName typeName = null; private QName arrayType = null; private int arrayDim = 0; private ComplexContent complexContent = null; @@ -91,8 +91,13 @@ * @param el The dom element for this complexType */ ComplexType(Element el, String tns) { - type = getAttributeQName(el, "name", tns); - name = type.getLocalPart(); + typeName = getAttributeQName(el, "name", tns); + + // If the complexType has no name, we cannot map it. Don't do any more processing + // of this type + if (typeName == null) return; + + name = typeName.getLocalPart(); process(el); if (name.startsWith("ArrayOf")) { if (complexContent != null) { @@ -175,10 +180,10 @@ } /** - * @see SchemaType#getType() + * @see SchemaType#getTypeName() */ - public QName getType() { - return type; + public QName getTypeName() { + return typeName; } private void process(Element el) { 1.3 +106 -9 xml-axis-wsif/java/src/org/apache/wsif/schema/Parser.java Index: Parser.java =================================================================== RCS file: /home/cvs/xml-axis-wsif/java/src/org/apache/wsif/schema/Parser.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- Parser.java 18 Oct 2002 10:30:58 -0000 1.2 +++ Parser.java 8 Nov 2002 16:51:24 -0000 1.3 @@ -85,7 +85,9 @@ import com.ibm.wsdl.util.xml.QNameUtils; /** - * A class used for parsing the schema(s) defined in a Definition object. + * A class used for parsing the schema(s) defined in a Definition object. It does not provide + * full schema parsing. Its main purpose is to help in determining a list off all the types that + * are defined in schemas either inline in the wsdl document or imported xsd files. * * @author Owen Burroughs <[EMAIL PROTECTED]> */ @@ -225,6 +227,10 @@ // after resolving all other types List arrays = new ArrayList(); + // Create temporary list to hold types which are elements. We can then resolve them + // after resolving all other types + List elements = new ArrayList(); + // Iterate through all the schemas found in the wsdl and imports Iterator si = schemaList.iterator(); while (si.hasNext()) { @@ -238,13 +244,46 @@ // Ignore null types if (st == null) continue; - QName type = st.getType(); + QName typeName = st.getTypeName(); + if (typeName == null) + continue; + if (st.isArray()) { arrays.add(st); } else { - String className = resolveClassName(type); - if (className != null) { - table.put(type, className); + // Deal with elements + if (st instanceof ElementType) { + QName baseType = ((ElementType) st).getElementType(); + + if (baseType != null) { + String baseClassName = + (String) table.get(baseType); + if (baseClassName == null + && !includeStandardMappings) { + baseClassName = + (String) standards.get(baseType); + ; + } + if (baseClassName != null) { + table.put(typeName, baseClassName); + } else { + elements.add(st); + } + } else { + String className = resolveClassName(typeName); + // Distinguish the class for this element from a complexType with the same name + // by appending "Element" onto the class name. + className = className + "Element"; + if (className != null) { + table.put(typeName, className); + } + } + } else { + // Deal with complexTypes and simpleTypes + String className = resolveClassName(typeName); + if (className != null) { + table.put(typeName, className); + } } } } @@ -259,7 +298,9 @@ while (ai.hasNext()) { SchemaType st = (SchemaType) ai.next(); // We've already checked that its an array so cut to the chase! - QName theType = st.getType(); + QName theType = st.getTypeName(); + if (theType == null) continue; + QName arrayType = st.getArrayType(); if (arrayType != null && theType != null) { String baseClass = (String) table.get(arrayType); @@ -314,7 +355,9 @@ Iterator mi = multiArrays.iterator(); while (mi.hasNext()) { SchemaType st = (SchemaType) mi.next(); - QName theType = st.getType(); + QName theType = st.getTypeName(); + if (theType == null) continue; + QName arrayType = st.getArrayType(); if (arrayType != null && theType != null) { String extraDims = ""; @@ -331,10 +374,64 @@ } } } + + // Finally we'll resolve any elements that are outstanding + Iterator ei = elements.iterator(); + while (ei.hasNext()) { + SchemaType st = (SchemaType) ei.next(); + QName theType = st.getTypeName(); + if (theType == null) + continue; + + QName baseType = null; + if (st instanceof ElementType) { + baseType = ((ElementType) st).getElementType(); + } + if (baseType != null) { + String baseClassName = (String) table.get(baseType); + if (baseClassName != null) { + table.put(theType, baseClassName); + } + } + } + Trc.exit(); } /** + * Populate a List with all the top level SchemaType objects (complexTypes, simpleTypes and elements) generated + * by parsing the schemas associated with a Definition object + * @param def The Definition object representing the wsdl + * @param schemaTypes The List to proulate with the SchemaType objects + * @param loc WSDLLocator equal or equivalent to that used to locate the original wsdl document. This is required in order + * to resolve imported schemas. + * @exception A WSIFException is thrown if a problem occurs when parsing the schemas + */ + public static void getAllSchemaTypes(Definition def, List schemaTypes, WSDLLocator loc) throws WSIFException { + try { + ArrayList schemas = new ArrayList(); + Parser.getTypesSchemas(def, schemas, null); + Iterator si = schemas.iterator(); + while (si.hasNext()) { + Schema ts = (Schema) si.next(); + if (ts != null) { + // Get all the types defined in this schema + List types = ts.getTypes(); + Iterator ti = types.iterator(); + while (ti.hasNext()) { + SchemaType st = (SchemaType) ti.next(); + // Ignore null types + if (st == null) + continue; + schemaTypes.add(st); + } + } + } + } catch (WSIFException e) { + } + } + + /** * Populate a map with the standard xml type -> Java class name mappings */ private static void populateWithStandardMappings( @@ -425,7 +522,7 @@ schemas.add(sc); String docBase = def.getDocumentBaseURI(); if (docBase != null && loc != null) { - String[] importsAndIncludes = sc.getimportsAndIncludes(); + String[] importsAndIncludes = sc.getImportsAndIncludes(); for (int i=0; i<importsAndIncludes.length; i++) { String sl = importsAndIncludes[i]; getImportedSchemas(docBase, sl, loc, schemas); @@ -495,7 +592,7 @@ || QNameUtils.matches(schema1999, el)) { Schema sc = new Schema(el); schemaList.add(sc); - String[] importsAndIncludes = sc.getimportsAndIncludes(); + String[] importsAndIncludes = sc.getImportsAndIncludes(); String lastURI = loc.getLatestImportURI(); for (int i=0; i<importsAndIncludes.length; i++) { String sl = importsAndIncludes[i]; 1.2 +139 -0 xml-axis-wsif/java/src/org/apache/wsif/schema/ElementType.java