Author: mukulg
Date: Fri Oct 28 09:07:31 2011
New Revision: 1190217

URL: http://svn.apache.org/viewvc?rev=1190217&view=rev
Log:
schema 1.1 commit: 
improving logic to find value of 'xpathDefaultNamespace' for <assert>. we now 
look into the included XSD document as well, to get this value (this was 
specified in one of XSD 1.1 testsuite tests).

Modified:
    
xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDComplexTypeTraverser.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=1190217&r1=1190216&r2=1190217&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
 Fri Oct 28 09:07:31 2011
@@ -20,8 +20,11 @@ import java.util.Vector;
 
 import org.apache.xerces.impl.Constants;
 import org.apache.xerces.impl.dv.InvalidDatatypeFacetException;
+import org.apache.xerces.impl.dv.InvalidDatatypeValueException;
 import org.apache.xerces.impl.dv.XSFacets;
 import org.apache.xerces.impl.dv.XSSimpleType;
+import org.apache.xerces.impl.dv.xs.AnyURIDV;
+import org.apache.xerces.impl.dv.xs.TypeValidator;
 import org.apache.xerces.impl.dv.xs.XSSimpleTypeDecl;
 import org.apache.xerces.impl.xpath.XPath20Assert;
 import org.apache.xerces.impl.xs.SchemaGrammar;
@@ -52,6 +55,7 @@ import org.apache.xerces.xs.XSObject;
 import org.apache.xerces.xs.XSObjectList;
 import org.apache.xerces.xs.XSSimpleTypeDefinition;
 import org.apache.xerces.xs.XSTypeDefinition;
