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]
