Author: mukulg
Date: Mon Jan 31 11:12:18 2011
New Revision: 1065560

URL: http://svn.apache.org/viewvc?rev=1065560&view=rev
Log:
refactoring schema 1.1 assertions processing code a bit.

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

Modified: 
xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/XMLAssertPsychopathImpl.java
URL: 
http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/XMLAssertPsychopathImpl.java?rev=1065560&r1=1065559&r2=1065560&view=diff
==============================================================================
--- 
xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/XMLAssertPsychopathImpl.java
 (original)
+++ 
xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/XMLAssertPsychopathImpl.java
 Mon Jan 31 11:12:18 2011
@@ -315,11 +315,10 @@ public class XMLAssertPsychopathImpl ext
         }
         
         XSObjectList assertList = (XSObjectList) assertions;
-        XSObjectList attrMemberTypes = null;
         final int assertListSize = assertList.size();
         for (int assertIdx = 0; assertIdx < assertListSize; assertIdx++) {
             XSAssertImpl assertImpl = (XSAssertImpl) assertList.get(assertIdx);
-            String xPathDefaultNamespace = 
assertImpl.getXPathDefaultNamespace(); 
+            String xPathDefaultNamespace = 
assertImpl.getXPathDefaultNamespace();             
             if (xPathDefaultNamespace != null) {
                 fXpath2DynamicContext.add_namespace(null, 
xPathDefaultNamespace);  
             }
@@ -328,58 +327,33 @@ public class XMLAssertPsychopathImpl ext
                 // not an assertion facet
                 xpathContextExists = true;   
             }
