You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by sa...@apache.org on 2010/11/05 22:32:52 UTC

svn commit: r1031811 - in /xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/dv/xs: PrecisionDecimalDV.java TypeValidator.java XSSimpleTypeDecl.java

Author: sandygao
Date: Fri Nov  5 21:32:51 2010
New Revision: 1031811

URL: http://svn.apache.org/viewvc?rev=1031811&view=rev
Log:
Bug fix: min/maxScale of precisionDecimal are always satisfied by the special values that don't have precision: NaN, INF, and -INF. The TypeValidator needs to answer whether a value has a precision.

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

Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/dv/xs/PrecisionDecimalDV.java
URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/dv/xs/PrecisionDecimalDV.java?rev=1031811&r1=1031810&r2=1031811&view=diff
==============================================================================
--- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/dv/xs/PrecisionDecimalDV.java (original)
+++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/dv/xs/PrecisionDecimalDV.java Fri Nov  5 21:32:51 2010
@@ -31,7 +31,7 @@ import org.apache.xerces.impl.dv.Validat
  */
 class PrecisionDecimalDV extends TypeValidator {
 
-    static class XPrecisionDecimal {
+    private static class XPrecisionDecimal {
 
         // sign: 0 for absent; 1 for positive values; -1 for negative values (except in case of INF, -INF)
         int sign = 1;
@@ -52,12 +52,16 @@ class PrecisionDecimalDV extends TypeVal
 
         XPrecisionDecimal(String content) throws NumberFormatException {
             if(content.equals("NaN")) {
-                ivalue = content;
+                ivalue = "NaN";
                 sign = 0;
                 return;
             }
-            if(content.equals("+INF") || content.equals("INF") || content.equals("-INF")) {
-                ivalue = content.charAt(0) == '+' ? content.substring(1) : content;
+            if(content.equals("+INF") || content.equals("INF")) {
+                ivalue = "INF";
+                return;
+            }
+            if(content.equals("-INF")) {
+                ivalue = "-INF";
                 return;
             }
             initD(content);
@@ -394,10 +398,6 @@ class PrecisionDecimalDV extends TypeVal
         return ((XPrecisionDecimal)value1).compareTo((XPrecisionDecimal)value2);
     }
 
-    public int getFractionDigits(Object value) {
-        return ((XPrecisionDecimal)value).fracDigits;
-    }
-
     public int getTotalDigits(Object value) {
         return ((XPrecisionDecimal)value).totalDigits;
     }
@@ -412,4 +412,10 @@ class PrecisionDecimalDV extends TypeVal
     public int getPrecision(Object value){
         return ((XPrecisionDecimal)value).precision;
     }
+
+    public boolean hasPrecision(Object value){
+        XPrecisionDecimal pd = (XPrecisionDecimal)value;
+        // Can't be NaN (sign==0) or +-INF. != is OK. See initD().
+        return pd.sign != 0 && pd.ivalue != "INF" && pd.ivalue != "-INF";
+    }
 }

Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/dv/xs/TypeValidator.java
URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/dv/xs/TypeValidator.java?rev=1031811&r1=1031810&r2=1031811&view=diff
==============================================================================
--- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/dv/xs/TypeValidator.java (original)
+++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/dv/xs/TypeValidator.java Fri Nov  5 21:32:51 2010
@@ -107,6 +107,11 @@ public abstract class TypeValidator {
     public int getPrecision(Object value){
         return 0;
     }
+
+    //whether this value has a precision. false indicate it's a special value.
+    public boolean hasPrecision(Object value){
+        return false;
+    }
     
     public boolean hasTimeZone(Object value){
         return false;

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=1031811&r1=1031810&r2=1031811&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 Fri Nov  5 21:32:51 2010
@@ -1909,10 +1909,10 @@ public class XSSimpleTypeDecl implements
 
         //fractionDigits
         if ((fFacetsDefined & FACET_FRACTIONDIGITS) != 0) {
-            int scale = fDVs[fValidationDV].getFractionDigits(ob);
-            if (scale > fFractionDigits) {
+            int fracDigits = fDVs[fValidationDV].getFractionDigits(ob);
+            if (fracDigits > fFractionDigits) {
                 throw new InvalidDatatypeValueException("cvc-fractionDigits-valid",
-                        new Object[] {content, Integer.toString(scale), Integer.toString(fFractionDigits)});
+                        new Object[] {content, Integer.toString(fracDigits), Integer.toString(fFractionDigits)});
             }
         }
 
@@ -1926,20 +1926,24 @@ public class XSSimpleTypeDecl implements
         }
         
         //maxScale      
-        if ((fFacetsDefined & FACET_MAXSCALE) != 0) {            
-            int precision = fDVs[fValidationDV].getPrecision(ob);
-            if (precision > fMaxScale){
-                throw new InvalidDatatypeValueException("cvc-maxScale-valid",
-                        new Object[] {content, Integer.toString(fMaxScale), fTypeName, Integer.toString(precision)});
+        if ((fFacetsDefined & FACET_MAXSCALE) != 0) {
+            if (fDVs[fValidationDV].hasPrecision(ob)) {
+                int precision = fDVs[fValidationDV].getPrecision(ob);
+                if (precision > fMaxScale){
+                    throw new InvalidDatatypeValueException("cvc-maxScale-valid",
+                            new Object[] {content, Integer.toString(fMaxScale), fTypeName, Integer.toString(precision)});
+                }
             }
         } 
         
         //minScale      
         if ((fFacetsDefined & FACET_MINSCALE) != 0) {            
-            int precision = fDVs[fValidationDV].getPrecision(ob);
-            if (precision < fMinScale){
-                throw new InvalidDatatypeValueException("cvc-minScale-valid",
-                        new Object[] {content, Integer.toString(fMinScale), fTypeName, Integer.toString(precision)} );
+            if (fDVs[fValidationDV].hasPrecision(ob)) {
+                int precision = fDVs[fValidationDV].getPrecision(ob);
+                if (precision < fMinScale){
+                    throw new InvalidDatatypeValueException("cvc-minScale-valid",
+                            new Object[] {content, Integer.toString(fMinScale), fTypeName, Integer.toString(precision)} );
+                }
             }
         }
         



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