You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by kn...@apache.org on 2009/01/20 02:09:45 UTC

svn commit: r735898 - in /xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl: dv/xs/XSSimpleTypeDecl.java xs/traversers/XSDSimpleTypeTraverser.java

Author: knoaman
Date: Mon Jan 19 17:09:45 2009
New Revision: 735898

URL: http://svn.apache.org/viewvc?rev=735898&view=rev
Log:
Do not expand union simple types - Thanks to John K Chan.

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

Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/dv/xs/XSSimpleTypeDecl.java
URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/dv/xs/XSSimpleTypeDecl.java?rev=735898&r1=735897&r2=735898&view=diff
==============================================================================
--- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/dv/xs/XSSimpleTypeDecl.java (original)
+++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/dv/xs/XSSimpleTypeDecl.java Mon Jan 19 17:09:45 2009
@@ -1900,7 +1900,11 @@
                             (fMemberTypes[i].fFacetsDefined != 0 && fMemberTypes[i].fFacetsDefined != FACET_WHITESPACE)) {
                         fMemberTypes[i].checkFacets(validatedInfo);
                     }
-                    validatedInfo.memberType = fMemberTypes[i];
+
+                    if (fMemberTypes[i].fVariety != VARIETY_UNION) {
+                        validatedInfo.memberType = fMemberTypes[i];
+                    }
+
                     return aValue;
                 } catch(InvalidDatatypeValueException invalidValue) {
                 }
@@ -2348,27 +2352,36 @@
                 this.fOrdered = ORDERED_PARTIAL;
                 return;
             }
-            // we need to process the first member type before entering the loop
-            short ancestorId = getPrimitiveDV(fMemberTypes[0].fValidationDV);
-            boolean commonAnc = ancestorId != DV_ANYSIMPLETYPE;
-            boolean allFalse = fMemberTypes[0].fOrdered == ORDERED_FALSE;
-            // for the other member types, check whether the value is false
-            // and whether they have the same ancestor as the first one
-            for (int i = 1; i < fMemberTypes.length && (commonAnc || allFalse); i++) {
-                if (commonAnc)
-                    commonAnc = ancestorId == getPrimitiveDV(fMemberTypes[i].fValidationDV);
-                if (allFalse)
-                    allFalse = fMemberTypes[i].fOrdered == ORDERED_FALSE;
-            }
-            if (commonAnc) {
-                // REVISIT: all member types should have the same ordered value
-                //          just use the first one. Can we assume this?
-                this.fOrdered = fMemberTypes[0].fOrdered;
-            } else if (allFalse) {
-                this.fOrdered = ORDERED_FALSE;
-            } else {
+
+            short firstMemberOrderVal = fMemberTypes[0].fOrdered;   
+            // if any one of the memberTypes have partial order, set the order of this union to partial
+            if (firstMemberOrderVal==ORDERED_PARTIAL) {
                 this.fOrdered = ORDERED_PARTIAL;
+                return;
             }
+
+            // if any of the memberTypes are of different order, set the order of this union to partial
+            short ancestorId = getPrimitiveDV(getFirstExpandedSimpleTypeValidationDV(fMemberTypes[0]));
+            boolean commonAnc = true;
+            for (int i=1; i<fMemberTypes.length; i++) {
+                if (fMemberTypes[i].fOrdered != firstMemberOrderVal) {
+                    this.fOrdered = ORDERED_PARTIAL;
+                    return;
+                }
+                if (commonAnc) {
+                    commonAnc = (getPrimitiveDV(getFirstExpandedSimpleTypeValidationDV(fMemberTypes[i])) == ancestorId);
+                }
+            }
+
+            // if all the memberTypes are false order, set the order of this union to false
+            if (firstMemberOrderVal == ORDERED_FALSE) {
+                this.fOrdered = ORDERED_FALSE;
+                return;
+            }
+
+            // all the memberTypes are total order
+            // if they're from the same primitive type, set the order of this union to total, otherwise partial            
+            this.fOrdered = commonAnc ? ORDERED_TOTAL : ORDERED_PARTIAL;
         }
 
     }//setOrdered
