Author: mukulg
Date: Wed Oct 16 05:34:17 2019
New Revision: 1868498

URL: http://svn.apache.org/viewvc?rev=1868498&view=rev
Log:
committing fix for jira issue XERCESJ-1674

Modified:
    
xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDComplexTypeTraverser.java
    
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/XSDComplexTypeTraverser.java
URL: 
http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDComplexTypeTraverser.java?rev=1868498&r1=1868497&r2=1868498&view=diff
==============================================================================
--- 
xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDComplexTypeTraverser.java
 (original)
+++ 
xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDComplexTypeTraverser.java
 Wed Oct 16 05:34:17 2019
@@ -16,6 +16,7 @@
  */
 package org.apache.xerces.impl.xs.traversers;
 
+import java.util.Enumeration;
 import java.util.Vector;
 
 import org.apache.xerces.impl.Constants;
@@ -1732,8 +1733,9 @@ class XSDComplexTypeTraverser extends XS
             Test testExpr = new Test(testStr, schemaDoc.fNamespaceSupport, 
assertImpl);
             String xpathDefaultNamespace = 
getXPathDefaultNamespaceForAssert(assertElement, schemaDoc, attrValues);
             assertImpl.setTest(testExpr, assertElement);
-            assertImpl.setXPathDefaultNamespace(xpathDefaultNamespace);
-            assertImpl.setXPath2NamespaceContext(new 
SchemaNamespaceSupport(schemaDoc.fNamespaceSupport));            
+            assertImpl.setXPathDefaultNamespace(xpathDefaultNamespace);        
    
+            SchemaNamespaceSupport schemaNamespaceSupport = 
normalizeNsContextForAssertInOverride(schemaDoc, assertElement);
+            assertImpl.setXPath2NamespaceContext(schemaNamespaceSupport);      
      
             String assertMessage = 
XMLChar.trim(assertElement.getAttributeNS(SchemaSymbols.URI_XERCES_EXTENSIONS, 
SchemaSymbols.ATT_ASSERT_MESSAGE));
             if (!"".equals(assertMessage)) {
                assertImpl.setMessage(assertMessage);
@@ -1761,8 +1763,113 @@ class XSDComplexTypeTraverser extends XS
 
         fAttrChecker.returnAttrArray(attrValues, schemaDoc);
         
-    } // traverseAsserts
+    } // traverseAsserts    
     