-            // check if this is an assertion, from an attribute
+            
             if (assertImpl.getAttrName() != null) {
+                // evaluate assertion from an attribute
                 value = assertImpl.getAttrValue();
                 XSSimpleTypeDefinition attrType = (XSSimpleTypeDefinition) 
assertImpl.getTypeDefinition();                
-                attrMemberTypes = attrType.getMemberTypes();
-                final boolean isTypeDerivedFromUnion = ((XSSimpleType) 
attrType.getBaseType()).getVariety() == XSSimpleType.VARIETY_UNION;             
   
-                if (assertImpl.getVariety() == 
XSSimpleTypeDefinition.VARIETY_LIST) {
-                    // this assertion belongs to a type, that is an item type 
of a "simpleType -> list".
-                    // tokenize the list value by the longest sequence of 
white-spaces.
-                    StringTokenizer values = new StringTokenizer(value, " 
\n\t\r");
-                    
-                    // evaluate assertion on all of list items
-                    while (values.hasMoreTokens()) {
-                        String itemValue = values.nextToken();
-                        setValueOf$valueForAListItem(itemValue, attrType);     
                   
-                        AssertionError assertError = 
evaluateAssertion(element, assertImpl, itemValue, xpathContextExists, true);
-                        if (assertError != null) {
-                            reportAssertionsError(assertError);    
-                        }
-                    }
-                }
-                else if (assertImpl.getVariety() == 
XSSimpleTypeDefinition.VARIETY_ATOMIC) {
+                XSObjectList attrMemberTypes = attrType.getMemberTypes();
+                final boolean isTypeDerivedFromUnion = ((XSSimpleType) 
attrType.getBaseType()).getVariety() == XSSimpleType.VARIETY_UNION;
+                if (assertImpl.getVariety() == 
XSSimpleTypeDefinition.VARIETY_ATOMIC) {
                     // evaluating assertions for "simpleType -> restriction" 
(not derived by union)
                     setTypedValueFor$value(value, null, attrType);
-                    AssertionError assertError = evaluateAssertion(element, 
assertImpl, value, xpathContextExists, false);
+                    AssertionError assertError = evaluateOneAssertion(element, 
assertImpl, value, xpathContextExists, false);
                     if (assertError != null) {
                         reportAssertionsError(assertError);    
                     }
                 }
-                else if (attrMemberTypes != null && 
attrMemberTypes.getLength() > 0 && !isTypeDerivedFromUnion) {
-                   // evaluate assertions for "simpleType -> union"
-                   boolean isValidationFailedForUnion = 
isValidationFailedForUnion(attrMemberTypes, element, value, false);
-                   // only 1 error message is reported for assertion failures 
on "simpleType -> union", since it is hard 
-                   // (perhaps impossible?) to determine statically that what 
all assertions can cause validation failure, 
-                   // when participating in an XML schema union.
-                   if (isValidationFailedForUnion) {                        
-                        
fValidator.reportSchemaError("cvc-assertion.union.3.13.4.1", new Object[] { 
element.rawname, value } );   
-                   } 
+                else if (assertImpl.getVariety() == 
XSSimpleTypeDefinition.VARIETY_LIST) {
+                    // evaluating assertions for "simpleType -> list"
+                    evaluateAssertionOnSTListValue(element, value, assertImpl, 
xpathContextExists, attrType);
                 }
-                else if (isTypeDerivedFromUnion) {
-                    // although Xerces XSModel treats this case as a 
simpleType with variety union, but from assertions perspective
-                    // this is treated like a "simpleType -> restriction" case 
(which also appears to be syntactically true in every case?).
-                    // REVISIT...
-                    setValueOf$ValueForSTVarietyUnion(value, attrMemberTypes);
-                    AssertionError assertError = evaluateAssertion(element, 
assertImpl, value, false, false);
-                    if (assertError != null) {
-                        reportAssertionsError(assertError);    
-                    }
+                else {
+                    // evaluating assertions for "simpleType -> union"
+                    evaluateAssertionOnSTUnion(element, attrMemberTypes, 
isTypeDerivedFromUnion, assertImpl, value);
                 }
             }
             else {
-                AssertionError assertError = evaluateAssertion(element, 
assertImpl, value, xpathContextExists, false);
+                // evaluate an assertion from other parts (i.e not from 
attributes) of complexType's content model
+                AssertionError assertError = evaluateOneAssertion(element, 
assertImpl, value, xpathContextExists, false);
                 if (assertError != null) {
                     reportAssertionsError(assertError);    
                 }  
@@ -387,7 +361,7 @@ public class XMLAssertPsychopathImpl ext
         }
         
     } // evaluateAssertionsFromAComplexType
-    
+
     
     /*
      * Evaluate assertions on a "simple type".
@@ -418,47 +392,21 @@ public class XMLAssertPsychopathImpl ext
             if (xPathDefaultNamespace != null) {
                 fXpath2DynamicContext.add_namespace(null, 
xPathDefaultNamespace);  
             }
-            if (itemType != null) {
-               // evaluating assertions for "simpleType -> list". tokenize the 
list value by the longest sequence of white-spaces.
-               StringTokenizer values = new StringTokenizer(value, " \n\t\r");
-               
-               // evaluate assertion on all of list items
-               while (values.hasMoreTokens()) {
-                   String itemValue = values.nextToken();
-                   setValueOf$valueForAListItem(itemValue, itemType);
-                   AssertionError assertError = evaluateAssertion(element, 
assertImpl, itemValue, false, true);
-                   if (assertError != null) {
-                       reportAssertionsError(assertError);    
-                   }
-               }
-            }
-            else if (memberTypes != null && memberTypes.getLength() == 0) {
+            if (memberTypes != null && memberTypes.getLength() == 0) {
                 // evaluating assertions for "simpleType -> restriction" (not 
derived by union)
                 setTypedValueFor$value(value, null, null);
-                AssertionError assertError = evaluateAssertion(element, 
assertImpl, value, false, false);
+                AssertionError assertError = evaluateOneAssertion(element, 
assertImpl, value, false, false);
                 if (assertError != null) {
                     reportAssertionsError(assertError);    
                 }    
             }
-            else if (memberTypes != null && memberTypes.getLength() > 0 && 
!isTypeDerivedFromUnion) {
-                  // evaluate assertions for "simpleType -> union"
-                  boolean isValidationFailedForUnion = 
isValidationFailedForUnion(memberTypes, element, value, false);
-                 // only 1 error message is reported for assertion failures on 
"simpleType -> union", since it is hard 
-                 // (perhaps impossible?) to determine statically that what 
all assertions can cause validation failure, 
-                 // when participating in an XML schema union.
-                 if (isValidationFailedForUnion) {
-                      
fValidator.reportSchemaError("cvc-assertion.union.3.13.4.1", new Object[] { 
element.rawname, value } );   
-                 }
-            }
-            else if (isTypeDerivedFromUnion) {
-                // although Xerces XSModel treats this case as a simpleType 
with variety union, but from assertions perspective
-                // this is treated like a "simpleType -> restriction" case 
(which also appears to be syntactically true in every case?).
-                // REVISIT...
-                setValueOf$ValueForSTVarietyUnion(value, memberTypes);
-                AssertionError assertError = evaluateAssertion(element, 
assertImpl, value, false, false);
-                if (assertError != null) {
-                    reportAssertionsError(assertError);    
-                }
+            else if (itemType != null) {
+               // evaluating assertions for "simpleType -> list"
+               evaluateAssertionOnSTListValue(element, value, assertImpl, 
false, itemType);
+            }            
+            else {
+               // evaluating assertions for "simpleType -> union"
+               evaluateAssertionOnSTUnion(element, memberTypes, 
isTypeDerivedFromUnion, assertImpl, value);
             }
         }
         
@@ -466,6 +414,56 @@ public class XMLAssertPsychopathImpl ext
     
     
     /*
+     * Evaluate assertion on a simpleType xs:list value. Assertion is 
evaluated on each list item.
+     */
+    private void evaluateAssertionOnSTListValue(QName element, String 
listStrValue, XSAssertImpl assertImpl, boolean xpathContextExists,
+                                                XSSimpleTypeDefinition 
itemType) throws Exception {
+        
+        // tokenize the list value by the longest sequence of white-spaces.
+        StringTokenizer values = new StringTokenizer(listStrValue, " \n\t\r");
+        
+        // evaluate assertion on all of list items
+        while (values.hasMoreTokens()) {
+            String itemValue = values.nextToken();
+            setValueOf$valueForAListItem(itemValue, itemType);                 
       
+            AssertionError assertError = evaluateOneAssertion(element, 
assertImpl, itemValue, xpathContextExists, true);
+            if (assertError != null) {
+                reportAssertionsError(assertError);    
+            }
+        }
+        
+    } // evaluateAssertionOnSTListValue
+    
+    
+    /*
+     * Evaluate assertion on a simpleType with variety xs:union.
+     */
+    private void evaluateAssertionOnSTUnion(QName element, XSObjectList 
memberTypes, boolean isTypeDerivedFromUnion, XSAssertImpl assertImpl, String 
value) {
+        
+        if (memberTypes != null && memberTypes.getLength() > 0 && 
!isTypeDerivedFromUnion) {            
+            boolean isValidationFailedForUnion = 
isValidationFailedForUnion(memberTypes, element, value, false);
+            // only 1 error message is reported for assertion failures on 
"simpleType -> union", since it is hard 
+            // (perhaps impossible?) to determine statically that what all 
assertions can cause validation failure, 
+            // when participating in an XML schema union.
+            if (isValidationFailedForUnion) {                        
+                 fValidator.reportSchemaError("cvc-assertion.union.3.13.4.1", 
new Object[] { element.rawname, value } );   
+            } 
+         }
+         else if (isTypeDerivedFromUnion) {
+             // although Xerces XSModel treats this case as a simpleType with 
variety union, but from assertions perspective
+             // this is treated like a "simpleType -> restriction" case (which 
also appears to be syntactically true in every case?).
+             // REVISIT...
+             setValueOf$ValueForSTVarietyUnion(value, memberTypes);
+             AssertionError assertError = evaluateOneAssertion(element, 
assertImpl, value, false, false);
+             if (assertError != null) {
+                 reportAssertionsError(assertError);    
+             }
+         }
+        
+    } // evaluateAssertionOnSTUnion
+    
+    
+    /*
      * Set a typed value of XPath2 context variable $value if an atomic value 
on which assertion is been evaluated, is validated by a
      * simpleType with variety union. 
      */
@@ -530,13 +528,13 @@ public class XMLAssertPsychopathImpl ext
                             XSAssertImpl assertImpl = (XSAssertImpl) 
iter.next();
                             try {
                                setTypedValueFor$value(value, memType, null);
-                               AssertionError assertError = 
evaluateAssertion(element, assertImpl, value, false, false);
+                               AssertionError assertError = 
evaluateOneAssertion(element, assertImpl, value, false, false);
                                if (assertError == null) {
                                    assertsSucceeded++;  
                                }
                             }
                             catch(Exception ex) {
-                               // An exception may occur if for example, a 
typed value cannot be constructed by PsychoPath
+                               // An exception may occur if for example a 
typed value cannot be constructed by PsychoPath
                                // XPath engine for a given "string value" (say 
a value '5' was attempted to be converted to a typed
                                // value xs:date).
                                // it's useful to report warning ... REVISIT
@@ -593,9 +591,9 @@ public class XMLAssertPsychopathImpl ext
     
 
     /*
-     * Method to evaluate an assertion object.
+     * Method to evaluate an assertion object. Returns the evaluation error 
details in the AssertionError object.
      */
-    private AssertionError evaluateAssertion(QName element, XSAssertImpl 
assertImpl, String value, boolean xPathContextExists, boolean isList) {
+    private AssertionError evaluateOneAssertion(QName element, XSAssertImpl 
assertImpl, String value, boolean xPathContextExists, boolean isList) {
         
         AssertionError assertionError = null;
         
@@ -635,7 +633,7 @@ public class XMLAssertPsychopathImpl ext
         
         return assertionError;
         
-    } // evaluateAssertion
+    } // evaluateOneAssertion
     
     
     /*



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

Reply via email to