@@ -2419,11 +2432,11 @@
             short ancestorId = 0 ;
 
             if(memberTypes.length > 0){
-                ancestorId = getPrimitiveDV(memberTypes[0].fValidationDV);
+                ancestorId = getPrimitiveDV(getFirstExpandedSimpleTypeValidationDV(memberTypes[0]));
             }
 
             for(int i = 0 ; i < memberTypes.length ; i++){
-                if(!memberTypes[i].getBounded() || (ancestorId != getPrimitiveDV(memberTypes[i].fValidationDV)) ){
+                if(!memberTypes[i].getBounded() || (ancestorId != getPrimitiveDV(getFirstExpandedSimpleTypeValidationDV(memberTypes[i]))) ){
                     this.fBounded = false;
                     return;
                 }
@@ -2433,6 +2446,20 @@
 
     }//setBounded
 
+    // returns the validation DV of the first simple type not a union
+    private short getFirstExpandedSimpleTypeValidationDV(XSSimpleTypeDecl simpleType) {
+        if (simpleType.fVariety == VARIETY_UNION) {            
+            for (int i=0; i<simpleType.fMemberTypes.length; i++) {
+                short validationDV = getFirstExpandedSimpleTypeValidationDV(simpleType.fMemberTypes[i]);
+                if (validationDV != -1) {
+                    return validationDV;
+                }
+            }            
+            return -1;
+        }
+        return simpleType.fValidationDV;
+    } // getFirstPrimitiveValidationDV()
+
     private boolean specialCardinalityCheck(){
         if( (fBase.fValidationDV == XSSimpleTypeDecl.DV_DATE) || (fBase.fValidationDV == XSSimpleTypeDecl.DV_GYEARMONTH)
                 || (fBase.fValidationDV == XSSimpleTypeDecl.DV_GYEAR) || (fBase.fValidationDV == XSSimpleTypeDecl.DV_GMONTHDAY)

Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDSimpleTypeTraverser.java
URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDSimpleTypeTraverser.java?rev=735898&r1=735897&r2=735898&view=diff
==============================================================================
--- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDSimpleTypeTraverser.java (original)
+++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDSimpleTypeTraverser.java Mon Jan 19 17:09:45 2009
@@ -297,7 +297,9 @@
                         XSConstants.DERIVATION_UNION, schemaDoc);
                 if (dv != null) {
                     // if it's a union, expand it
-                    if (dv.getVariety() == XSSimpleType.VARIETY_UNION) {
+                    // In XML Schema 1.1, we do not expand
+                    if (dv.getVariety() == XSSimpleType.VARIETY_UNION &&
+                            fSchemaHandler.fSchemaVersion < Constants.SCHEMA_VERSION_1_1) {
                         dvs = dv.getMemberTypes();
                         for (int j = 0; j < dvs.getLength(); j++)
                             dTValidators.add(dvs.item(j));
@@ -333,8 +335,9 @@
                     // traverse this child to get the member type
                     dv = traverseLocal(content, schemaDoc, grammar);
                     if (dv != null) {
-                        // if it's a union, expand it
-                        if (dv.getVariety() == XSSimpleType.VARIETY_UNION) {
+                        // if it's a union, expand it (only in XML 1.0)
+                        if (dv.getVariety() == XSSimpleType.VARIETY_UNION &&
+                                fSchemaHandler.fSchemaVersion < Constants.SCHEMA_VERSION_1_1) {
                             dvs = dv.getMemberTypes();
                             for (int j = 0; j < dvs.getLength(); j++) {
                                 dTValidators.add(dvs.item(j));
@@ -493,6 +496,12 @@
                 if (((XSSimpleType)temp.item(i)).getVariety() == XSSimpleType.VARIETY_LIST) {
                     return true;
                 }
+                /* In XML Schema 1.1, unions are not expanded */
+                else if (fSchemaHandler.fSchemaVersion == Constants.SCHEMA_VERSION_1_1 && ((XSSimpleType)temp.item(i)).getVariety() == XSSimpleType.VARIETY_UNION) {
+                    if (isListDatatype((XSSimpleType)temp.item(i))) {
+                        return true;
+                    }
+                }
             }
         }
         



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