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]