This patch provides support for 2 news datatypes for schema 1.1: anyAtomicType as well as precisionDecimal (disabled for now).



Ankit Pasricha
XML Parser Development
IBM Toronto Lab
8200 Warden Avenue, Ontario L6G 1C7
Phone: (905) 413 4941
Index: src/org/apache/xerces/impl/dv/XSSimpleType.java
===================================================================
RCS file: 
/home/cvspublic/xml-xerces/java/src/org/apache/xerces/impl/dv/XSSimpleType.java,v
retrieving revision 1.14
diff -u -r1.14 XSSimpleType.java
--- src/org/apache/xerces/impl/dv/XSSimpleType.java     24 Feb 2004 22:44:25 -0000     
 1.14
+++ src/org/apache/xerces/impl/dv/XSSimpleType.java     29 Sep 2004 20:54:05 -0000
@@ -84,8 +84,10 @@
     public static final short PRIMITIVE_ANYURI        = 17;
     /** "QName" type */
     public static final short PRIMITIVE_QNAME         = 18;
+    /** "precisionDecimal" type */
+    public static final short PRIMITIVE_PRECISIONDECIMAL = 19;
     /** "NOTATION" type */
-    public static final short PRIMITIVE_NOTATION      = 19;
+    public static final short PRIMITIVE_NOTATION      = 20;
 
     /**
      * return an ID representing the built-in primitive base type.
Index: src/org/apache/xerces/impl/dv/xs/SchemaDVFactoryImpl.java
===================================================================
RCS file: 
/home/cvspublic/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/SchemaDVFactoryImpl.java,v
retrieving revision 1.16
diff -u -r1.16 SchemaDVFactoryImpl.java
--- src/org/apache/xerces/impl/dv/xs/SchemaDVFactoryImpl.java   15 Sep 2004 05:12:23 
-0000      1.16
+++ src/org/apache/xerces/impl/dv/xs/SchemaDVFactoryImpl.java   29 Sep 2004 20:54:05 
-0000
@@ -140,6 +140,7 @@
     static void createBuiltInTypes() {
         // all schema simple type names
         final String ANYSIMPLETYPE     = "anySimpleType";
+        final String ANYATOMICTYPE        = "anyAtomicType";
         final String ANYURI            = "anyURI";
         final String BASE64BINARY      = "base64Binary";
         final String BOOLEAN           = "boolean";
@@ -186,37 +187,50 @@
         final String YEARMONTH         = "gYearMonth";
         final String YEARMONTHDURATION = "yearMonthDuration";
         final String DAYTIMEDURATION   = "dayTimeDuration";
+        final String PRECISIONDECIMAL  = "precisionDecimal";
 
         final XSFacets facets = new XSFacets();
 
         //REVISIT: passing "anyType" here.
         XSSimpleTypeDecl anySimpleType = XSSimpleTypeDecl.fAnySimpleType;
+        XSSimpleTypeDecl anyAtomicType = XSSimpleTypeDecl.fAnyAtomicType;
+        XSSimpleTypeDecl baseType = null;
+        
+        if(Constants.SCHEMA_1_1_SUPPORT) {
+               baseType = anyAtomicType;
+            fBuiltInTypes.put(ANYATOMICTYPE, anyAtomicType);
+        }
+        else {
+               baseType = anySimpleType;
+        }
+        
         fBuiltInTypes.put(ANYSIMPLETYPE, anySimpleType);
-        XSSimpleTypeDecl stringDV = new XSSimpleTypeDecl(anySimpleType, STRING, 
XSSimpleTypeDecl.DV_STRING, XSSimpleType.ORDERED_FALSE, false, false, false , true, 
XSConstants.STRING_DT);
+        XSSimpleTypeDecl stringDV = new XSSimpleTypeDecl(baseType, STRING, 
XSSimpleTypeDecl.DV_STRING, XSSimpleType.ORDERED_FALSE, false, false, false , true, 
XSConstants.STRING_DT);
         fBuiltInTypes.put(STRING, stringDV);
-        fBuiltInTypes.put(BOOLEAN, new XSSimpleTypeDecl(anySimpleType, BOOLEAN, 
XSSimpleTypeDecl.DV_BOOLEAN, XSSimpleType.ORDERED_FALSE, false, true, false, true, 
XSConstants.BOOLEAN_DT));
-        XSSimpleTypeDecl decimalDV = new XSSimpleTypeDecl(anySimpleType, DECIMAL, 
XSSimpleTypeDecl.DV_DECIMAL, XSSimpleType.ORDERED_TOTAL, false, false, true, true, 
XSConstants.DECIMAL_DT);
+        fBuiltInTypes.put(BOOLEAN, new XSSimpleTypeDecl(baseType, BOOLEAN, 
XSSimpleTypeDecl.DV_BOOLEAN, XSSimpleType.ORDERED_FALSE, false, true, false, true, 
XSConstants.BOOLEAN_DT));
+        XSSimpleTypeDecl decimalDV = new XSSimpleTypeDecl(baseType, DECIMAL, 
XSSimpleTypeDecl.DV_DECIMAL, XSSimpleType.ORDERED_TOTAL, false, false, true, true, 
XSConstants.DECIMAL_DT);
         fBuiltInTypes.put(DECIMAL, decimalDV);
 
-        fBuiltInTypes.put(ANYURI, new XSSimpleTypeDecl(anySimpleType, ANYURI, 
XSSimpleTypeDecl.DV_ANYURI, XSSimpleType.ORDERED_FALSE, false, false, false, true, 
XSConstants.ANYURI_DT));
-        fBuiltInTypes.put(BASE64BINARY, new XSSimpleTypeDecl(anySimpleType, 
BASE64BINARY, XSSimpleTypeDecl.DV_BASE64BINARY, XSSimpleType.ORDERED_FALSE, false, 
false, false, true, XSConstants.BASE64BINARY_DT));
+        fBuiltInTypes.put(ANYURI, new XSSimpleTypeDecl(baseType, ANYURI, 
XSSimpleTypeDecl.DV_ANYURI, XSSimpleType.ORDERED_FALSE, false, false, false, true, 
XSConstants.ANYURI_DT));
+        fBuiltInTypes.put(BASE64BINARY, new XSSimpleTypeDecl(baseType, BASE64BINARY, 
XSSimpleTypeDecl.DV_BASE64BINARY, XSSimpleType.ORDERED_FALSE, false, false, false, 
true, XSConstants.BASE64BINARY_DT));
         
-        XSSimpleTypeDecl durationDV = new XSSimpleTypeDecl(anySimpleType, DURATION, 
XSSimpleTypeDecl.DV_DURATION, XSSimpleType.ORDERED_PARTIAL, false, false, false, true, 
XSConstants.DURATION_DT);
+        XSSimpleTypeDecl durationDV = new XSSimpleTypeDecl(baseType, DURATION, 
XSSimpleTypeDecl.DV_DURATION, XSSimpleType.ORDERED_PARTIAL, false, false, false, true, 
XSConstants.DURATION_DT);
         fBuiltInTypes.put(DURATION, durationDV);
         
-        if (Constants.SCHEMA_1_1_SUPPORT) {
-            fBuiltInTypes.put(YEARMONTHDURATION, new XSSimpleTypeDecl(durationDV, 
YEARMONTHDURATION, XSSimpleTypeDecl.DV_YEARMONTHDURATION, 
XSSimpleType.ORDERED_PARTIAL, false, false, false, true, 
XSConstants.YEARMONTHDURATION_DT));
-            fBuiltInTypes.put(DAYTIMEDURATION, new XSSimpleTypeDecl(durationDV, 
DAYTIMEDURATION, XSSimpleTypeDecl.DV_DAYTIMEDURATION, XSSimpleType.ORDERED_PARTIAL, 
false, false, false, true, XSConstants.DAYTIMEDURATION_DT));
+        if(Constants.SCHEMA_1_1_SUPPORT) {
+               fBuiltInTypes.put(YEARMONTHDURATION, new XSSimpleTypeDecl(durationDV, 
YEARMONTHDURATION, XSSimpleTypeDecl.DV_YEARMONTHDURATION, 
XSSimpleType.ORDERED_PARTIAL, false, false, false, true, 
XSConstants.YEARMONTHDURATION_DT));
+               fBuiltInTypes.put(DAYTIMEDURATION, new XSSimpleTypeDecl(durationDV, 
DAYTIMEDURATION, XSSimpleTypeDecl.DV_DAYTIMEDURATION, XSSimpleType.ORDERED_PARTIAL, 
false, false, false, true, XSConstants.DAYTIMEDURATION_DT));
+               //fBuiltInTypes.put(PRECISIONDECIMAL, new 
XSSimpleTypeDecl(anySimpleType, PRECISIONDECIMAL, 
XSSimpleTypeDecl.DV_PRECISIONDECIMAL, XSSimpleType.ORDERED_PARTIAL, false, false, 
true, true, XSConstants.PRECISIONDECIMAL_DT));
         }
         
-        fBuiltInTypes.put(DATETIME, new XSSimpleTypeDecl(anySimpleType, DATETIME, 
XSSimpleTypeDecl.DV_DATETIME, XSSimpleType.ORDERED_PARTIAL, false, false, false, true, 
XSConstants.DATETIME_DT));
-        fBuiltInTypes.put(TIME, new XSSimpleTypeDecl(anySimpleType, TIME, 
XSSimpleTypeDecl.DV_TIME, XSSimpleType.ORDERED_PARTIAL, false, false, false, true, 
XSConstants.TIME_DT));
-        fBuiltInTypes.put(DATE, new XSSimpleTypeDecl(anySimpleType, DATE, 
XSSimpleTypeDecl.DV_DATE, XSSimpleType.ORDERED_PARTIAL, false, false, false, true, 
XSConstants.DATE_DT));
-        fBuiltInTypes.put(YEARMONTH, new XSSimpleTypeDecl(anySimpleType, YEARMONTH, 
XSSimpleTypeDecl.DV_GYEARMONTH, XSSimpleType.ORDERED_PARTIAL, false, false, false, 
true, XSConstants.GYEARMONTH_DT));
-        fBuiltInTypes.put(YEAR, new XSSimpleTypeDecl(anySimpleType, YEAR, 
XSSimpleTypeDecl.DV_GYEAR, XSSimpleType.ORDERED_PARTIAL, false, false, false, true, 
XSConstants.GYEAR_DT));
-        fBuiltInTypes.put(MONTHDAY, new XSSimpleTypeDecl(anySimpleType, MONTHDAY, 
XSSimpleTypeDecl.DV_GMONTHDAY, XSSimpleType.ORDERED_PARTIAL, false, false, false, 
true, XSConstants.GMONTHDAY_DT));
-        fBuiltInTypes.put(DAY, new XSSimpleTypeDecl(anySimpleType, DAY, 
XSSimpleTypeDecl.DV_GDAY, XSSimpleType.ORDERED_PARTIAL, false, false, false, true, 
XSConstants.GDAY_DT));
-        fBuiltInTypes.put(MONTH, new XSSimpleTypeDecl(anySimpleType, MONTH, 
XSSimpleTypeDecl.DV_GMONTH, XSSimpleType.ORDERED_PARTIAL, false, false, false, true, 
XSConstants.GMONTH_DT));
+        fBuiltInTypes.put(DATETIME, new XSSimpleTypeDecl(baseType, DATETIME, 
XSSimpleTypeDecl.DV_DATETIME, XSSimpleType.ORDERED_PARTIAL, false, false, false, true, 
XSConstants.DATETIME_DT));
+        fBuiltInTypes.put(TIME, new XSSimpleTypeDecl(baseType, TIME, 
XSSimpleTypeDecl.DV_TIME, XSSimpleType.ORDERED_PARTIAL, false, false, false, true, 
XSConstants.TIME_DT));
+        fBuiltInTypes.put(DATE, new XSSimpleTypeDecl(baseType, DATE, 
XSSimpleTypeDecl.DV_DATE, XSSimpleType.ORDERED_PARTIAL, false, false, false, true, 
XSConstants.DATE_DT));
+        fBuiltInTypes.put(YEARMONTH, new XSSimpleTypeDecl(baseType, YEARMONTH, 
XSSimpleTypeDecl.DV_GYEARMONTH, XSSimpleType.ORDERED_PARTIAL, false, false, false, 
true, XSConstants.GYEARMONTH_DT));
+        fBuiltInTypes.put(YEAR, new XSSimpleTypeDecl(baseType, YEAR, 
XSSimpleTypeDecl.DV_GYEAR, XSSimpleType.ORDERED_PARTIAL, false, false, false, true, 
XSConstants.GYEAR_DT));
+        fBuiltInTypes.put(MONTHDAY, new XSSimpleTypeDecl(baseType, MONTHDAY, 
XSSimpleTypeDecl.DV_GMONTHDAY, XSSimpleType.ORDERED_PARTIAL, false, false, false, 
true, XSConstants.GMONTHDAY_DT));
+        fBuiltInTypes.put(DAY, new XSSimpleTypeDecl(baseType, DAY, 
XSSimpleTypeDecl.DV_GDAY, XSSimpleType.ORDERED_PARTIAL, false, false, false, true, 
XSConstants.GDAY_DT));
+        fBuiltInTypes.put(MONTH, new XSSimpleTypeDecl(baseType, MONTH, 
XSSimpleTypeDecl.DV_GMONTH, XSSimpleType.ORDERED_PARTIAL, false, false, false, true, 
XSConstants.GMONTH_DT));
 
         XSSimpleTypeDecl integerDV = new XSSimpleTypeDecl(decimalDV, INTEGER, 
XSSimpleTypeDecl.DV_INTEGER, XSSimpleType.ORDERED_TOTAL, false, false, true, true, 
XSConstants.INTEGER_DT);
         fBuiltInTypes.put(INTEGER, integerDV);
@@ -287,10 +301,10 @@
         fBuiltInTypes.put(POSITIVEINTEGER, positiveIntegerDV);
 
 
-        fBuiltInTypes.put(FLOAT, new XSSimpleTypeDecl(anySimpleType, FLOAT, 
XSSimpleTypeDecl.DV_FLOAT, XSSimpleType.ORDERED_PARTIAL, true, true, true, true, 
XSConstants.FLOAT_DT));
-        fBuiltInTypes.put(DOUBLE, new XSSimpleTypeDecl(anySimpleType, DOUBLE, 
XSSimpleTypeDecl.DV_DOUBLE, XSSimpleType.ORDERED_PARTIAL, true, true, true, true, 
XSConstants.DOUBLE_DT));
-        fBuiltInTypes.put(HEXBINARY, new XSSimpleTypeDecl(anySimpleType, HEXBINARY, 
XSSimpleTypeDecl.DV_HEXBINARY, XSSimpleType.ORDERED_FALSE, false, false, false, true, 
XSConstants.HEXBINARY_DT));
-        fBuiltInTypes.put(NOTATION, new XSSimpleTypeDecl(anySimpleType, NOTATION, 
XSSimpleTypeDecl.DV_NOTATION, XSSimpleType.ORDERED_FALSE, false, false, false, true, 
XSConstants.NOTATION_DT));
+        fBuiltInTypes.put(FLOAT, new XSSimpleTypeDecl(baseType, FLOAT, 
XSSimpleTypeDecl.DV_FLOAT, XSSimpleType.ORDERED_PARTIAL, true, true, true, true, 
XSConstants.FLOAT_DT));
+        fBuiltInTypes.put(DOUBLE, new XSSimpleTypeDecl(baseType, DOUBLE, 
XSSimpleTypeDecl.DV_DOUBLE, XSSimpleType.ORDERED_PARTIAL, true, true, true, true, 
XSConstants.DOUBLE_DT));
+        fBuiltInTypes.put(HEXBINARY, new XSSimpleTypeDecl(baseType, HEXBINARY, 
XSSimpleTypeDecl.DV_HEXBINARY, XSSimpleType.ORDERED_FALSE, false, false, false, true, 
XSConstants.HEXBINARY_DT));
+        fBuiltInTypes.put(NOTATION, new XSSimpleTypeDecl(baseType, NOTATION, 
XSSimpleTypeDecl.DV_NOTATION, XSSimpleType.ORDERED_FALSE, false, false, false, true, 
XSConstants.NOTATION_DT));
 
 
         facets.whiteSpace =  XSSimpleType.WS_REPLACE;
@@ -320,7 +334,7 @@
         ncnameDV.applyFacets1(facets, XSSimpleType.FACET_WHITESPACE, (short)0, 
XSSimpleTypeDecl.SPECIAL_PATTERN_NCNAME);
         fBuiltInTypes.put(NCNAME, ncnameDV);
 
-        fBuiltInTypes.put(QNAME, new XSSimpleTypeDecl(anySimpleType, QNAME, 
XSSimpleTypeDecl.DV_QNAME, XSSimpleType.ORDERED_FALSE, false, false, false, true, 
XSConstants.QNAME_DT));
+        fBuiltInTypes.put(QNAME, new XSSimpleTypeDecl(baseType, QNAME, 
XSSimpleTypeDecl.DV_QNAME, XSSimpleType.ORDERED_FALSE, false, false, false, true, 
XSConstants.QNAME_DT));
 
         fBuiltInTypes.put(ID, new XSSimpleTypeDecl(ncnameDV,  ID, 
XSSimpleTypeDecl.DV_ID, XSSimpleType.ORDERED_FALSE, false, false, false , true, 
XSConstants.ID_DT));
         XSSimpleTypeDecl idrefDV = new XSSimpleTypeDecl(ncnameDV,  IDREF , 
XSSimpleTypeDecl.DV_IDREF, XSSimpleType.ORDERED_FALSE, false, false, false, true, 
XSConstants.IDREF_DT);
Index: src/org/apache/xerces/impl/dv/xs/XSSimpleTypeDecl.java
===================================================================
RCS file: 
/home/cvspublic/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/XSSimpleTypeDecl.java,v
retrieving revision 1.54
diff -u -r1.54 XSSimpleTypeDecl.java
--- src/org/apache/xerces/impl/dv/xs/XSSimpleTypeDecl.java      27 Sep 2004 15:42:02 
-0000      1.54
+++ src/org/apache/xerces/impl/dv/xs/XSSimpleTypeDecl.java      29 Sep 2004 20:54:06 
-0000
@@ -19,6 +19,7 @@
 import java.util.StringTokenizer;
 import java.util.Vector;
 
+import org.apache.xerces.impl.Constants;
 import org.apache.xerces.impl.dv.DatatypeException;
 import org.apache.xerces.impl.dv.InvalidDatatypeFacetException;
 import org.apache.xerces.impl.dv.InvalidDatatypeValueException;
@@ -27,6 +28,11 @@
 import org.apache.xerces.impl.dv.XSFacets;
 import org.apache.xerces.impl.dv.XSSimpleType;
 import org.apache.xerces.impl.xpath.regex.RegularExpression;
+import org.apache.xerces.impl.xs.util.ShortListImpl;
+import org.apache.xerces.impl.xs.util.StringListImpl;
+import org.apache.xerces.impl.xs.util.XSObjectListImpl;
+import org.apache.xerces.util.XMLChar;
+import org.apache.xerces.xni.NamespaceContext;
 import org.apache.xerces.xs.StringList;
 import org.apache.xerces.xs.XSAnnotation;
 import org.apache.xerces.xs.XSConstants;
@@ -69,6 +75,7 @@
     static final short DV_BASE64BINARY  = PRIMITIVE_BASE64BINARY;
     static final short DV_ANYURI        = PRIMITIVE_ANYURI;
     static final short DV_QNAME         = PRIMITIVE_QNAME;
+    static final short DV_PRECISIONDECIMAL = PRIMITIVE_PRECISIONDECIMAL;
     static final short DV_NOTATION      = PRIMITIVE_NOTATION;
 
     static final short DV_ANYSIMPLETYPE = 0;
@@ -80,72 +87,77 @@
     static final short DV_UNION         = DV_NOTATION + 6;
     static final short DV_YEARMONTHDURATION = DV_NOTATION + 7;
     static final short DV_DAYTIMEDURATION      = DV_NOTATION + 8;
+    static final short DV_ANYATOMICTYPE = DV_NOTATION + 9;
 
     static final TypeValidator[] fDVs = {
-        new AnySimpleDV(),
-        new StringDV(),
-        new BooleanDV(),
-        new DecimalDV(),
-        new FloatDV(),
-        new DoubleDV(),
-        new DurationDV(),
-        new DateTimeDV(),
-        new TimeDV(),
-        new DateDV(),
-        new YearMonthDV(),
-        new YearDV(),
-        new MonthDayDV(),
-        new DayDV(),
-        new MonthDV(),
-        new HexBinaryDV(),
-        new Base64BinaryDV(),
-        new AnyURIDV(),
-        new QNameDV(),
-        new QNameDV(),   // notation use the same one as qname
-        new IDDV(),
-        new IDREFDV(),
-        new EntityDV(),
-        new IntegerDV(),
-        new ListDV(),
-        new UnionDV(),
-        new YearMonthDurationDV(), // XML Schema 1.1 type
-        new DayTimeDurationDV() // XML Schema 1.1 type
-    };
-
+                       new AnySimpleDV(),
+                       new StringDV(),
+                       new BooleanDV(),
+                       new DecimalDV(),
+                       new FloatDV(),
+                       new DoubleDV(),
+                       new DurationDV(),
+                       new DateTimeDV(),
+                       new TimeDV(),
+                       new DateDV(),
+                       new YearMonthDV(),
+                       new YearDV(),
+                       new MonthDayDV(),
+                       new DayDV(),
+                       new MonthDV(),
+                       new HexBinaryDV(),
+                       new Base64BinaryDV(),
+                       new AnyURIDV(),
+                       new QNameDV(),
+                               new PrecisionDecimalDV(),
+                       new QNameDV(),   // notation use the same one as qname
+                       new IDDV(),
+                       new IDREFDV(),
+                       new EntityDV(),
+                       new IntegerDV(),
+                       new ListDV(),
+                       new UnionDV(),
+                               new YearMonthDurationDV(),
+                               new DayTimeDurationDV(),
+                                       new AnyAtomicDV()
+                   };
+               
     static final short NORMALIZE_NONE = 0;
     static final short NORMALIZE_TRIM = 1;
     static final short NORMALIZE_FULL = 2;
     static final short[] fDVNormalizeType = {
-        NORMALIZE_NONE, //AnySimpleDV(),
-        NORMALIZE_FULL, //StringDV(),
-        NORMALIZE_TRIM, //BooleanDV(),
-        NORMALIZE_TRIM, //DecimalDV(),
-        NORMALIZE_TRIM, //FloatDV(),
-        NORMALIZE_TRIM, //DoubleDV(),
-        NORMALIZE_TRIM, //DurationDV(),
-        NORMALIZE_TRIM, //DateTimeDV(),
-        NORMALIZE_TRIM, //TimeDV(),
-        NORMALIZE_TRIM, //DateDV(),
-        NORMALIZE_TRIM, //YearMonthDV(),
-        NORMALIZE_TRIM, //YearDV(),
-        NORMALIZE_TRIM, //MonthDayDV(),
-        NORMALIZE_TRIM, //DayDV(),
-        NORMALIZE_TRIM, //MonthDV(),
-        NORMALIZE_TRIM, //HexBinaryDV(),
-        NORMALIZE_NONE, //Base64BinaryDV(),  // Base64 know how to deal with spaces
-        NORMALIZE_TRIM, //AnyURIDV(),
-        NORMALIZE_TRIM, //QNameDV(),
-        NORMALIZE_TRIM, //QNameDV(),   // notation
-        NORMALIZE_TRIM, //IDDV(),
-        NORMALIZE_TRIM, //IDREFDV(),
-        NORMALIZE_TRIM, //EntityDV(),
-        NORMALIZE_TRIM, //IntegerDV(),
-        NORMALIZE_FULL, //ListDV(),
-        NORMALIZE_NONE, //UnionDV(),
-        NORMALIZE_TRIM, //YearMonthDurationDV() (Schema 1.1)
-        NORMALIZE_TRIM, //DayTimeDurationDV() (Schema 1.1)
-    };
-
+                       NORMALIZE_NONE, //AnySimpleDV(),
+                       NORMALIZE_FULL, //StringDV(),
+                       NORMALIZE_TRIM, //BooleanDV(),
+                       NORMALIZE_TRIM, //DecimalDV(),
+                       NORMALIZE_TRIM, //FloatDV(),
+                       NORMALIZE_TRIM, //DoubleDV(),
+                       NORMALIZE_TRIM, //DurationDV(),
+                       NORMALIZE_TRIM, //DateTimeDV(),
+                       NORMALIZE_TRIM, //TimeDV(),
+                       NORMALIZE_TRIM, //DateDV(),
+                       NORMALIZE_TRIM, //YearMonthDV(),
+                       NORMALIZE_TRIM, //YearDV(),
+                       NORMALIZE_TRIM, //MonthDayDV(),
+                       NORMALIZE_TRIM, //DayDV(),
+                       NORMALIZE_TRIM, //MonthDV(),
+                       NORMALIZE_TRIM, //HexBinaryDV(),
+                       NORMALIZE_NONE, //Base64BinaryDV(),  // Base64 know how to 
deal with spaces
+                       NORMALIZE_TRIM, //AnyURIDV(),
+                       NORMALIZE_TRIM, //QNameDV(),
+                               NORMALIZE_TRIM, //PrecisionDecimalDV()
+                       NORMALIZE_TRIM, //QNameDV(),   // notation
+                       NORMALIZE_TRIM, //IDDV(),
+                       NORMALIZE_TRIM, //IDREFDV(),
+                       NORMALIZE_TRIM, //EntityDV(),
+                       NORMALIZE_TRIM, //IntegerDV(),
+                       NORMALIZE_FULL, //ListDV(),
+                       NORMALIZE_NONE, //UnionDV(),
+                                       NORMALIZE_TRIM, //YearMonthDurationDV() 
(Schema 1.1)
+                                       NORMALIZE_TRIM, //DayTimeDurationDV() (Schema 
1.1)
+                                       NORMALIZE_NONE, //AnyAtomicDV() (Schema 1.1)
+                   };
+               
     static final short SPECIAL_PATTERN_NONE     = 0;
     static final short SPECIAL_PATTERN_NMTOKEN  = 1;
     static final short SPECIAL_PATTERN_NAME     = 2;
@@ -574,6 +586,8 @@
                 return DV_STRING;
             else if (fValidationDV == DV_INTEGER)
                 return DV_DECIMAL;
+            else if(Constants.SCHEMA_1_1_SUPPORT && (fValidationDV == 
DV_YEARMONTHDURATION || fValidationDV == DV_DAYTIMEDURATION))
+               return DV_DURATION;
             else
                 return fValidationDV;
         }
@@ -2255,6 +2269,8 @@
         else if (validationDV == DV_INTEGER) {
             return DV_DECIMAL;
         }
+        else if(Constants.SCHEMA_1_1_SUPPORT && (validationDV == DV_YEARMONTHDURATION 
|| validationDV == DV_DAYTIMEDURATION))
+               return DV_DURATION;
         else {
             return validationDV;
         }
@@ -2530,6 +2546,8 @@
     
     static final XSSimpleTypeDecl fAnySimpleType = new XSSimpleTypeDecl(null, 
"anySimpleType", DV_ANYSIMPLETYPE, ORDERED_FALSE, false, true, false, true, 
XSConstants.ANYSIMPLETYPE_DT);
 
+    static final XSSimpleTypeDecl fAnyAtomicType = new 
XSSimpleTypeDecl(fAnySimpleType, "anyAtomicType", DV_ANYATOMICTYPE, ORDERED_FALSE, 
false, true, false, true, XSConstants.ANYATOMICTYPE_DT);
+       
     /**
      * Validation context used to validate facet values.
      */