+    /*
+     * For the case when xs:assert is present as descendant of xs:override, 
restoring part of namespace context
+     * that is modified due to xs:override transformation. 
+     */
+    private SchemaNamespaceSupport 
normalizeNsContextForAssertInOverride(XSDocumentInfo schemaDoc, Element 
assertElement) {
+        
+        SchemaNamespaceSupport schemaNamespaceSupport = new 
SchemaNamespaceSupport(schemaDoc.fNamespaceSupport);
+        XSDocumentInfo overridingSchemaDoc = 
fSchemaHandler.getOverridingSchemaDocument(schemaDoc);
+        Enumeration allPrefixes = null;
+        
+        if (overridingSchemaDoc != null) {            
+            allPrefixes = schemaNamespaceSupport.getAllPrefixes();
+            while (allPrefixes.hasMoreElements()) {
+                String prefix = (String)allPrefixes.nextElement();
+                if (isNsDeclOnSchemaElementOfOverridenSchema(prefix, 
assertElement)) {
+                    schemaNamespaceSupport.deletePrefix(prefix);
+                }
+            }
+            
+            Element overridingXsElem = 
fSchemaHandler.getOverridingXSElement(schemaDoc);
+            Attr[] attrNodes = DOMUtil.getAttrs(overridingXsElem);
+            for (int idx = 0; idx < attrNodes.length; idx++) {
+                Attr attr = attrNodes[idx];
+                String attrName = attr.getName();
+                int indexOfColonInAttrName = attrName.indexOf(':');
+                if (indexOfColonInAttrName != -1) {
+                    String nsPrefix = 
attrName.substring(indexOfColonInAttrName + 1);
+                    String nsUri = attr.getValue();
+                    schemaNamespaceSupport.declarePrefix(nsPrefix, nsUri);
+                }
+            }
+            
+            allPrefixes = 
overridingSchemaDoc.fNamespaceSupport.getAllPrefixes();
+            while (allPrefixes.hasMoreElements()) {
+                String prefix = (String)allPrefixes.nextElement();
+                if (!(prefix == XMLSymbols.PREFIX_XML || prefix == 
XMLSymbols.PREFIX_XMLNS || isNsDeclOnComplexTypeTree(prefix, assertElement))) {
+                    schemaNamespaceSupport.declarePrefix(prefix, 
overridingSchemaDoc.fNamespaceSupport.getURI(prefix));
+                }
+            }
+        }
+        
+        return schemaNamespaceSupport;
+        
+    } // normalizeNsContextForAssertInOverride
+    
+    /*
+     * During xs:assert evaluations that are descendant of xs:override, this 
method finds whether a given namespace prefix
+     * is declared on xs:schema element of the overridden schema.
+     */
+    private boolean isNsDeclOnSchemaElementOfOverridenSchema(String prefix, 
Element assertElement) {
+        
+        boolean isNamespaceDeclOnSchemaElement = false;
+        
+        Element docElement = 
DOMUtil.getRoot(DOMUtil.getDocument(assertElement));
+        Attr[] attrNodes = DOMUtil.getAttrs(docElement);
+        for (int idx = 0; idx < attrNodes.length; idx++) {
+            Attr attr = attrNodes[idx];
+            String attrName = attr.getName();
+            int indexOfColonInAttrName = attrName.indexOf(':');
+            if (indexOfColonInAttrName != -1) {
+                String nsPrefix = attrName.substring(indexOfColonInAttrName + 
1);
+                if (nsPrefix.equals(prefix)) {
+                    isNamespaceDeclOnSchemaElement = true;
+                    break;
+                }
+            }
+        }
+        
+        return isNamespaceDeclOnSchemaElement;
+        
+    } // isNsDeclOnSchemaElementOfOverridenSchema
+    
+    /*
+     * During xs:assert evaluations that are descendant of xs:override, this 
method finds whether a given namespace prefix 
+     * is declared on XSD schema elements that are ancestors of xs:assert 
under evaluation, upto an XSD element that is child 
+     * of xs:schema element.
+     */
+    private boolean isNsDeclOnComplexTypeTree(String prefix, Element elem) {
+        
+        boolean isNsDeclOnComplexTypeTree = false;
+        
+        Attr[] attrNodes = DOMUtil.getAttrs(elem);
+        for (int idx = 0; idx < attrNodes.length; idx++) {
+            Attr attr = attrNodes[idx];
+            String attrName = attr.getName();
+            int indexOfColonInAttrName = attrName.indexOf(':');
+            if (indexOfColonInAttrName != -1) {
+                String nsPrefix = attrName.substring(indexOfColonInAttrName + 
1);
+                if (nsPrefix.equals(prefix)) {
+                    isNsDeclOnComplexTypeTree = true;
+                    break;
+                }
+            }
+        }
+        
+        if (!isNsDeclOnComplexTypeTree) {
+            Element parentElem = DOMUtil.getParent(elem);             
+            if (parentElem != 
DOMUtil.getRoot(DOMUtil.getDocument(parentElem))) {
+                isNsDeclOnComplexTypeTree = isNsDeclOnComplexTypeTree(prefix, 
parentElem); 
+            }
+        }
+        
+        return isNsDeclOnComplexTypeTree;
+        
+    } // isNsDeclOnComplexTypeTree
     
     /*
      * Get effective value of 'xpathDefaultNamespace' for assert.

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=1868498&r1=1868497&r2=1868498&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
 Wed Oct 16 05:34:17 2019
@@ -393,6 +393,10 @@ public class XSDHandler {
     // schema documents are represented by XSDocumentInfo objects.
     private Hashtable fOverrideDependencyMap = new Hashtable();
     
+    // map between a schema document, and DOM nodes corresponding to 
xs:override
+    // that are present in the schema.
+    private Hashtable fOverrideDependencyMapNsNormalization = new Hashtable();
+    
     // map between <redefine> elements and the namespace support
     private Hashtable fRedefine2NSSupport = new Hashtable();
     
@@ -999,6 +1003,7 @@ public class XSDHandler {
         fDoc2XSDocumentMap.put(schemaRoot, currSchemaInfo);
         Vector dependencies = new Vector();
         Vector overrideDependencies = new Vector();
+        Vector overrideDependenciesNsNormalization = new Vector();
         Element rootNode = schemaRoot;
         
         Element newSchemaRoot = null;
@@ -1275,7 +1280,8 @@ public class XSDHandler {
             }
             if (fSchemaVersion == Constants.SCHEMA_VERSION_1_1 && 
localName.equals(SchemaSymbols.ELT_OVERRIDE) && newSchemaInfo != null) {
                 // record this override dependency
-                overrideDependencies.addElement(newSchemaInfo);  
+                overrideDependencies.addElement(newSchemaInfo);
+                overrideDependenciesNsNormalization.addElement(child);
             }
             if (newSchemaRoot != null) {
                 if (newSchemaInfo != null)
@@ -1286,8 +1292,11 @@ public class XSDHandler {
         
         if (fSchemaVersion == Constants.SCHEMA_VERSION_1_1) {
            fOverrideDependencyMap.put(currSchemaInfo, overrideDependencies);
+           fOverrideDependencyMapNsNormalization.put(currSchemaInfo, 
overrideDependenciesNsNormalization);
         }
+        
         fDependencyMap.put(currSchemaInfo, dependencies);
+        
         return currSchemaInfo;
     } // end constructTrees
     
@@ -4010,7 +4019,7 @@ public class XSDHandler {
      * 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 getOverridingSchemaDocument(XSDocumentInfo currSchema) {
         
         XSDocumentInfo schemaDoc = null;
         
@@ -4027,6 +4036,28 @@ public class XSDHandler {
         return schemaDoc;
         
     } // getOverridingSchemaDocument
+    
+    /*
+     * For a given schema document object (the 'currSchema' argument), this 
method finds
+     * the DOM reference element for xs:override, that has overriden the given 
schema.
+     */
+    Element getOverridingXSElement(XSDocumentInfo currSchema) {
+        
+        Enumeration overridingSchemas = fOverrideDependencyMap.keys();
+        while (overridingSchemas.hasMoreElements()) {
+            XSDocumentInfo overridingSchema = 
(XSDocumentInfo)overridingSchemas.nextElement();
+            Vector overridenSchemas = 
(Vector)fOverrideDependencyMap.get(overridingSchema);
+            Vector overridingElems = 
(Vector)fOverrideDependencyMapNsNormalization.get(overridingSchema);
+            for (int idx = 0; idx < overridenSchemas.size(); idx++) {
+                if (currSchema.equals(overridenSchemas.get(idx))) {
+                    return (Element)overridingElems.get(idx);
+                }
+            }
+        }
+        
+        return null;
+        
+    } // getOverridingXSElement
 
     private boolean removeParticle(XSModelGroupImpl group, XSParticleDecl 
particle) {
         XSParticleDecl member;



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to