This patch makes the date-time datatypes keep timezones even after normalization.
Also fixes a bug which allowed timezones outside of valid range.



Ankit Pasricha
XML Parser Development
IBM Toronto Lab
8200 Warden Avenue, Ontario L6G 1C7
Phone: (905) 413 4941
Index: AbstractDateTimeDV.java
===================================================================
RCS file: 
/home/cvspublic/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/AbstractDateTimeDV.java,v
retrieving revision 1.16
diff -u -r1.16 AbstractDateTimeDV.java
--- AbstractDateTimeDV.java     20 Sep 2004 22:51:08 -0000      1.16
+++ AbstractDateTimeDV.java     21 Sep 2004 17:49:41 -0000
@@ -42,8 +42,6 @@
 
     //define shared variables for date/time
 
-    //define constants
-    protected final static int hh=0, mm=1;
 
     //define constants to be used in assigning default values for
     //all date/time excluding duration
@@ -77,17 +75,16 @@
         short c1, c2;
 
         DateTimeData tempDate = new DateTimeData(this);
-        int[] timeZone = new int[2];
 
         if ( date1.utc=='Z' ) {
 
             //compare date1<=date1<=(date2 with time zone -14)
             //
             cloneDate(date2, tempDate); //clones date1 value to global temporary 
storage: fTempDate
-            timeZone[hh]=14;
-            timeZone[mm]=0;
+            tempDate.timezoneHr=14;
+            tempDate.timezoneMin = 0;
             tempDate.utc='+';
-            normalize(tempDate, timeZone);
+            normalize(tempDate);
             c1 = compareOrder(date1, tempDate);
             if (c1 == LESS_THAN)
                 return c1;
@@ -95,10 +92,10 @@
             //compare date1>=(date2 with time zone +14)
             //
             cloneDate(date2, tempDate); //clones date1 value to global temporary 
storage: tempDate
-            timeZone[hh]=14;
-            timeZone[mm]=0;
+            tempDate.timezoneHr = -14;
+            tempDate.timezoneMin = 0;
             tempDate.utc='-';
-            normalize(tempDate, timeZone);
+            normalize(tempDate);
             c2 = compareOrder(date1, tempDate);
             if (c2 == GREATER_THAN)
                 return c2;
@@ -110,13 +107,13 @@
             //compare (date1 with time zone -14)<=date2
             //
             cloneDate(date1, tempDate); //clones date1 value to global temporary 
storage: tempDate
-            timeZone[hh]=14;
-            timeZone[mm]=0;
+            tempDate.timezoneHr = -14;
+            tempDate.timezoneMin = 0;
             tempDate.utc='-';
             if (DEBUG) {
                System.out.println("tempDate=" + dateToString(tempDate));
             }
-            normalize(tempDate, timeZone);
+            normalize(tempDate);
             c1 = compareOrder(tempDate, date2);
             if (DEBUG) {
                 System.out.println("date=" + dateToString(date2));
@@ -128,10 +125,10 @@
             //compare (date1 with time zone +14)<=date2
             //
             cloneDate(date1, tempDate); //clones date1 value to global temporary 
storage: tempDate
-            timeZone[hh]=14;
-            timeZone[mm]=0;
+            tempDate.timezoneHr = 14;
+            tempDate.timezoneMin = 0;
             tempDate.utc='+';
-            normalize(tempDate, timeZone);
+            normalize(tempDate);
             c2 = compareOrder(tempDate, date2);
             if (DEBUG) {
                System.out.println("tempDate=" + dateToString(tempDate));
@@ -193,7 +190,7 @@
      * @param data
      * @exception RuntimeException
      */
-    protected  void getTime (String buffer, int start, int end, DateTimeData data, 
int[] timeZone) throws RuntimeException{
+    protected  void getTime (String buffer, int start, int end, DateTimeData data) 
throws RuntimeException{
 
         int stop = start+2;
 
@@ -224,7 +221,7 @@
 
         //parse UTC time zone (hh:mm)
         if (sign > 0) {
-            getTimeZone(buffer, data, sign, end, timeZone);
+            getTimeZone(buffer, data, sign, end);
         }
     }
 
@@ -291,7 +288,7 @@
      * @param date
      * @exception RuntimeException
      */
-    protected void parseTimeZone (String buffer, int start, int end, DateTimeData 
date, int[] timeZone) throws RuntimeException{
+    protected void parseTimeZone (String buffer, int start, int end, DateTimeData 
date) throws RuntimeException{
 
         //fStart points right after the date
 
@@ -301,7 +298,7 @@
                 throw new RuntimeException ("Error in month parsing");
             }
             else {
-                getTimeZone(buffer, date, sign, end, timeZone);
+                getTimeZone(buffer, date, sign, end);
             }
         }
     }
@@ -313,7 +310,7 @@
      * @param sign
      * @exception RuntimeException
      */
-    protected void getTimeZone (String buffer, DateTimeData data, int sign, int end, 
int[] timeZone) throws RuntimeException{
+    protected void getTimeZone (String buffer, DateTimeData data, int sign, int end) 
throws RuntimeException{
         data.utc=buffer.charAt(sign);
 
         if ( buffer.charAt(sign) == 'Z' ) {
@@ -324,26 +321,26 @@
         }
         if ( sign<=(end-6) ) {
 
-            //parse [hh]
+               int negate = buffer.charAt(sign) == '-'?-1:1;
+            //parse hr
             int stop = ++sign+2;
-            timeZone[hh]=parseInt(buffer, sign, stop);
+            data.timezoneHr = negate*parseInt(buffer, sign, stop);
             if (buffer.charAt(stop++)!=':') {
                 throw new RuntimeException("Error in parsing time zone" );
             }
 
-            //parse [ss]
-            timeZone[mm]=parseInt(buffer, stop, stop+2);
+            //parse min
+            data.timezoneMin = negate*parseInt(buffer, stop, stop+2);
 
             if ( stop+2!=end ) {
                 throw new RuntimeException("Error in parsing time zone");
             }
-
         }
         else {
             throw new RuntimeException("Error in parsing time zone");
         }
         if ( DEBUG ) {
-            System.out.println("time[hh]="+timeZone[hh] + " time[mm]=" +timeZone[mm]);
+            System.out.println("time[hh]="+data.timezoneHr + " time[mm]=" 
+data.timezoneMin);
         }
     }
 
@@ -370,7 +367,7 @@
      *
      * @param data
      */
-    protected void validateDateTime (DateTimeData data, int[] timeZone) {
+    protected void validateDateTime (DateTimeData data) {
 
         //REVISIT: should we throw an exception for not valid dates
         //          or reporting an error message should be sufficient?
@@ -406,10 +403,10 @@
                         }
                         else if (++data.year == 0) {
                             data.year = 1;
-                        }
                     }
                 }
             }
+            }
             else {
                 throw new RuntimeException("Hour must have values 0-23, unless 
24:00:00");
             }
@@ -427,14 +424,16 @@
         }
 
         //validate
-        if ( timeZone[hh]>14 || timeZone[hh]<-14 ) {
-            throw new RuntimeException("Time zone should have range -14..+14");
+        if ( data.timezoneHr>14 || data.timezoneHr<-14 ) {
+            throw new RuntimeException("Time zone should have range -14:00 to 
+14:00");
         }
-
-        //validate
-        if ( timeZone[mm]>59 || timeZone[mm]<-59 ) {
-            throw new RuntimeException("Minute must have values 0-59");
+        else {
+               if((data.timezoneHr == 14 || data.timezoneHr == -14) && 
data.timezoneMin != 0)
+                       throw new RuntimeException("Time zone should have range -14:00 
to +14:00");
+               else if(data.timezoneMin > 59 || data.timezoneMin < -59)
+                       throw new RuntimeException("Minute must have values 0-59");
         }
+
     }
 
     /**
@@ -530,22 +529,20 @@
      * @param date   CCYY-MM-DDThh:mm:ss+03
      * @return CCYY-MM-DDThh:mm:ssZ
      */
-    protected void normalize(DateTimeData date, int[] timeZone) {
+    protected void normalize(DateTimeData date) {
 
         // REVISIT: we have common code in addDuration() for durations
         //          should consider reorganizing it.
         //
-
+       
         //add minutes (from time zone)
-        int negate = 1;
-        if (date.utc=='+') {
-            negate = -1;
-        }
+        int negate = -1;
+
         if ( DEBUG ) {
             System.out.println("==>date.minute"+date.minute);
-            System.out.println("==>timeZone[mm]" +timeZone[mm]);
+            System.out.println("==>date.timezoneMin" +date.timezoneMin);
         }
-        int temp = date.minute + negate*timeZone[mm];
+        int temp = date.minute + negate * date.timezoneMin;
         int carry = fQuotient (temp, 60);
         date.minute= mod(temp, 60, carry);
 
@@ -553,7 +550,7 @@
             System.out.println("==>carry: " + carry);
         }
         //add hours
-        temp = date.hour + negate*timeZone[hh] + carry;
+        temp = date.hour + negate * date.timezoneHr + carry;
         carry = fQuotient(temp, 24);
         date.hour=mod(temp, 24, carry);
         if ( DEBUG ) {
@@ -597,6 +594,8 @@
         data.minute = 0;
         data.second = 0;
         data.utc = 0;
+        data.timezoneHr = 0;
+        data.timezoneMin = 0;
     }
 
     /**
@@ -752,6 +751,8 @@
         tempDate.minute = finalValue.minute;
         tempDate.second = finalValue.second;
         tempDate.utc = finalValue.utc;
+        tempDate.timezoneHr = finalValue.timezoneHr;
+        tempDate.timezoneMin = finalValue.timezoneMin;
     }
 
     /**
@@ -760,6 +761,7 @@
     static final class DateTimeData {
         int year, month, day, hour, minute, utc;
         double second;
+        int timezoneHr, timezoneMin;
         // a pointer to the type that was used go generate this data
         // note that this is not the actual simple type, but one of the
         // statically created XXXDV objects, so this won't cause any GC problem.
Index: DateDV.java
===================================================================
RCS file: 
/home/cvspublic/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/DateDV.java,v
retrieving revision 1.11
diff -u -r1.11 DateDV.java
--- DateDV.java 26 Aug 2004 02:14:40 -0000      1.11
+++ DateDV.java 21 Sep 2004 17:49:41 -0000
@@ -48,17 +48,16 @@
     protected DateTimeData parse(String str) throws SchemaDateTimeException{
         DateTimeData date = new DateTimeData(this);
         int len = str.length();
-        int[] timeZone = new int[2];
 
         int end = getDate(str, 0, len, date);
-        parseTimeZone (str, end, len, date, timeZone);
+        parseTimeZone (str, end, len, date);
 
         //validate and normalize
         //REVISIT: do we need SchemaDateTimeException?
-        validateDateTime(date, timeZone);
+        validateDateTime(date);
 
         if (date.utc!=0 && date.utc!='Z') {
-            normalize(date, timeZone);
+            normalize(date);
         }
         return date;
     }
Index: DateTimeDV.java
===================================================================
RCS file: 
/home/cvspublic/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/DateTimeDV.java,v
retrieving revision 1.9
diff -u -r1.9 DateTimeDV.java
--- DateTimeDV.java     26 Aug 2004 02:14:40 -0000      1.9
+++ DateTimeDV.java     21 Sep 2004 17:49:41 -0000
@@ -49,13 +49,12 @@
     protected DateTimeData parse(String str) throws SchemaDateTimeException {
         DateTimeData date = new DateTimeData(this);
         int len = str.length();
-        int[] timeZone = new int[2];
 
         int end = indexOf (str, 0, len, 'T');
 
         // both time and date
         int dateEnd = getDate(str, 0, end, date);
-        getTime(str, end+1, len, date, timeZone);
+        getTime(str, end+1, len, date);
 
         //Check the separator character between Date and Time
         if (dateEnd != end) {
@@ -67,10 +66,10 @@
         //validate and normalize
 
         //REVISIT: do we need SchemaDateTimeException?
-        validateDateTime(date, timeZone);
+        validateDateTime(date);
 
         if (date.utc!=0 && date.utc!='Z') {
-            normalize(date, timeZone);
+            normalize(date);
         }
         return date;
     }
Index: DayDV.java
===================================================================
RCS file: /home/cvspublic/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/DayDV.java,v
retrieving revision 1.9
diff -u -r1.9 DayDV.java
--- DayDV.java  26 Aug 2004 02:14:40 -0000      1.9
+++ DayDV.java  21 Sep 2004 17:49:41 -0000
@@ -52,7 +52,6 @@
     protected DateTimeData parse(String str) throws SchemaDateTimeException {
         DateTimeData date = new DateTimeData(this);
         int len = str.length();
-        int[] timeZone = new int[2];
 
         if (str.charAt(0)!='-' || str.charAt(1)!='-' || str.charAt(2)!='-') {
             throw new SchemaDateTimeException ("Error in day parsing");
@@ -70,15 +69,15 @@
                 throw new SchemaDateTimeException ("Error in day parsing");
             }
             else {
-                getTimeZone(str, date, sign, len, timeZone);
+                getTimeZone(str, date, sign, len);
             }
         }
 
        //validate and normalize
-        validateDateTime(date, timeZone);
+        validateDateTime(date);
 
         if ( date.utc!=0 && date.utc!='Z' ) {
-            normalize(date, timeZone);
+            normalize(date);
         }
         return date;
     }
Index: MonthDV.java
===================================================================
RCS file: 
/home/cvspublic/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/MonthDV.java,v
retrieving revision 1.11
diff -u -r1.11 MonthDV.java
--- MonthDV.java        26 Aug 2004 02:14:40 -0000      1.11
+++ MonthDV.java        21 Sep 2004 17:49:41 -0000
@@ -56,7 +56,6 @@
     protected DateTimeData parse(String str) throws SchemaDateTimeException{
         DateTimeData date = new DateTimeData(this);
         int len = str.length();
-        int[] timeZone = new int[2];
 
         //set constants
         date.year=YEAR;
@@ -80,14 +79,14 @@
                 throw new SchemaDateTimeException ("Error in month parsing: "+str);
             }
             else {
-                getTimeZone(str, date, sign, len, timeZone);
+                getTimeZone(str, date, sign, len);
             }
         }
         //validate and normalize
-        validateDateTime(date, timeZone);
+        validateDateTime(date);
 
         if ( date.utc!=0 && date.utc!='Z' ) {
-            normalize(date, timeZone);
+            normalize(date);
         }
         return date;
     }
Index: MonthDayDV.java
===================================================================
RCS file: 
/home/cvspublic/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/MonthDayDV.java,v
retrieving revision 1.9
diff -u -r1.9 MonthDayDV.java
--- MonthDayDV.java     26 Aug 2004 02:14:40 -0000      1.9
+++ MonthDayDV.java     21 Sep 2004 17:49:41 -0000
@@ -59,7 +59,6 @@
     protected DateTimeData parse(String str) throws SchemaDateTimeException{
         DateTimeData date = new DateTimeData(this);
         int len = str.length();
-        int[] timeZone = new int[2];
 
         //initialize
         date.year=YEAR;
@@ -82,15 +81,15 @@
                 throw new SchemaDateTimeException ("Error in month parsing:" +str);
             }
             else {
-                getTimeZone(str, date, sign, len, timeZone);
+                getTimeZone(str, date, sign, len);
             }
         }
         //validate and normalize
 
-        validateDateTime(date, timeZone);
+        validateDateTime(date);
 
         if ( date.utc!=0 && date.utc!='Z' ) {
-            normalize(date, timeZone);
+            normalize(date);
         }
         return date;
     }
Index: TimeDV.java
===================================================================
RCS file: 
/home/cvspublic/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/TimeDV.java,v
retrieving revision 1.9
diff -u -r1.9 TimeDV.java
--- TimeDV.java 26 Aug 2004 02:14:40 -0000      1.9
+++ TimeDV.java 21 Sep 2004 17:49:41 -0000
@@ -56,21 +56,20 @@
     protected DateTimeData parse(String str) throws SchemaDateTimeException{
         DateTimeData date = new DateTimeData(this);
         int len = str.length();
-        int[] timeZone = new int[2];
 
         // time
         // initialize to default values
         date.year=YEAR;
         date.month=MONTH;
         date.day=DAY;
-        getTime(str, 0, len, date, timeZone);
+        getTime(str, 0, len, date);
 
         //validate and normalize
 
-        validateDateTime(date, timeZone);
+        validateDateTime(date);
 
         if ( date.utc!=0 ) {
-            normalize(date, timeZone);
+            normalize(date);
         }
         return date;
     }
Index: YearDV.java
===================================================================
RCS file: 
/home/cvspublic/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/YearDV.java,v
retrieving revision 1.9
diff -u -r1.9 YearDV.java
--- YearDV.java 26 Aug 2004 02:14:41 -0000      1.9
+++ YearDV.java 21 Sep 2004 17:49:42 -0000
@@ -56,7 +56,6 @@
     protected DateTimeData parse(String str) throws SchemaDateTimeException{
         DateTimeData date = new DateTimeData(this);
         int len = str.length();
-        int[] timeZone = new int[2];
 
         // check for preceding '-' sign
         int start = 0;
@@ -69,7 +68,7 @@
         }
         else {
             date.year=parseIntYear(str, sign);
-            getTimeZone (str, date, sign, len, timeZone);
+            getTimeZone (str, date, sign, len);
         }
 
         //initialize values
@@ -77,10 +76,10 @@
         date.day=1;
 
         //validate and normalize
-        validateDateTime(date, timeZone);
+        validateDateTime(date);
 
         if ( date.utc!=0 && date.utc!='Z' ) {
-            normalize(date, timeZone);
+            normalize(date);
         }
         return date;
     }
Index: YearMonthDV.java
===================================================================
RCS file: 
/home/cvspublic/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/YearMonthDV.java,v
retrieving revision 1.9
diff -u -r1.9 YearMonthDV.java
--- YearMonthDV.java    26 Aug 2004 02:14:41 -0000      1.9
+++ YearMonthDV.java    21 Sep 2004 17:49:42 -0000
@@ -55,19 +55,18 @@
     protected DateTimeData parse(String str) throws SchemaDateTimeException{
         DateTimeData date = new DateTimeData(this);
         int len = str.length();
-        int[] timeZone = new int[2];
 
         // get date
         int end = getYearMonth(str, 0, len, date);
         date.day = DAY;
-        parseTimeZone (str, end, len, date, timeZone);
+        parseTimeZone (str, end, len, date);
 
         //validate and normalize
 
-        validateDateTime(date, timeZone);
+        validateDateTime(date);
 
         if ( date.utc!=0 && date.utc!='Z' ) {
-            normalize(date, timeZone);
+            normalize(date);
         }
         return date;
     }
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to