1
20 package org.crosswire.common.icu;
21
22 import java.lang.reflect.InvocationTargetException;
23 import java.text.DateFormat;
24 import java.text.SimpleDateFormat;
25 import java.util.Date;
26
27 import org.crosswire.common.util.ClassUtil;
28 import org.crosswire.common.util.ReflectionUtil;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
31
32
41 public final class DateFormatter {
42
46 public static final int FULL = 0;
47
50 public static final int LONG = 1;
51
54 public static final int MEDIUM = 2;
55
58 public static final int SHORT = 3;
59
62 public static final int DEFAULT = MEDIUM;
63 private static final Logger LOGGER = LoggerFactory.getLogger(DateFormatter.class);
64 private static final String DEFAULT_SIMPLE_DATE_FORMAT_CLASS = "com.ibm.icu.text.SimpleDateFormat";
65 private static final String DEFAULT_DATE_FORMAT_CLASS = "com.ibm.icu.text.DateFormat";
66
67
70 private Object formatter;
71
74 private Class<?> formatterClass;
75 private static Class<?> defaultSimpleDateFormat;
76 private static Class<?> defaultDateFormat;
77
78 static {
79 try {
80 defaultSimpleDateFormat = ClassUtil.forName(DEFAULT_SIMPLE_DATE_FORMAT_CLASS);
81 } catch (ClassNotFoundException ex) {
82 LOGGER.info("Error loading simple date format class [{}]", DEFAULT_SIMPLE_DATE_FORMAT_CLASS);
83 }
84
85 try {
86 defaultDateFormat = ClassUtil.forName(DEFAULT_DATE_FORMAT_CLASS);
87 } catch (ClassNotFoundException ex) {
88 LOGGER.info("Error loading date format class [{}]", DEFAULT_SIMPLE_DATE_FORMAT_CLASS);
89 }
90 }
91
92
95 private DateFormatter() {
96 }
97
98
105 public static DateFormatter getDateInstance(int format) {
106 DateFormatter fmt = new DateFormatter();
107 boolean oops = false;
108 try {
109 fmt.formatterClass = defaultDateFormat;
110 Class<?>[] instanceTypes = {
113 int.class
114 };
115 Object[] instanceParams = {
116 Integer.valueOf(format)
117 };
118 fmt.formatter = ReflectionUtil.invoke(fmt.formatterClass, fmt.formatterClass, "getDateInstance", instanceParams, instanceTypes);
119 } catch (NoSuchMethodException e) {
120 oops = true;
121 } catch (IllegalAccessException e) {
122 oops = true;
123 } catch (InvocationTargetException e) {
124 oops = true;
125 } catch (NullPointerException e) {
126 oops = true;
127 }
128
129 if (oops) {
130 fmt.formatterClass = DateFormat.class;
131 fmt.formatter = DateFormat.getDateInstance(format);
132 }
133
134 return fmt;
135 }
136
137
143 public static DateFormatter getDateInstance() {
144 return getDateInstance(DEFAULT);
145 }
146
147
154 public static DateFormatter getSimpleDateInstance(String format) {
155 DateFormatter fmt = new DateFormatter();
156 boolean oops = false;
157 try {
158 fmt.formatterClass = defaultSimpleDateFormat;
159 fmt.formatter = ReflectionUtil.construct(fmt.formatterClass, format);
160 } catch (NoSuchMethodException e) {
161 oops = true;
162 } catch (IllegalAccessException e) {
163 oops = true;
164 } catch (InvocationTargetException e) {
165 oops = true;
166 } catch (NullPointerException e) {
167 oops = true;
168 } catch (InstantiationException e) {
169 oops = true;
170 }
171
172 if (oops) {
173 fmt.formatterClass = SimpleDateFormat.class;
174 fmt.formatter = new SimpleDateFormat(format);
175 }
176
177 return fmt;
178 }
179
180
186 public void setLenient(boolean lenient) {
187 try {
188 Class<?>[] lenientTypes = {
189 boolean.class
190 };
191 Object[] lenientParams = {
192 Boolean.valueOf(lenient)
193 };
194 ReflectionUtil.invoke(formatterClass, formatter, "setLenient", lenientParams, lenientTypes);
195 } catch (NoSuchMethodException e) {
196 assert false : e;
197 } catch (IllegalAccessException e) {
198 assert false : e;
199 } catch (InvocationTargetException e) {
200 assert false : e;
201 }
202 }
203
204
211 public String format(Date date) {
212 try {
213 return (String) ReflectionUtil.invoke(formatterClass, formatter, "format", date);
214 } catch (NoSuchMethodException e) {
215 assert false : e;
216 } catch (IllegalAccessException e) {
217 assert false : e;
218 } catch (InvocationTargetException e) {
219 assert false : e;
220 }
221 return "";
222 }
223
224
231 public Date parse(String text) {
232 try {
233 return (Date) ReflectionUtil.invoke(formatterClass, formatter, "parse", text);
234 } catch (NoSuchMethodException e) {
235 assert false : e;
236 } catch (IllegalAccessException e) {
237 assert false : e;
238 } catch (InvocationTargetException e) {
239 assert false : e;
240 }
241 return new Date();
242 }
243 }
244