You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commons-dev@ws.apache.org by bi...@apache.org on 2008/12/14 23:27:37 UTC

svn commit: r726564 - in /webservices/commons/trunk/modules/XmlSchema: ./ src/main/java/org/apache/ws/commons/schema/ src/main/java/org/apache/ws/commons/schema/resolver/ src/test/java/tests/ src/test/test-resources/WSCOMMONS-377/

Author: bimargulies
Date: Sun Dec 14 14:27:37 2008
New Revision: 726564

URL: http://svn.apache.org/viewvc?rev=726564&view=rev
Log:
Merged revisions 726532 via svnmerge from 
https://svn.apache.org/repos/asf/webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH

........
  r726532 | bimargulies | 2008-12-14 16:25:18 -0500 (Sun, 14 Dec 2008) | 5 lines
  
  WSCOMMONS-377.
  
  Add functionality so that the base URI of an XmlSchemaCollection is used to resolve imports inside of a 
  schema when that schemas's system ID is not usable as a base URI. I'm calling this a fix to 377.
........

Added:
    webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/resolver/CollectionURIResolver.java
      - copied unchanged from r726532, webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH/src/main/java/org/apache/ws/commons/schema/resolver/CollectionURIResolver.java
    webservices/commons/trunk/modules/XmlSchema/src/test/java/tests/WSCOMMONS377Test.java
      - copied unchanged from r726532, webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH/src/test/java/tests/WSCOMMONS377Test.java
    webservices/commons/trunk/modules/XmlSchema/src/test/test-resources/WSCOMMONS-377/
      - copied from r726532, webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH/src/test/test-resources/WSCOMMONS-377/
    webservices/commons/trunk/modules/XmlSchema/src/test/test-resources/WSCOMMONS-377/importedElements.xsd
      - copied unchanged from r726532, webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH/src/test/test-resources/WSCOMMONS-377/importedElements.xsd
    webservices/commons/trunk/modules/XmlSchema/src/test/test-resources/WSCOMMONS-377/importedTypes.xsd
      - copied unchanged from r726532, webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH/src/test/test-resources/WSCOMMONS-377/importedTypes.xsd
    webservices/commons/trunk/modules/XmlSchema/src/test/test-resources/WSCOMMONS-377/importing.wsdl
      - copied unchanged from r726532, webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH/src/test/test-resources/WSCOMMONS-377/importing.wsdl
Modified:
    webservices/commons/trunk/modules/XmlSchema/   (props changed)
    webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java
    webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/XmlSchemaCollection.java
    webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/resolver/DefaultURIResolver.java

Propchange: webservices/commons/trunk/modules/XmlSchema/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Sun Dec 14 14:27:37 2008
@@ -1 +1 @@
-/webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH:1-726531
+/webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH:1-726532

Modified: webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java?rev=726564&r1=726563&r2=726564&view=diff
==============================================================================
--- webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java (original)
+++ webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java Sun Dec 14 14:27:37 2008
@@ -126,15 +126,15 @@
 	/**
 	 * handles the schema element
 	 * @param schemaEl
-	 * @param uri
+	 * @param systemId
 	 */
