KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > gnu > kawa > xml > XTimeType


1 // Copyright (c) 2006 Per M.A. Bothner.
2
// This is free software; for specifics see ../../../COPYING.
3

4 package gnu.kawa.xml;
5 import java.util.Calendar JavaDoc;
6 import gnu.bytecode.*;
7 import gnu.math.*;
8 import java.util.GregorianCalendar JavaDoc;
9 import java.util.TimeZone JavaDoc;
10
11 public class XTimeType extends XDataType
12 {
13   static ClassType typeDateTime = ClassType.make("gnu.math.DateTime");
14
15   public static final XTimeType dateTimeType =
16     new XTimeType("dateTime", DATE_TIME_TYPE_CODE);
17
18   public static final XTimeType dateType =
19     new XTimeType("date", DATE_TYPE_CODE);
20   public static final XTimeType timeType =
21     new XTimeType("time", TIME_TYPE_CODE);
22   public static final XTimeType gYearMonthType =
23     new XTimeType("gYearMonth", G_YEAR_MONTH_TYPE_CODE);
24   public static final XTimeType gYearType =
25     new XTimeType("gYear", G_YEAR_TYPE_CODE);
26   public static final XTimeType gMonthType =
27     new XTimeType("gMonth", G_MONTH_TYPE_CODE);
28   public static final XTimeType gMonthDayType =
29     new XTimeType("gMonthDay", G_MONTH_DAY_TYPE_CODE);
30   public static final XTimeType gDayType =
31     new XTimeType("gDay", G_DAY_TYPE_CODE);
32
33   XTimeType(String JavaDoc name, int code)
34   {
35     super((Object JavaDoc) name/*FIXME*/, typeDateTime, code);
36   }
37
38   static int components (int typeCode)
39   {
40     switch (typeCode)
41       {
42       case DATE_TIME_TYPE_CODE:
43         return DateTime.DATE_MASK|DateTime.TIME_MASK;
44       case DATE_TYPE_CODE:
45         return DateTime.DATE_MASK;
46       case TIME_TYPE_CODE:
47         return DateTime.TIME_MASK;
48       case G_YEAR_MONTH_TYPE_CODE:
49         return DateTime.YEAR_MASK|DateTime.MONTH_MASK;
50       case G_YEAR_TYPE_CODE:
51         return DateTime.YEAR_MASK;
52       case G_MONTH_DAY_TYPE_CODE:
53         return DateTime.MONTH_MASK|DateTime.DAY_MASK;
54       case G_DAY_TYPE_CODE:
55         return DateTime.DAY_MASK;
56       case G_MONTH_TYPE_CODE:
57         return DateTime.MONTH_MASK;
58       case DURATION_TYPE_CODE:
59         return DateTime.DATE_MASK|DateTime.TIME_MASK;
60       case YEAR_MONTH_DURATION_TYPE_CODE:
61         return DateTime.YEAR_MASK|DateTime.MONTH_MASK;
62       case DAY_TIME_DURATION_TYPE_CODE:
63         return DateTime.DAY_MASK|DateTime.TIME_MASK;
64       default:
65         return 0;
66       }
67   }
68
69   /*
70   RuntimeException badFormat(String str)
71   {
72     return new NumberFormatException("Unrecognized "+name+": '"+str+'\'');
73   }
74   */

75
76   /** Return the current date or time in this type. */
77   public DateTime now ()
78   {
79     return new DateTime(XTimeType.components(typeCode)|DateTime.TIMEZONE_MASK,
80                         (GregorianCalendar JavaDoc) Calendar.getInstance(fixedTimeZone()));
81
82   }
83
84   private static TimeZone JavaDoc fixedTimeZone;
85   private static synchronized TimeZone JavaDoc fixedTimeZone ()
86   {
87     if (fixedTimeZone == null)
88       {
89         int offset = TimeZone.getDefault().getRawOffset() / 60000;
90         fixedTimeZone = DateTime.minutesToTimeZone(offset);
91       }
92     return fixedTimeZone;
93   }
94
95
96   public static DateTime parseDateTime (String JavaDoc value, int mask)
97   {
98     DateTime time = DateTime.parse(value, mask);
99     // Replace an implicit timezone by by one that is fixed wrt DST.
100
// I.e. TimeZone.getDefault() may be a timezone whose offset varies
101
// depending upon whether Daylight Savings Time is in effect.
102
// Replace it by one with a fixed offset. This is required for
103
// XQuery semantics, though I believe it is wrong.
104
if (time.isZoneUnspecified())
105       time.setTimeZone(fixedTimeZone());
106     return time;
107   }
108
109   public Object JavaDoc valueOf (String JavaDoc value)
110   {
111     return parseDateTime(value, XTimeType.components(typeCode));
112   }
113
114   public boolean isInstance (Object JavaDoc obj)
115   {
116     if (! (obj instanceof DateTime))
117       return false;
118     int thisMask = components(this.typeCode);
119     int objMask = ((DateTime) obj).components();
120     //return (thisMask & ~objMask) == 0;
121
return thisMask == objMask;
122   }
123 }
124
Popular Tags