Index: src/org/apache/xerces/xs/XSConstants.java
===================================================================
RCS file: /home/cvspublic/xml-xerces/java/src/org/apache/xerces/xs/XSConstants.java,v
retrieving revision 1.5
diff -u -r1.5 XSConstants.java
--- src/org/apache/xerces/xs/XSConstants.java   15 Sep 2004 05:12:24 -0000      1.5
+++ src/org/apache/xerces/xs/XSConstants.java   29 Sep 2004 20:54:06 -0000
@@ -332,10 +332,20 @@
      * represent a restricted duration containing the day and 
      * time portion of the duration value space.
      */
-    public static final short DAYTIMEDURATION_DT               = 46;
+    public static final short DAYTIMEDURATION_DT               = 46;   
+    /**
+     * precisionDecimal
+     * 
+     * The type represents new datatype introduced in Schema 1.1
+     */
+    public static final short PRECISIONDECIMAL_DT              = 47;
+    /**
+     * anyAtomicType
+     */
+    public static final short ANYATOMICTYPE_DT                 = 48;
     /**
      * The built-in type category is not available.
      */
-    public static final short UNAVAILABLE_DT            = 47;
+    public static final short UNAVAILABLE_DT            = 49;
 
 }
Index: src/org/apache/xerces/impl/dv/xs/AnyAtomicDV.java
===================================================================
RCS file: src/org/apache/xerces/impl/dv/xs/AnyAtomicDV.java
diff -N src/org/apache/xerces/impl/dv/xs/AnyAtomicDV.java
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ src/org/apache/xerces/impl/dv/xs/AnyAtomicDV.java   1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.xerces.impl.dv.xs;
+
+import org.apache.xerces.impl.dv.InvalidDatatypeValueException;
+import org.apache.xerces.impl.dv.ValidationContext;
+
+/**
+ * <p><b>EXPERIMENTAL: This class should not be considered stable.
+ * It is likely it may be altered or replaced/removed in the future.</b></p>
+ * Represent the schema type "anyAtomicType"
+ *
+ * @author Ankit Pasricha, IBM
+ */
+class AnyAtomicDV extends TypeValidator {
+
+    public short getAllowedFacets() {
+        return 0;
+    }
+
+    public Object getActualValue(String content, ValidationContext context) throws 
InvalidDatatypeValueException {
+        return content;
+    }
+
+} // class AnyAtomicDV
Index: src/org/apache/xerces/impl/dv/xs/PrecisionDecimalDV.java
===================================================================
RCS file: src/org/apache/xerces/impl/dv/xs/PrecisionDecimalDV.java
diff -N src/org/apache/xerces/impl/dv/xs/PrecisionDecimalDV.java
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ src/org/apache/xerces/impl/dv/xs/PrecisionDecimalDV.java    1 Jan 1970 00:00:00 
-0000
@@ -0,0 +1,357 @@
+/*
+ * Copyright 2001, 2002,2004 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.xerces.impl.dv.xs;
+
+import org.apache.xerces.impl.dv.InvalidDatatypeValueException;
+import org.apache.xerces.impl.dv.ValidationContext;
+
+/**
+ * <p><b>EXPERIMENTAL: This class should not be considered stable.
+ * It is likely it may be altered or replaced/removed in the future.</b></p>
+ * Validator for <precisionDecimal> datatype (W3C Schema 1.1)
+ * 
+ * @author Ankit Pasricha, IBM
+ */
+class PrecisionDecimalDV extends TypeValidator {
+
+       static class XPrecisionDecimal {
+
+        // sign: 0 for absent; 1 for positive values; -1 for negative values (except 
in case of INF, -INF)
+        int sign = 1;
+        // total digits. >= 1
+        int totalDigits = 0;
+        // integer digits when sign != 0
+        int intDigits = 0;
+        // fraction digits when sign != 0
+        int fracDigits = 0;
+        //precision
+        //int precision = 0;
+        // the string representing the integer part
+        String ivalue = "";
+        // the string representing the fraction part
+        String fvalue = "";
+        
+        int pvalue = 0;
+
+        
+        XPrecisionDecimal(String content) throws NumberFormatException {
+               if(content.equals("NaN")) {
+                       ivalue = content;
+                       sign = 0;
+               }
+               if(content.equals("+INF") || content.equals("INF") || 
content.equals("-INF")) {
+                       ivalue = content.charAt(0) == '+'?content.substring(1):content;
+                       return;
+               }
+            initD(content);
+        }
+        
+        void initD(String content) throws NumberFormatException {
+            int len = content.length();
+            if (len == 0)
+                throw new NumberFormatException();
+    
+            // these 4 variables are used to indicate where the integre/fraction
+            // parts start/end.
+            int intStart = 0, intEnd = 0, fracStart = 0, fracEnd = 0;
+            
+            // Deal with leading sign symbol if present
+            if (content.charAt(0) == '+') {
+                // skip '+', so intStart should be 1
+                intStart = 1;
+            }
+            else if (content.charAt(0) == '-') {
+                intStart = 1;
+                sign = -1;
+            }
+    
+            // skip leading zeroes in integer part
+            int actualIntStart = intStart;
+            while (actualIntStart < len && content.charAt(actualIntStart) == '0') {
+                actualIntStart++;
+            }
+    
+            // Find the ending position of the integer part
+            for (intEnd = actualIntStart;
+                 intEnd < len && TypeValidator.isDigit(content.charAt(intEnd));
+                 intEnd++);
+    
+            // Not reached the end yet
+            if (intEnd < len) {
+                // the remaining part is not ".DDD" or "EDDD" or "eDDD", error
+                if (content.charAt(intEnd) != '.' && content.charAt(intEnd) != 'E' && 
content.charAt(intEnd) != 'e')
+                    throw new NumberFormatException();
+    
+                if(content.charAt(intEnd) == '.') {
+                       // fraction part starts after '.', and ends at the end of the 
input
+                       fracStart = intEnd + 1;
+                       
+                       // find location of E or e (if present)
+                       // Find the ending position of the fracion part
+                       for (fracEnd = fracStart;
+                            fracEnd < len && 
TypeValidator.isDigit(content.charAt(fracEnd));
+                            fracEnd++);
+                }
+                else {
+                       pvalue = Integer.parseInt(content.substring(intEnd + 1, len));
+                }
+            }
+    
+            // no integer part, no fraction part, error.
+            if (intStart == intEnd && fracStart == fracEnd)
+                throw new NumberFormatException();
+    
+            // ignore trailing zeroes in fraction part
+            /*while (fracEnd > fracStart && content.charAt(fracEnd-1) == '0') {
+                fracEnd--;
+            }*/
+    
+            // check whether there is non-digit characters in the fraction part
+            for (int fracPos = fracStart; fracPos < fracEnd; fracPos++) {
+                if (!TypeValidator.isDigit(content.charAt(fracPos)))
+                    throw new NumberFormatException();
+            }
+    
+            intDigits = intEnd - actualIntStart;
+            fracDigits = fracEnd - fracStart;
+    
+            if (intDigits > 0) {
+                ivalue = content.substring(actualIntStart, intEnd);
+            }
+            
+            if (fracDigits > 0) {
+                fvalue = content.substring(fracStart, fracEnd);
+                if(fracEnd < len) {
+                       pvalue = Integer.parseInt(content.substring(fracEnd + 1, len));
+                }
+            }
+            totalDigits = intDigits + fracDigits;
+        }
+        
+        
+        public boolean equals(Object val) {
+            if (val == this)
+                return true;
+    
+            if (!(val instanceof XPrecisionDecimal))
+                return false;
+            XPrecisionDecimal oval = (XPrecisionDecimal)val;
+            
+            return this.compareTo(oval) == EQUAL;
+        }
+        
+        /**
+                * @return
+                */
+               private int compareFractionalPart(XPrecisionDecimal oval) {
+                       if(fvalue.equals(oval.fvalue))
+                               return EQUAL;
+                       
+                       StringBuffer temp1 = new StringBuffer(fvalue);
+                       StringBuffer temp2 = new StringBuffer(oval.fvalue);
+                       
+                       truncateTrailingZeros(temp1, temp2);
+                       return temp1.toString().compareTo(temp2.toString());
+               }
+
+               private void truncateTrailingZeros(StringBuffer fValue, StringBuffer 
otherFValue) {
+                       for(int i = fValue.length() - 1;i >= 0; i--)
+                               if(fValue.charAt(i) == '0')
+                                       fValue.deleteCharAt(i);
+                               else
+                                       break;
+                       
+                       for(int i = otherFValue.length() - 1;i >= 0; i--)
+                               if(otherFValue.charAt(i) == '0')
+                                       otherFValue.deleteCharAt(i);
+                               else
+                                       break;
+               }
+               
+               public int compareTo(XPrecisionDecimal val) {
+                       
+                       // seen NaN
+                       if(sign == 0)
+                               return INDETERMINATE;
+                       
+                       //INF is greater than everything and equal to itself
+                       if(ivalue.equals("INF") || val.ivalue.equals("INF")) {
+                               if(ivalue.equals(val.ivalue))
+                                       return EQUAL;
+                               else if(ivalue.equals("INF"))
+                                       return GREATER_THAN;
+                               return LESS_THAN;
+                       }
+                       
+                       //-INF is smaller than everything and equal itself
+                       if(ivalue.equals("-INF") || val.ivalue.equals("-INF")) {
+                               if(ivalue.equals(val.ivalue))
+                                       return EQUAL;
+                               else if(ivalue.equals("-INF"))
+                                       return LESS_THAN;
+                               return GREATER_THAN;
+                       }
+                       
+            if (sign != val.sign)
+                return sign > val.sign ? GREATER_THAN : LESS_THAN;
+
+            return sign * compare(val);
+        }
+        
+               // To enable comparison - the exponent part of the decimal will be 
limited
+               // to the max value of int.
+        private int compare(XPrecisionDecimal val) {           
+               
+               if(pvalue != 0 || val.pvalue != 0) {
+                       if(pvalue == val.pvalue)
+                               return intComp(val);
+                       else {
+                               
+                               if(intDigits + pvalue != val.intDigits + val.pvalue)
+                                       return intDigits + pvalue > val.intDigits + 
val.pvalue ? GREATER_THAN : LESS_THAN;
+                               
+                               //otherwise the 2 combined values are the same
+                               if(pvalue > val.pvalue) {
+                                       int expDiff = pvalue - val.pvalue;
+                                       StringBuffer buffer = new StringBuffer(ivalue);
+                                       StringBuffer fbuffer = new 
StringBuffer(fvalue);
+                                       for(int i = 0;i < expDiff; i++) {
+                                               if(i < fracDigits) {
+                                                       
buffer.append(fvalue.charAt(i));
+                                                       fbuffer.deleteCharAt(i);
+                                               }
+                                               else
+                                                       buffer.append('0');
+                                       }                                       
+                                       return compareDecimal(buffer.toString(), 
val.ivalue, fbuffer.toString(), val.fvalue);
+                               }
+                               else {
+                                       int expDiff = val.pvalue - pvalue;
+                                       StringBuffer buffer = new 
StringBuffer(val.ivalue);
+                                       StringBuffer fbuffer = new 
StringBuffer(val.fvalue);
+                                       for(int i = 0;i < expDiff; i++) {
+                                               if(i < val.fracDigits) {
+                                                       
buffer.append(val.fvalue.charAt(i));
+                                                       fbuffer.deleteCharAt(i);
+                                               }
+                                               else
+                                                       buffer.append('0');
+                                       }                                       
+                                       return compareDecimal(ivalue, 
buffer.toString(), fvalue, fbuffer.toString());
+                               }
+                       }
+               }
+               else {
+                return intComp(val);
+               }
+        }
+        
+        /**
+                * @param val
+                * @return
+                */
+               private int intComp(XPrecisionDecimal val) {
+                       if (intDigits != val.intDigits)
+                           return intDigits > val.intDigits ? GREATER_THAN : 
LESS_THAN;
+                       
+                       return compareDecimal(ivalue, val.ivalue, fvalue, val.fvalue);
+               }
+
+               /**
+                * @param val
+                * @return
+                */
+               private int compareDecimal(String iValue, String fValue, String 
otherIValue, String otherFValue) {
+                       int ret = iValue.compareTo(otherIValue);
+                       if (ret != 0)
+                           return ret > 0 ? GREATER_THAN : LESS_THAN;
+                       
+                       if(fValue.equals(otherFValue))
+                               return EQUAL;
+                       
+                       StringBuffer temp1=new StringBuffer(fValue);
+                       StringBuffer temp2=new StringBuffer(otherFValue);
+                       
+                       truncateTrailingZeros(temp1, temp2);
+                       ret = temp1.toString().compareTo(temp2.toString());
+                       return ret == 0 ? EQUAL : (ret > 0 ? GREATER_THAN : LESS_THAN);
+               }
+
+               private String canonical;
+        
+        public synchronized String toString() {
+            if (canonical == null) {
+                makeCanonical();
+            }
+            return canonical;
+        }
+        
+        private void makeCanonical() {
+               canonical = "TBD by Working Group";
+        }
+
+               /**
+                * @param decimal
+                * @return
+                */
+               public boolean isIdentical(XPrecisionDecimal decimal) {
+                       if(ivalue.equals(decimal.ivalue) && (ivalue.equals("INF") || 
ivalue.equals("-INF") || ivalue.equals("NaN")))
+                               return true;
+                       
+                       if(sign == decimal.sign && intDigits == decimal.intDigits && 
fracDigits == decimal.fracDigits && pvalue == decimal.pvalue 
+                                       && ivalue.equals(decimal.ivalue) && 
fvalue.equals(decimal.fvalue))
+                               return true;
+                       return false;
+               }
+
+       }
+       /* (non-Javadoc)
+        * @see org.apache.xerces.impl.dv.xs.TypeValidator#getAllowedFacets()
+        */
+       public short getAllowedFacets() {
+        return ( XSSimpleTypeDecl.FACET_PATTERN | XSSimpleTypeDecl.FACET_WHITESPACE | 
XSSimpleTypeDecl.FACET_ENUMERATION |XSSimpleTypeDecl.FACET_MAXINCLUSIVE 
|XSSimpleTypeDecl.FACET_MININCLUSIVE | XSSimpleTypeDecl.FACET_MAXEXCLUSIVE  | 
XSSimpleTypeDecl.FACET_MINEXCLUSIVE | XSSimpleTypeDecl.FACET_TOTALDIGITS | 
XSSimpleTypeDecl.FACET_FRACTIONDIGITS);
+       }
+
+       /* (non-Javadoc)
+        * @see 
org.apache.xerces.impl.dv.xs.TypeValidator#getActualValue(java.lang.String, 
org.apache.xerces.impl.dv.ValidationContext)
+        */
+       public Object getActualValue(String content, ValidationContext context)
+                       throws InvalidDatatypeValueException {
+        try {
+            return new XPrecisionDecimal(content);
+        } catch (NumberFormatException nfe) {
+            throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.1", new 
Object[]{content, "precisionDecimal"});
+        }
+       }
+
+       public int compare(Object value1, Object value2) {
+               return 
((XPrecisionDecimal)value1).compareTo((XPrecisionDecimal)value2);
+       }
+       
+       public int getFractionDigits(Object value) {
+               return ((XPrecisionDecimal)value).fracDigits;
+       }
+       
+       public int getTotalDigits(Object value) {
+               return ((XPrecisionDecimal)value).totalDigits;
+       }
+       
+       public boolean isIdentical(Object value1, Object value2) {
+               if(!(value2 instanceof XPrecisionDecimal) || !(value1 instanceof 
XPrecisionDecimal))
+                       return false;
+               return 
((XPrecisionDecimal)value1).isIdentical((XPrecisionDecimal)value2);      
+       }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to