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