Author: mukulg
Date: Fri Dec 28 01:37:22 2012
New Revision: 1426377

URL: http://svn.apache.org/viewvc?rev=1426377&view=rev
Log:
committing fix for jira issue, XERCESJ-1599 along with few test cases.

Modified:
    
xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDHandler.java

Modified: 
xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDHandler.java
URL: 
http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDHandler.java?rev=1426377&r1=1426376&r2=1426377&view=diff
==============================================================================
--- 
xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDHandler.java
 (original)
+++ 
xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDHandler.java
 Fri Dec 28 01:37:22 2012
@@ -391,6 +391,10 @@ public class XSDHandler {
     // objects that correspond to the documents being redefined.
     private Hashtable fRedefine2XSDMap = new Hashtable();
     
+    // map between a schema document and the schema documents it is overriding.
+    // schema documents are represented by XSDocumentInfo objects.
+    private Hashtable fOverrideDependencyMap = new Hashtable();
+    
     // map between <redefine> elements and the namespace support
     private Hashtable fRedefine2NSSupport = new Hashtable();
     
@@ -997,6 +1001,7 @@ public class XSDHandler {
         
         fDoc2XSDocumentMap.put(schemaRoot, currSchemaInfo);
         Vector dependencies = new Vector();
+        Vector overrideDependencies = new Vector();
         Element rootNode = schemaRoot;
         
         Element newSchemaRoot = null;
@@ -1271,6 +1276,10 @@ public class XSDHandler {
                 // rename the right things later!
                 fRedefine2XSDMap.put(child, newSchemaInfo);
             }
+            if (fSchemaVersion == Constants.SCHEMA_VERSION_1_1 && 
localName.equals(SchemaSymbols.ELT_OVERRIDE) && newSchemaInfo != null) {
+                // record this override dependency
+                overrideDependencies.addElement(newSchemaInfo);  
+            }
             if (newSchemaRoot != null) {
                 if (newSchemaInfo != null)
                     dependencies.addElement(newSchemaInfo);
@@ -1278,6 +1287,9 @@ public class XSDHandler {
             }
         }
         
+        if (fSchemaVersion == Constants.SCHEMA_VERSION_1_1) {
+           fOverrideDependencyMap.put(currSchemaInfo, overrideDependencies);
+        }
         fDependencyMap.put(currSchemaInfo, dependencies);
         return currSchemaInfo;
     } // end constructTrees
@@ -3955,6 +3967,20 @@ public class XSDHandler {
             //XSDocumentInfo currSchema = 
(XSDocumentInfo)fDoc2XSDocumentMap.get(DOMUtil.getRoot(DOMUtil.getDocument(currElem)));
             XSDocumentInfo currSchema = fLocalElementDecl_schema[i];
             SchemaGrammar currGrammar = 
fGrammarBucket.getGrammar(currSchema.fTargetNamespace);
+            XSDocumentInfo overridingSchema = 
getOverridingSchemaDocument(currSchema);
+            if (overridingSchema != null) {
+                // if this schema was overriden, augment the namespace 
bindings of the current schema with
+                // namespace bindings from the overriding schema. REVISIT: 
doesn't prohibit namespace bindings of
+                // current schema being used.
+                SchemaNamespaceSupport namespaceSupport = 
overridingSchema.fNamespaceSupport;
+                Enumeration prefixes = namespaceSupport.getAllPrefixes();
+                while (prefixes.hasMoreElements()) {
+                    String prefix = (String)prefixes.nextElement();
+                    if 
(!(currSchema.fNamespaceSupport.containsPrefix(prefix))) {
+                        currSchema.fNamespaceSupport.declarePrefix(prefix, 
namespaceSupport.getURI(prefix));  
+                    }
+                }
+            }
             fElementTraverser.traverseLocal (fParticle[i], currElem, 
currSchema, currGrammar, fAllContext[i], fParent[i], 
fLocalElemNamespaceContext[i]);
             // If it's an empty particle, remove it from the containing 
component.
             if (fParticle[i].fType == XSParticleDecl.PARTICLE_EMPTY) {
@@ -3971,8 +3997,30 @@ public class XSDHandler {
                     removeParticle(group, fParticle[i]);
             }
         }
-    }
+    } 
     
+    /*
+     * Find if the current schema document is overridden by another schema 
document. If yes, then
+     * return the overriding schema document.
+     */
+    private XSDocumentInfo getOverridingSchemaDocument(XSDocumentInfo 
currSchema) {
+        
+        XSDocumentInfo schemaDoc = null;
+        
+        Enumeration overridingSchemas = fOverrideDependencyMap.keys();
+        while (overridingSchemas.hasMoreElements()) {
+            XSDocumentInfo overridingSchema = 
(XSDocumentInfo)overridingSchemas.nextElement();
+            Vector overridenSchemas = 
(Vector)fOverrideDependencyMap.get(overridingSchema);
+            if (overridenSchemas.contains(currSchema)) {
+                schemaDoc = overridingSchema;
+                break;
+            }
+        }
+        
+        return schemaDoc;
+        
+    } // getOverridingSchemaDocument
+
     private boolean removeParticle(XSModelGroupImpl group, XSParticleDecl 
particle) {
         XSParticleDecl member;
         for (int i = 0; i < group.fParticleCount; i++) {



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@xerces.apache.org
For additional commands, e-mail: commits-h...@xerces.apache.org

Reply via email to