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);
  +        	}
           }
       }