You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by ow...@apache.org on 2002/10/18 12:30:59 UTC
cvs commit: xml-axis-wsif/java/src/org/apache/wsif/schema Schema.java Parser.java
owenb 2002/10/18 03:30:58
Modified: java/src/org/apache/wsif/schema Schema.java Parser.java
Log:
Added support for imported schemas (xsd files) and also nested schemas
i.e. xsd files that import/include other xsd files
Revision Changes Path
1.2 +17 -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.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Schema.java 15 Oct 2002 15:33:12 -0000 1.1
+++ Schema.java 18 Oct 2002 10:30:57 -0000 1.2
@@ -73,6 +73,7 @@
private String targetNamespace = "";
private ArrayList types = new ArrayList();
+ private ArrayList iai = new ArrayList();
/**
* Constructor
@@ -90,6 +91,13 @@
types.add(new ComplexType(subEl, targetNamespace));
} else if (elType.equals("simpleType")) {
types.add(new SimpleType(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)
+ String loc = subEl.getAttribute("schemaLocation");
+ if (loc != null && !loc.equals("")) {
+ iai.add(loc);
+ }
} else {
//ignore all other types
}
@@ -110,6 +118,14 @@
* @return The "targetNamespace" attribute
*/
String getTargetNamespace() {
- return null;
+ return targetNamespace;
}
+
+ /**
+ * 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() {
+ return (String[]) iai.toArray(new String[iai.size()]);
+ }
}
1.2 +143 -8 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.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Parser.java 15 Oct 2002 15:33:12 -0000 1.1
+++ Parser.java 18 Oct 2002 10:30:58 -0000 1.2
@@ -57,6 +57,7 @@
package org.apache.wsif.schema;
+import java.io.Reader;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
@@ -67,11 +68,19 @@
import javax.wsdl.Import;
import javax.wsdl.Types;
import javax.wsdl.extensions.UnknownExtensibilityElement;
+import javax.wsdl.xml.WSDLLocator;
import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.wsif.WSIFConstants;
+import org.apache.wsif.WSIFException;
+import org.apache.wsif.logging.Trc;
import org.apache.wsif.util.WSIFUtils;
+import org.apache.wsif.wsdl.WSIFWSDLLocatorImpl;
+import org.w3c.dom.Document;
import org.w3c.dom.Element;
+import org.xml.sax.InputSource;
import com.ibm.wsdl.util.xml.QNameUtils;
@@ -95,8 +104,49 @@
* @param def The Definition object representing the wsdl
* @param table The Map to proulate with xml type -> Java class name (QName -> String) mappings
*/
- public static void getTypeMappings(Definition def, Map table) {
- getTypeMappings(def, table, true);
+ public static void getTypeMappings(Definition def, Map table) throws WSIFException {
+ getTypeMappings(def, table, true, null);
+ }
+
+ /**
+ * Given a Definition object, populate a Map with all the types defined in the schemas in the definition and
+ * their corresponding Java class names.
+ * @param def The Definition object representing the wsdl
+ * @param table The Map to proulate with xml type -> Java class name (QName -> String) mappings
+ * @param loader A ClassLoader to use in resolving xsd locations
+ */
+ public static void getTypeMappings(Definition def, Map table, ClassLoader loader) throws WSIFException {
+ WSDLLocator locator = new WSIFWSDLLocatorImpl((String) null, (String) null, loader);
+ getTypeMappings(def, table, true, locator);
+ }
+
+ /**
+ * Given a Definition object, populate a Map with all the types defined in the schemas in the definition and
+ * their corresponding Java class names.
+ * @param def The Definition object representing the wsdl
+ * @param table The Map to proulate with xml type -> Java class name (QName -> String) mappings
+ * @param loader A ClassLoader to use in resolving xsd locations
+ * @param includeStandardMappings Flag to indicate whether or not standard xsd, soapenc and Apache SOAP mappings
+ * should be included in the table
+ */
+ public static void getTypeMappings(
+ Definition def,
+ Map table,
+ ClassLoader loader,
+ boolean includeStandardMappings) throws WSIFException {
+ WSDLLocator locator = new WSIFWSDLLocatorImpl((String) null, (String) null, loader);
+ getTypeMappings(def, table, includeStandardMappings, locator);
+ }
+
+ /**
+ * Given a Definition object, populate a Map with all the types defined in the schemas in the definition and
+ * their corresponding Java class names.
+ * @param def The Definition object representing the wsdl
+ * @param table The Map to proulate with xml type -> Java class name (QName -> String) mappings
+ * @param loc WSDLLocator equal or equivalent to that used to locate the original wsdl document
+ */
+ public static void getTypeMappings(Definition def, Map table, WSDLLocator loc) throws WSIFException {
+ getTypeMappings(def, table, true, loc);
}
/**
@@ -110,10 +160,34 @@
public static void getTypeMappings(
Definition def,
Map table,
- boolean includeStandardMappings) {
- ArrayList schemaList = new ArrayList();
- getTypesSchemas(def, schemaList);
+ boolean includeStandardMappings) throws WSIFException {
+
+ getTypeMappings(def, table, includeStandardMappings, null);
+ }
+ /**
+ * Given a Definition object, populate a Map with all the types defined in the schemas in the definition and
+ * their corresponding Java class names.
+ * @param def The Definition object representing the wsdl
+ * @param table The Map to proulate with xml type -> Java class name (QName -> String) mappings
+ * @param includeStandardMappings Flag to indicate whether or not standard xsd, soapenc and Apache SOAP mappings
+ * should be included in the table
+ * @param loc WSDLLocator equal or equivalent to that used to locate the original wsdl document
+ */
+ public static void getTypeMappings(
+ Definition def,
+ Map table,
+ boolean includeStandardMappings,
+ WSDLLocator loc) throws WSIFException {
+
+ Trc.entry(null, def, table, new Boolean(includeStandardMappings), loc);
+ if (loc == null) {
+ loc = new WSIFWSDLLocatorImpl((String) null, (String) null, null);
+ }
+
+ ArrayList schemaList = new ArrayList();
+ getTypesSchemas(def, schemaList, loc);
+
Hashtable standards = null;
if (includeStandardMappings) {
@@ -257,6 +331,7 @@
}
}
}
+ Trc.exit();
}
/**
@@ -333,7 +408,7 @@
/**
* Get all the schemas defined in the Definition object
*/
- private static void getTypesSchemas(Definition def, List schemas) {
+ private static void getTypesSchemas(Definition def, List schemas, WSDLLocator loc) throws WSIFException {
Types types = def.getTypes();
if (types != null) {
Iterator extEleIt = types.getExtensibilityElements().iterator();
@@ -346,7 +421,16 @@
if (QNameUtils.matches(schema2001, schemaEl)
|| QNameUtils.matches(schema2000, schemaEl)
|| QNameUtils.matches(schema1999, schemaEl)) {
- schemas.add(new Schema(schemaEl));
+ Schema sc = new Schema(schemaEl);
+ schemas.add(sc);
+ String docBase = def.getDocumentBaseURI();
+ if (docBase != null && loc != null) {
+ String[] importsAndIncludes = sc.getimportsAndIncludes();
+ for (int i=0; i<importsAndIncludes.length; i++) {
+ String sl = importsAndIncludes[i];
+ getImportedSchemas(docBase, sl, loc, schemas);
+ }
+ }
}
}
}
@@ -369,12 +453,63 @@
Definition importedDef = tempImport.getDefinition();
if (importedDef != null) {
- getTypesSchemas(importedDef, schemas);
+ getTypesSchemas(importedDef, schemas, loc);
+ } else {
+ String baseLoc = def.getDocumentBaseURI();
+ String importLoc = tempImport.getLocationURI();
+ if (baseLoc != null && importLoc != null && loc != null) {
+ getImportedSchemas(baseLoc, importLoc, loc, schemas);
+ }
}
}
}
}
}
+ }
+ }
+
+ /**
+ * Get all nested schemas
+ */
+ private static void getImportedSchemas(String base, String rel, WSDLLocator loc, List schemaList) throws WSIFException {
+ try {
+ Reader reader = loc.getImportReader(base, rel);
+ if (reader == null) {
+ throw new WSIFException("Unable to read schema file "+rel+" relative to "+base);
+ }
+ InputSource inputSource = new InputSource(reader);
+ DocumentBuilderFactory factory =
+ DocumentBuilderFactory.newInstance();
+
+ factory.setNamespaceAware(true);
+ factory.setValidating(false);
+
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ Document doc = builder.parse(inputSource);
+ reader.close();
+
+ Element el = doc.getDocumentElement();
+ if (el != null) {
+ if (QNameUtils.matches(schema2001, el)
+ || QNameUtils.matches(schema2000, el)
+ || QNameUtils.matches(schema1999, el)) {
+ Schema sc = new Schema(el);
+ schemaList.add(sc);
+ String[] importsAndIncludes = sc.getimportsAndIncludes();
+ String lastURI = loc.getLatestImportURI();
+ for (int i=0; i<importsAndIncludes.length; i++) {
+ String sl = importsAndIncludes[i];
+ getImportedSchemas(lastURI, sl, loc, schemaList);
+ }
+ }
+ }
+ } catch (Exception e) {
+ Trc.exception(e);
+ if (e instanceof WSIFException) {
+ throw (WSIFException) e;
+ } else {
+ throw new WSIFException("Error when getting imported schemas", e);
+ }
}
}