+import org.w3c.dom.Attr;
 import org.w3c.dom.Element;
 
 /**
@@ -1400,18 +1404,15 @@ class  XSDComplexTypeTraverser extends X
     
 
     /*
-     * Find all assertions up in schema type hierarchy, and add them to the 
list
-     * of assertions to be processed.
+     * Find all assertions up in schema type hierarchy, and add them to the 
list of assertions to be processed.
      */
     private void addAssertsFromBaseTypes(XSTypeDefinition baseSchemaType) {
         
         if (baseSchemaType != null) {
             if (baseSchemaType instanceof XSComplexTypeDefinition) {
                // if schema type is a 'complex type'
-               XSObjectList assertList = ((XSComplexTypeDefinition) 
baseSchemaType)
-                                                 .getAssertions();
-               for (int assertLstIdx = 0; assertLstIdx < assertList.size(); 
-                                                                 
assertLstIdx++) {
+               XSObjectList assertList = ((XSComplexTypeDefinition) 
baseSchemaType).getAssertions();
+               for (int assertLstIdx = 0; assertLstIdx < assertList.size(); 
assertLstIdx++) {
                   // add assertion to the list, only if it's already not 
present
                   if (!assertExists((XSAssertImpl) 
assertList.get(assertLstIdx))) {
                      addAssertion((XSAssertImpl) assertList.get(assertLstIdx));
@@ -1420,19 +1421,15 @@ class  XSDComplexTypeTraverser extends X
             }
             else if (baseSchemaType instanceof XSSimpleTypeDefinition) {
                 // if schema type is a 'simple type'
-                XSObjectList facets = ((XSSimpleTypeDefinition) 
baseSchemaType).
-                                                             
getMultiValueFacets();
+                XSObjectList facets = ((XSSimpleTypeDefinition) 
baseSchemaType).getMultiValueFacets();
                 for (int facetIdx = 0; facetIdx < facets.getLength(); 
facetIdx++) {
-                    XSMultiValueFacet facet = (XSMultiValueFacet) facets.
-                                                                     
item(facetIdx);
+                    XSMultiValueFacet facet = (XSMultiValueFacet) 
facets.item(facetIdx);
                     if (facet.getFacetKind() == 
XSSimpleTypeDefinition.FACET_ASSERT) {
                         Vector assertionFacets = facet.getAsserts();
                         for (int j = 0; j < assertionFacets.size(); j++) {
-                           XSAssertImpl assertImpl = (XSAssertImpl) 
-                                                            
assertionFacets.get(j);
+                           XSAssertImpl assertImpl = 
(XSAssertImpl)assertionFacets.get(j);
                            addAssertion(assertImpl);
-                        }
-                       
+                        }                       
                         // among the facet list, there could be only one
                         // assertion facet (which is multi-valued). break from
                         // the loop.
@@ -1444,10 +1441,9 @@ class  XSDComplexTypeTraverser extends X
             
             // invoke the method recursively (traverse up the type hierarchy)
             XSTypeDefinition ancestorType = baseSchemaType.getBaseType();
-            if (ancestorType != null && !(ancestorType.getName().equals(
-                "anyType") || ancestorType.derivedFrom(Constants.NS_XMLSCHEMA,
-                "anyAtomicType", XSConstants.DERIVATION_RESTRICTION))) {       
       
-               addAssertsFromBaseTypes(ancestorType);
+            if (ancestorType != null && 
!(ancestorType.getName().equals(SchemaSymbols.ATTVAL_ANYTYPE) || 
+                                          
ancestorType.derivedFrom(Constants.NS_XMLSCHEMA, 
SchemaSymbols.ATTVAL_ANYATOMICTYPE, XSConstants.DERIVATION_RESTRICTION))) {     
         
+                 addAssertsFromBaseTypes(ancestorType);
             }
         }
         
@@ -1694,19 +1690,7 @@ class  XSDComplexTypeTraverser extends X
     private void traverseAsserts(Element assertElement, XSDocumentInfo 
schemaDoc, SchemaGrammar grammar, XSComplexTypeDecl enclosingCT) throws 
ComplexTypeRecoverableError {
 
         Object[] attrValues = fAttrChecker.checkAttributes(assertElement, 
false, schemaDoc);
-        String test = (String) attrValues[XSAttributeChecker.ATTIDX_XPATH];
-        String xpathDefaultNamespace = (String) 
attrValues[XSAttributeChecker.ATTIDX_XPATHDEFAULTNS];
-        if (xpathDefaultNamespace == null) {
-            if (schemaDoc.fXpathDefaultNamespaceIs2PoundDefault) {
-                xpathDefaultNamespace = 
schemaDoc.fValidationContext.getURI(XMLSymbols.EMPTY_STRING);
-                if (xpathDefaultNamespace != null) {
-                    xpathDefaultNamespace = 
fSymbolTable.addSymbol(xpathDefaultNamespace);
-                }
-            }
-            else {
-                xpathDefaultNamespace = schemaDoc.fXpathDefaultNamespace;
-            }
-        }
+        String test = (String) attrValues[XSAttributeChecker.ATTIDX_XPATH];    
    
 
         if (test != null) {
             // get 'annotation'
@@ -1730,8 +1714,7 @@ class  XSDComplexTypeTraverser extends X
             } else {
                 String text = DOMUtil.getSyntheticAnnotation(childNode);
                 if (text != null) {
-                    annotation = traverseSyntheticAnnotation(childNode, text,
-                                        attrValues, false, schemaDoc);
+                    annotation = traverseSyntheticAnnotation(childNode, text, 
attrValues, false, schemaDoc);
                 }
             }
 
@@ -1748,6 +1731,7 @@ class  XSDComplexTypeTraverser extends X
             // create an assertion object            
             XSAssertImpl assertImpl = new XSAssertImpl(enclosingCT, 
annotations, fSchemaHandler);
             Test testExpr = new Test(new XPath20Assert(test, new 
SchemaNamespaceSupport(schemaDoc.fNamespaceSupport)), assertImpl);
+            String xpathDefaultNamespace = 
getXPathDefaultNamespaceForAssert(assertElement, schemaDoc, attrValues);
             assertImpl.setTest(testExpr, assertElement);
             assertImpl.setXPathDefaultNamespace(xpathDefaultNamespace);
             assertImpl.setXPath2NamespaceContext(new 
SchemaNamespaceSupport(schemaDoc.fNamespaceSupport));
@@ -1776,13 +1760,66 @@ class  XSDComplexTypeTraverser extends X
             }
         } else {
             // 'test' attribute is mandatory in an assert element
-            reportSchemaError("src-assert.3.13.1", new Object[] { DOMUtil
-                    .getLocalName(assertElement) }, assertElement);
+            reportSchemaError("src-assert.3.13.1", new Object[] { 
DOMUtil.getLocalName(assertElement) }, assertElement);
         }
 
         fAttrChecker.returnAttrArray(attrValues, schemaDoc);
         
     } // traverseAsserts
+    
+    
+    /*
+     * Get effective value of 'xpathDefaultNamespace' for assert.
+     */
+    private String getXPathDefaultNamespaceForAssert(Element assertElement, 
XSDocumentInfo schemaDoc, Object[] attrValues) {
+        
+        String xpathDefaultNamespace = (String) 
attrValues[XSAttributeChecker.ATTIDX_XPATHDEFAULTNS];
+        
+        if (xpathDefaultNamespace == null) {
+            if (schemaDoc.fXpathDefaultNamespaceIs2PoundDefault) {
+                xpathDefaultNamespace = 
schemaDoc.fValidationContext.getURI(XMLSymbols.EMPTY_STRING);
+                if (xpathDefaultNamespace != null) {
+                    xpathDefaultNamespace = 
fSymbolTable.addSymbol(xpathDefaultNamespace);
+                }
+            }
+            else {
+                xpathDefaultNamespace = schemaDoc.fXpathDefaultNamespace;
+            }
+        }
+        
+        if (xpathDefaultNamespace == null) {
+            // REVISIT ...
+            // attempt to determine value of 'xpathDefaultNamespace' by 
looking at ancestor xs:schema element. it's possible to
+            // get value of 'xpathDefaultNamespace' from here, for example in 
case of <include> processing. 
+            Element schemaElementName = 
assertElement.getOwnerDocument().getDocumentElement();
+            Attr xpathDefNamespaceAttrNode = 
schemaElementName.getAttributeNode(SchemaSymbols.ATT_XPATH_DEFAULT_NS);
+            if (xpathDefNamespaceAttrNode != null) {
+                xpathDefaultNamespace = xpathDefNamespaceAttrNode.getValue();
+                if 
(SchemaSymbols.ATTVAL_TWOPOUNDTARGETNS.equals(xpathDefaultNamespace)) {
+                    xpathDefaultNamespace = schemaDoc.fTargetNamespace;
+                } else if 
(SchemaSymbols.ATTVAL_TWOPOUNDDEFAULTNS.equals(xpathDefaultNamespace)) {
+                    xpathDefaultNamespace = 
schemaDoc.fValidationContext.getURI(XMLSymbols.EMPTY_STRING);
+                    if (xpathDefaultNamespace != null) {
+                        xpathDefaultNamespace = 
fSymbolTable.addSymbol((String)xpathDefaultNamespace);
+                    }
+                    
attrValues[XSAttributeChecker.ATTIDX_XPATHDEFAULTNS_TWOPOUNDDFLT] = 
Boolean.TRUE;
+                } else if 
(!xpathDefaultNamespace.equals(SchemaSymbols.ATTVAL_TWOPOUNDLOCAL)){
+                    // we have found namespace URI here
+                    try {
+                        TypeValidator anyUriDV = new AnyURIDV(); 
+                        anyUriDV.getActualValue(xpathDefaultNamespace, 
schemaDoc.fValidationContext);
+                        xpathDefaultNamespace = 
fSymbolTable.addSymbol(xpathDefaultNamespace);
+                    } catch (InvalidDatatypeValueException ide) {              
          
+                        reportSchemaError("cvc-datatype-valid.1.2.3", new 
Object[] {xpathDefaultNamespace, "anyURI | ##defaultNamespace | 
##targetNamespace | ##local"}, assertElement);
+                    }
+                }
+            }
+        }
+        
+        return xpathDefaultNamespace;
+        
+    } // getXPathDefaultNamespaceForAssert
+    
 
     /*
      * Generate a name for an anonymous type



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

Reply via email to