-	XmlSchema handleXmlSchemaElement(Element schemaEl, String uri) {
+	XmlSchema handleXmlSchemaElement(Element schemaEl, String systemId) {
 		// get all the attributes along with the namespace declns
 		schema.setNamespaceContext(NodeNamespaceContext.getNamespaceContext(schemaEl));
 		setNamespaceAttributes(schema, schemaEl);
 
 		XmlSchemaCollection.SchemaKey schemaKey = new XmlSchemaCollection.SchemaKey(
-				schema.logicalTargetNamespace, uri);
+				schema.logicalTargetNamespace, systemId);
 		if (!collection.containsSchema(schemaKey)) {
 			collection.addSchema(schemaKey, schema);
 			schema.parent = collection; // establish parentage now.
@@ -153,7 +153,7 @@
 			schema.id = schemaEl.getAttribute("id");
 		}
 
-		schema.setSourceURI(uri);
+		schema.setSourceURI(systemId);
 
 		/***********
 		 * for ( each childElement)

Modified: webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/XmlSchemaCollection.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/XmlSchemaCollection.java?rev=726564&r1=726563&r2=726564&view=diff
==============================================================================
--- webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/XmlSchemaCollection.java (original)
+++ webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/XmlSchemaCollection.java Sun Dec 14 14:27:37 2008
@@ -42,6 +42,7 @@
 
 import org.apache.ws.commons.schema.constants.Constants;
 import org.apache.ws.commons.schema.extensions.ExtensionRegistry;
+import org.apache.ws.commons.schema.resolver.CollectionURIResolver;
 import org.apache.ws.commons.schema.resolver.DefaultURIResolver;
 import org.apache.ws.commons.schema.resolver.URIResolver;
 import org.apache.ws.commons.schema.utils.DOMUtil;
@@ -94,20 +95,27 @@
 	}
 	
 	
-	
-    static class SchemaKey {
+	/**
+	 * Key that identifies a schema in a collection, composed of a targetNamespace
+	 * and a system ID. 
+	 */
+    public static class SchemaKey {
         private final String namespace;
         private final String systemId;
         SchemaKey(String pNamespace, String pSystemId) {
             namespace = pNamespace == null ? Constants.NULL_NS_URI : pNamespace;
             systemId = pSystemId == null ? "" : pSystemId;
         }
+        
         String getNamespace() { return namespace; }
+        
         String getSystemId() { return systemId; }
+        
         public int hashCode() {
             final int PRIME = 31;
             return (PRIME + namespace.hashCode()) * PRIME + systemId.hashCode();
         }
+        
         public boolean equals(Object obj) {
             if (this == obj)
                 return true;
@@ -118,6 +126,7 @@
             final SchemaKey other = (SchemaKey) obj;
             return namespace.equals(other.namespace)  &&  systemId.equals(other.systemId);
         }
+        
         public String toString() {
             return Constants.NULL_NS_URI.equals(namespace) ?
                     systemId : ("{" + namespace + "}" + systemId);
@@ -156,10 +165,15 @@
     /**
      * Set the base URI. This is used when schemas need to be
      * loaded from relative locations
-     * @param baseUri  baseUri for this
+     * @param baseUri  baseUri for this collection.
      */
-    public void setBaseUri(String baseUri){
+    public void setBaseUri(String baseUri) {
         this.baseUri = baseUri;
+        if(schemaResolver instanceof CollectionURIResolver) {
+        	CollectionURIResolver resolverWithBase = 
+        		(CollectionURIResolver) schemaResolver;
+        	resolverWithBase.setCollectionBaseURI(baseUri);
+        }
     }
 
     /**
@@ -396,10 +410,26 @@
         return doc;
     }
 
+    /**
+     * Read an XML schema into the collection from a SAX InputSource.
+     * Schemas in a collection must be unique in the concatenation of system ID and
+     * targetNamespace. In this API, the systemID is taken from the source.
+     * @param inputSource the XSD document.
+     * @param veh handler that is called back for validation.
+     * @return the XML schema object.
+     */
     public XmlSchema read(InputSource inputSource, ValidationEventHandler veh) {
         return read(inputSource, veh, null);
     }
-
+    
+    /**
+     * Read an XML schema into the collection from a TRaX source. 
+     * Schemas in a collection must be unique in the concatenation of system ID and
+     * targetNamespace. In this API, the systemID is taken from the Source.
+     * @param source the XSD document.
+     * @param veh handler that is called back for validation.
+     * @return the XML schema object.
+     */
     public XmlSchema read(Source source, ValidationEventHandler veh) {
         if (source instanceof SAXSource) {
             return read(((SAXSource) source).getInputSource(), veh);
@@ -422,12 +452,27 @@
         }
     }
 
+    /**
+     * Read an XML schema into the collection from a DOM document. 
+     * Schemas in a collection must be unique in the concatenation of system ID and
+     * targetNamespace. In this API, the systemID is taken from the document.
+     * @param doc the XSD document.
+     * @param veh handler that is called back for validation.
+     * @return the XML schema object.
+     */
     public XmlSchema read(Document doc, ValidationEventHandler veh) {
         SchemaBuilder builder = new SchemaBuilder(this, null);
         return builder.build(doc, null, veh);
     }
 
    
+    /**
+     * Read an XML Schema into the collection from a DOM element. Schemas in a collection
+     * must be unique in the concatentation of System ID and targetNamespace. The system ID will 
+     * be empty for this API.
+     * @param elem the DOM element for the schema.
+     * @return the XmlSchema
+     */
     public XmlSchema read(Element elem) {
         SchemaBuilder builder = new SchemaBuilder(this, null);
         XmlSchema xmlSchema = builder.handleXmlSchemaElement(elem, null);
@@ -435,25 +480,51 @@
         return xmlSchema;
     }
 
-    public XmlSchema read(Document doc, String uri, ValidationEventHandler veh) {
-        return read(doc, uri, veh, null);
+    /**
+     * Read an XML Schema from a complete XSD XML DOM Document into this collection.
+     * Schemas in a collection must be unique in
+     * the concatenation of SystemId and targetNamespace.
+     * @param doc The schema document.
+     * @param systemId System ID for this schema.
+     * @param veh handler to be called to check validity of the schema.
+     * @return the schema object.
+     */
+    public XmlSchema read(Document doc, String systemId, ValidationEventHandler veh) {
+        return read(doc, systemId, veh, null);
     }
 
-    public XmlSchema read(Document doc, String uri, ValidationEventHandler veh,
+    /**
+     * Read an XML Schema from a complete XSD XML DOM Document into this collection.
+     *  Schemas in a collection must be unique in
+     * the concatenation of SystemId and targetNamespace.
+     * @param doc Source document.
+     * @param systemId System id.
+     * @param veh Stub for future capability to handle validation errors.
+     * @param validator object that is called back to check validity of the target namespace.
+     * @return the schema object.
+     */
+    public XmlSchema read(Document doc, String systemId, ValidationEventHandler veh,
             TargetNamespaceValidator validator) {
         SchemaBuilder builder = new SchemaBuilder(this, validator);
-        XmlSchema schema = builder.build(doc, uri, veh);
+        XmlSchema schema = builder.build(doc, systemId, veh);
         schema.setInputEncoding(DOMUtil.getInputEncoding(doc));
 		return schema;
     }
 
-    public XmlSchema read(Element elem, String uri) {
+    /**
+     * Read a schema from a DOM tree into the collection. The schemas in a collection must be unique
+     * in the concatenation of the target namespace and the system ID.  
+     * @param elem xs:schema DOM element.
+     * @param systemId System id.
+     * @return the schema object.
+     */
+    public XmlSchema read(Element elem, String systemId) {
         SchemaBuilder builder = new SchemaBuilder(this, null);
-        XmlSchema xmlSchema = builder.handleXmlSchemaElement(elem, uri);
+        XmlSchema xmlSchema = builder.handleXmlSchemaElement(elem, systemId);
         xmlSchema.setInputEncoding(DOMUtil.getInputEncoding(elem.getOwnerDocument()));
         return xmlSchema;
     }
-
+    
     /**
      * Creates new XmlSchemaCollection
      */
@@ -462,7 +533,7 @@
     }
 
     /**
-     * Retrieve a set of XmlSchema instances with the given its system ID.
+     * Retrieve a set containing the XmlSchema instances with the given system ID.
      * In general, this will return a single instance, or none. However,
      * if the schema has no targetNamespace attribute and was included
      * from schemata with different target namespaces, then it may
@@ -494,33 +565,46 @@
         return (XmlSchema[]) c.toArray(new XmlSchema[c.size()]);
     }
 
+    
+    /**
+     * Retrieve a global element from the schema collection. 
+     * @param qname the element QName.
+     * @return the element object, or null.
+     */
     public XmlSchemaElement getElementByQName(QName qname) {
-        String uri = qname.getNamespaceURI();
-        for (Iterator iter = schemas.entrySet().iterator();  iter.hasNext();  ) {
-            Map.Entry entry = (Map.Entry) iter.next();
-            if (((SchemaKey) entry.getKey()).getNamespace().equals(uri)) {
-                XmlSchemaElement element = ((XmlSchema) entry.getValue()).getElementByName(qname);
-                if (element != null) {
-                    return element;
-                }
-        }
-        }
-        return null;
-    }
+		String uri = qname.getNamespaceURI();
+		for (Iterator iter = schemas.entrySet().iterator(); iter.hasNext();) {
+			Map.Entry entry = (Map.Entry) iter.next();
+			if (((SchemaKey) entry.getKey()).getNamespace().equals(uri)) {
+				XmlSchemaElement element = ((XmlSchema) entry.getValue())
+						.getElementByName(qname);
+				if (element != null) {
+					return element;
+				}
+			}
+		}
+		return null;
+	}
 
+    /**
+     * Retrieve a global type from the schema collection.
+     * @param schemaTypeName the QName of the type.
+     * @return the type object, or null.
+     */
     public XmlSchemaType getTypeByQName(QName schemaTypeName) {
-        String uri = schemaTypeName.getNamespaceURI();
-        for (Iterator iter = schemas.entrySet().iterator();  iter.hasNext();  ) {
-            Map.Entry entry = (Map.Entry) iter.next();
-            if (((SchemaKey) entry.getKey()).getNamespace().equals(uri)) {
-                XmlSchemaType type = ((XmlSchema) entry.getValue()).getTypeByName(schemaTypeName);
-                if (type != null) {
-                    return type;
-                }
-        }
-        }
-        return null;
-    }
+		String uri = schemaTypeName.getNamespaceURI();
+		for (Iterator iter = schemas.entrySet().iterator(); iter.hasNext();) {
+			Map.Entry entry = (Map.Entry) iter.next();
+			if (((SchemaKey) entry.getKey()).getNamespace().equals(uri)) {
+				XmlSchemaType type = ((XmlSchema) entry.getValue())
+						.getTypeByName(schemaTypeName);
+				if (type != null) {
+					return type;
+				}
+			}
+		}
+		return null;
+	}
     
     /**
      * Find a global attribute by QName in this collection of schemas.
@@ -578,23 +662,49 @@
         unresolvedTypes.remove(typeName);
     }
 
+    /**
+     * Retrieve the namespace context.
+     * @return the namespace context.
+     */
     public NamespacePrefixList getNamespaceContext() {
         return namespaceContext;
     }
 
+    /**
+     * Set the namespace context for this collection, which controls the assignment of
+     * namespace prefixes to namespaces.
+     * @param namespaceContext the context.
+     */
     public void setNamespaceContext(NamespacePrefixList namespaceContext) {
         this.namespaceContext = namespaceContext;
     }
 
-    public void push(SchemaKey pKey){
+    /**
+     * Push a schema onto the stack of schemas.
+     *  This function, while public, is probably not useful outside of 
+     * the implementation.
+     * @param pKey the schema key.
+     */
+    public void push(SchemaKey pKey) {
         stack.push(pKey);
     }
 
-    public void pop(){
+    /**
+     * Pop the stack of schemas. This function, while public, is probably not useful outside of 
+     * the implementation.
+     */
+    public void pop() {
         stack.pop();
     }
 
-    public boolean check(SchemaKey pKey){
+    /**
+     * Return an indication of whether a particular schema is in the working stack of 
+     * schemas. This function, while public, is probably not useful outside of 
+     * the implementation.
+     * @param pKey schema key
+     * @return true if the schema is in the stack.
+     */
+    public boolean check(SchemaKey pKey) {
         return (stack.indexOf(pKey)==-1);
     }
 

Modified: webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/resolver/DefaultURIResolver.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/resolver/DefaultURIResolver.java?rev=726564&r1=726563&r2=726564&view=diff
==============================================================================
--- webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/resolver/DefaultURIResolver.java (original)
+++ webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/resolver/DefaultURIResolver.java Sun Dec 14 14:27:37 2008
@@ -31,28 +31,36 @@
 /**
  * This resolver provides the means of resolving the imports and includes of a
  * given schema document. The system will call this default resolver if there
- * is no other resolver present in the system
+ * is no other resolver present in the system. 
  */
-public class DefaultURIResolver implements URIResolver {
+public class DefaultURIResolver implements CollectionURIResolver {
+	
+	private String collectionBaseURI;
 
 
     /**
-     * As for the resolver the publid ID is the target namespace of the
-     * schema and the schemaLocation is the value of the schema location
-     * @param namespace
-     * @param schemaLocation
-     * @param baseUri
+     * Try to resolve a schema location to some data.
+     * @param namespace targt namespace.
+     * @param schemaLocation system ID.
+     * @param baseUri base URI for the schema.
      */
     public InputSource resolveEntity(String namespace,
                                      String schemaLocation,
-                                     String baseUri){
+                                     String baseUri) {
 
         if (baseUri!=null) 
         {
             try
             {
                 File baseFile = new File(baseUri);
-                if (baseFile.exists()) baseUri = baseFile.toURI().toString();
+                if (baseFile.exists()) {
+                	baseUri = baseFile.toURI().toString();
+                } else if(collectionBaseURI != null) {
+                	baseFile = new File(collectionBaseURI);
+                    if (baseFile.exists()) {
+                    	baseUri = baseFile.toURI().toString();
+                    }
+                }
                 
                 String ref = new URI(baseUri).resolve(new URI(schemaLocation)).toString();
 
@@ -161,4 +169,20 @@
 
         return new URL("file", "", path);
     }    // getFileURL
+
+    /**
+     * Get the base URI derived from a schema collection. It serves as a fallback from the specified base.
+     * @return URI
+     */
+	public String getCollectionBaseURI() {
+		return collectionBaseURI;
+	}
+
+	/**
+	 * set the collection base URI, which serves as a fallback from the base of the immediate schema.
+	 * @param collectionBaseURI the URI.
+	 */
+	public void setCollectionBaseURI(String collectionBaseURI) {
+		this.collectionBaseURI = collectionBaseURI;
+	}
 }