View Javadoc
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