1 package org.chronicj;
2
3 import java.io.ObjectStreamException;
4 import java.io.Serializable;
5
6 import java.util.Arrays;
7 import java.util.Calendar;
8 import java.util.Collections;
9 import java.util.List;
10
11 /***
12 * Constants used for expressing date precision when working with ChronicJ
13 * components. Implemented using the <a
14 * href="http://developer.java.sun.com/developer/Books/shiftintojava/page1.html">
15 * Typesafe Enum pattern</a> popularized by Joshua Bloch.
16 *
17 * @author <a href="mlipper@US-ABP.com">Matthew Lipper</a>
18 */
19 public abstract class DatePrecision implements Comparable, Serializable
20 {
21 public static final DatePrecision YEAR = new DatePrecision(Calendar.YEAR)
22 {
23 TimePoint increment(TimePoint aTimePoint, int amount)
24 {
25 return aTimePoint.addYears(amount);
26 }
27 };
28
29 public static final DatePrecision MONTH = new DatePrecision(Calendar.MONTH)
30 {
31 TimePoint increment(TimePoint aTimePoint, int amount)
32 {
33 return aTimePoint.addMonths(amount);
34 }
35 };
36
37 public static final DatePrecision DATE = new DatePrecision(Calendar.DATE)
38 {
39 TimePoint increment(TimePoint aTimePoint, int amount)
40 {
41 return aTimePoint.addDays(amount);
42 }
43 };
44
45 public static final DatePrecision HOUR_OF_DAY =
46 new DatePrecision(Calendar.HOUR_OF_DAY)
47 {
48 TimePoint increment(TimePoint aTimePoint, int amount)
49 {
50 return aTimePoint.addHours(amount);
51 }
52 };
53
54 public static final DatePrecision MINUTE =
55 new DatePrecision(Calendar.MINUTE)
56 {
57 TimePoint increment(TimePoint aTimePoint, int amount)
58 {
59 return aTimePoint.addMinutes(amount);
60 }
61 };
62
63 public static final DatePrecision SECOND =
64 new DatePrecision(Calendar.SECOND)
65 {
66 TimePoint increment(TimePoint aTimePoint, int amount)
67 {
68 return aTimePoint.addSeconds(amount);
69 }
70 };
71
72 public static final DatePrecision MILLISECOND =
73 new DatePrecision(Calendar.MILLISECOND)
74 {
75 TimePoint increment(TimePoint aTimePoint, int amount)
76 {
77 return aTimePoint.addMilliSeconds(amount);
78 }
79 };
80
81 private static final DatePrecision[] PRECISION =
82 { YEAR, MONTH, DATE, HOUR_OF_DAY, MINUTE, SECOND, MILLISECOND };
83 public static final List VALUES =
84 Collections.unmodifiableList(Arrays.asList(PRECISION));
85 private final int precision;
86
87 private DatePrecision(int calendarField)
88 {
89 precision = calendarField;
90 }
91
92 public int compareTo(Object arg)
93 {
94 if (arg == null)
95 {
96 throw new NullPointerException("Object argument cannot be null.");
97 }
98
99 //Unchecked cast: runtime error is desired if not proper type
100 DatePrecision other = (DatePrecision) arg;
101
102 //Sanity check (consistent w/ equals)
103 if (this.equals(other) && (this.precision == other.precision))
104 {
105 return 0;
106 }
107
108 if (this.precision > other.precision)
109 {
110 return 1;
111 }
112
113 return -1;
114 }
115
116 public boolean greaterThan(DatePrecision another)
117 {
118 return compareTo(another) == 1;
119 }
120
121 public boolean lessThan(DatePrecision another)
122 {
123 return compareTo(another) == -1;
124 }
125
126 abstract TimePoint increment(TimePoint aTimePoint, int amount);
127
128 public String toString()
129 {
130 switch (precision)
131 {
132 case Calendar.YEAR :
133 return "YEAR";
134
135 case Calendar.MONTH :
136 return "MONTH";
137
138 case Calendar.DATE :
139 return "DATE";
140
141 case Calendar.HOUR_OF_DAY :
142 return "HOUR_OF_DAY";
143
144 case Calendar.MINUTE :
145 return "MINUTE";
146
147 case Calendar.SECOND :
148 return "SECOND";
149
150 case Calendar.MILLISECOND :
151 return "MILLISECOND";
152
153 default :
154 throw new IllegalStateException("DatePrecision unknown. Programmer error!");
155 }
156 }
157
158 private Object readResolve() throws ObjectStreamException
159 {
160 return PRECISION[precision];
161 }
162 }
This page was automatically generated by Maven