Author: adrianc
Date: Sun Apr 11 05:46:37 2010
New Revision: 932838
URL: http://svn.apache.org/viewvc?rev=932838&view=rev
Log:
Made the date/time converters reflective, eliminated a number of date/time
conversion classes.
Modified:
commons/sandbox/convert/trunk/src/main/java/org/apache/commons/convert/DateTimeConverters.java
commons/sandbox/convert/trunk/src/test/java/org/apache/commons/convert/TestDateTimeConverters.java
Modified:
commons/sandbox/convert/trunk/src/main/java/org/apache/commons/convert/DateTimeConverters.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/convert/trunk/src/main/java/org/apache/commons/convert/DateTimeConverters.java?rev=932838&r1=932837&r2=932838&view=diff
==============================================================================
---
commons/sandbox/convert/trunk/src/main/java/org/apache/commons/convert/DateTimeConverters.java
(original)
+++
commons/sandbox/convert/trunk/src/main/java/org/apache/commons/convert/DateTimeConverters.java
Sun Apr 11 05:46:37 2010
@@ -18,7 +18,6 @@
*******************************************************************************/
package org.apache.commons.convert;
-import java.sql.Time;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
@@ -31,6 +30,8 @@ import java.util.TimeZone;
/** Date/time Converter classes. */
public class DateTimeConverters implements ConverterLoader {
+ public static final String CALENDAR_FORMAT = "EEE MMM dd HH:mm:ss.SSS zzz
yyyy";
+
/**
* Returns an initialized DateFormat object.
*
@@ -90,7 +91,24 @@ public class DateTimeConverters implemen
public void loadConverters() {
Converters.loadContainedConverters(DateTimeConverters.class);
- Converters.registerConverter(new
GenericToStringConverter<Calendar>(Calendar.class));
+ Converters.registerConverter(new
GenericDateToLong<java.util.Date>(java.util.Date.class));
+ Converters.registerConverter(new
GenericDateToLong<java.sql.Date>(java.sql.Date.class));
+ Converters.registerConverter(new
GenericDateToLong<java.sql.Time>(java.sql.Time.class));
+ Converters.registerConverter(new
GenericDateToLong<java.sql.Timestamp>(java.sql.Timestamp.class));
+ Converters.registerConverter(new
GenericSingletonToList<java.util.Calendar>(java.util.Calendar.class));
+ Converters.registerConverter(new
GenericSingletonToList<java.util.Date>(java.util.Date.class));
+ Converters.registerConverter(new
GenericSingletonToList<java.util.TimeZone>(java.util.TimeZone.class));
+ Converters.registerConverter(new
GenericSingletonToList<java.sql.Date>(java.sql.Date.class));
+ Converters.registerConverter(new
GenericSingletonToList<java.sql.Time>(java.sql.Time.class));
+ Converters.registerConverter(new
GenericSingletonToList<java.sql.Timestamp>(java.sql.Timestamp.class));
+ Converters.registerConverter(new
GenericSingletonToSet<java.util.Calendar>(java.util.Calendar.class));
+ Converters.registerConverter(new
GenericSingletonToSet<java.util.Date>(java.util.Date.class));
+ Converters.registerConverter(new
GenericSingletonToSet<java.util.TimeZone>(java.util.TimeZone.class));
+ Converters.registerConverter(new
GenericSingletonToSet<java.sql.Date>(java.sql.Date.class));
+ Converters.registerConverter(new
GenericSingletonToSet<java.sql.Time>(java.sql.Time.class));
+ Converters.registerConverter(new
GenericSingletonToSet<java.sql.Timestamp>(java.sql.Timestamp.class));
+ Converters.registerConverter(new
GenericToStringConverter<java.sql.Date>(java.sql.Date.class));
+ Converters.registerConverter(new
GenericToStringConverter<java.sql.Time>(java.sql.Time.class));
}
public static class CalendarToLong extends AbstractConverter<Calendar,
Long> {
@@ -103,13 +121,22 @@ public class DateTimeConverters implemen
}
}
- public static class DateToLong extends AbstractConverter<Date, Long> {
- public DateToLong() {
- super(Date.class, Long.class);
+ public static class CalendarToString extends
GenericLocalizedConverter<Calendar, String> {
+ public CalendarToString() {
+ super(Calendar.class, String.class);
}
- public Long convert(Date obj) throws ConversionException {
- return obj.getTime();
+ @Override
+ public String convert(Calendar obj) throws ConversionException {
+ DateFormat df = new SimpleDateFormat(CALENDAR_FORMAT);
+ df.setCalendar(obj);
+ return df.format(obj.getTime());
+ }
+
+ public String convert(Calendar obj, Locale locale, TimeZone timeZone,
String formatString) throws ConversionException {
+ DateFormat df = toDateTimeFormat(formatString, timeZone, locale);
+ df.setCalendar(obj);
+ return df.format(obj.getTime());
}
}
@@ -135,7 +162,8 @@ public class DateTimeConverters implemen
@Override
public String convert(Date obj) throws ConversionException {
- return obj.toString();
+ DateFormat df = new SimpleDateFormat(CALENDAR_FORMAT);
+ return df.format(obj);
}
public String convert(Date obj, Locale locale, TimeZone timeZone,
String formatString) throws ConversionException {
@@ -159,15 +187,21 @@ public class DateTimeConverters implemen
}
}
+ public static class GenericDateToLong<S extends Date> extends
AbstractConverter<S, Long> {
+ public GenericDateToLong(Class<S> source) {
+ super(source, Long.class);
+ }
+
+ public Long convert(S obj) throws ConversionException {
+ return obj.getTime();
+ }
+ }
+
public static abstract class GenericLocalizedConverter<S, T> extends
AbstractLocalizedConverter<S, T> {
protected GenericLocalizedConverter(Class<S> sourceClass, Class<T>
targetClass) {
super(sourceClass, targetClass);
}
- public T convert(S obj) throws ConversionException {
- return convert(obj, Locale.getDefault(), TimeZone.getDefault(),
null);
- }
-
public T convert(S obj, Locale locale, TimeZone timeZone) throws
ConversionException {
return convert(obj, locale, timeZone, null);
}
@@ -250,44 +284,6 @@ public class DateTimeConverters implemen
}
}
- public static class SqlDateToList extends
GenericSingletonToList<java.sql.Date> {
- public SqlDateToList() {
- super(java.sql.Date.class);
- }
- }
-
- public static class SqlDateToLong extends AbstractConverter<java.sql.Date,
Long> {
- public SqlDateToLong() {
- super(java.sql.Date.class, Long.class);
- }
-
- public Long convert(java.sql.Date obj) throws ConversionException {
- return obj.getTime();
- }
- }
-
- public static class SqlDateToSet extends
GenericSingletonToSet<java.sql.Date> {
- public SqlDateToSet() {
- super(java.sql.Date.class);
- }
- }
-
- public static class SqlDateToString extends
GenericLocalizedConverter<java.sql.Date, String> {
- public SqlDateToString() {
- super(java.sql.Date.class, String.class);
- }
-
- @Override
- public String convert(java.sql.Date obj) throws ConversionException {
- return obj.toString();
- }
-
- public String convert(java.sql.Date obj, Locale locale, TimeZone
timeZone, String formatString) throws ConversionException {
- DateFormat df = toDateFormat(formatString, timeZone, locale);
- return df.format(obj);
- }
- }
-
public static class SqlDateToTimestamp extends
AbstractConverter<java.sql.Date, java.sql.Timestamp> {
public SqlDateToTimestamp() {
super(java.sql.Date.class, java.sql.Timestamp.class);
@@ -303,55 +299,20 @@ public class DateTimeConverters implemen
}
}
- public static class SqlTimeToList extends
GenericSingletonToList<java.sql.Time> {
- public SqlTimeToList() {
- super(java.sql.Time.class);
- }
- }
-
- public static class SqlTimeToLong extends AbstractConverter<java.sql.Time,
Long> {
- public SqlTimeToLong() {
- super(java.sql.Time.class, Long.class);
- }
-
- public Long convert(java.sql.Time obj) throws ConversionException {
- return obj.getTime();
- }
- }
-
- public static class SqlTimeToSet extends
GenericSingletonToSet<java.sql.Time> {
- public SqlTimeToSet() {
- super(java.sql.Time.class);
- }
- }
-
- public static class SqlTimeToString extends
GenericLocalizedConverter<java.sql.Time, String> {
- public SqlTimeToString() {
- super(java.sql.Time.class, String.class);
- }
-
- @Override
- public String convert(Time obj) throws ConversionException {
- return obj.toString();
- }
-
- public String convert(java.sql.Time obj, Locale locale, TimeZone
timeZone, String formatString) throws ConversionException {
- DateFormat df = toTimeFormat(formatString, timeZone, locale);
- return df.format(obj);
- }
- }
-
- public static class StringToCalendar extends
AbstractLocalizedConverter<String, Calendar> {
+ public static class StringToCalendar extends
GenericLocalizedConverter<String, Calendar> {
public StringToCalendar() {
super(String.class, Calendar.class);
}
public Calendar convert(String obj) throws ConversionException {
- return convert(obj, Locale.getDefault(), TimeZone.getDefault(),
null);
- }
-
- public Calendar convert(String obj, Locale locale, TimeZone timeZone)
throws ConversionException {
- return convert(obj, Locale.getDefault(), TimeZone.getDefault(),
null);
+ try {
+ DateFormat df = new SimpleDateFormat(CALENDAR_FORMAT);
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(df.parse(obj));
+ return cal;
+ } catch (ParseException e) {
+ throw new ConversionException(e);
+ }
}
public Calendar convert(String obj, Locale locale, TimeZone timeZone,
String formatString) throws ConversionException {
@@ -375,7 +336,7 @@ public class DateTimeConverters implemen
@Override
public Date convert(String obj) throws ConversionException {
try {
- DateFormat df = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz
yyyy");
+ DateFormat df = new SimpleDateFormat(CALENDAR_FORMAT);
return df.parse(obj);
} catch (ParseException e) {
throw new ConversionException(e);
@@ -392,7 +353,7 @@ public class DateTimeConverters implemen
}
}
- public static class StringToSqlDate extends
GenericLocalizedConverter<String, java.sql.Date> {
+ public static class StringToSqlDate extends AbstractConverter<String,
java.sql.Date> {
public StringToSqlDate() {
super(String.class, java.sql.Date.class);
}
@@ -401,18 +362,9 @@ public class DateTimeConverters implemen
public java.sql.Date convert(String obj) throws ConversionException {
return java.sql.Date.valueOf(obj);
}
-
- public java.sql.Date convert(String obj, Locale locale, TimeZone
timeZone, String formatString) throws ConversionException {
- DateFormat df = toDateFormat(formatString, timeZone, locale);
- try {
- return new java.sql.Date(df.parse(obj).getTime());
- } catch (ParseException e) {
- throw new ConversionException(e);
- }
- }
}
- public static class StringToSqlTime extends
GenericLocalizedConverter<String, java.sql.Time> {
+ public static class StringToSqlTime extends AbstractConverter<String,
java.sql.Time> {
public StringToSqlTime() {
super(String.class, java.sql.Time.class);
}
@@ -421,15 +373,6 @@ public class DateTimeConverters implemen
public java.sql.Time convert(String obj) throws ConversionException {
return java.sql.Time.valueOf(obj);
}
-
- public java.sql.Time convert(String obj, Locale locale, TimeZone
timeZone, String formatString) throws ConversionException {
- DateFormat df = toTimeFormat(formatString, timeZone, locale);
- try {
- return new java.sql.Time(df.parse(obj).getTime());
- } catch (ParseException e) {
- throw new ConversionException(e);
- }
- }
}
public static class StringToTimestamp extends
GenericLocalizedConverter<String, java.sql.Timestamp> {
@@ -477,43 +420,6 @@ public class DateTimeConverters implemen
}
}
- public static class TimestampToList extends
GenericSingletonToList<Timestamp> {
- public TimestampToList() {
- super(Timestamp.class);
- }
- }
-
- public static class TimestampToLong extends
AbstractConverter<java.sql.Timestamp, Long> {
- public TimestampToLong() {
- super(java.sql.Timestamp.class, Long.class);
- }
-
- public Long convert(java.sql.Timestamp obj) throws ConversionException
{
- return obj.getTime();
- }
- }
-
- public static class TimestampToSet extends
GenericSingletonToSet<Timestamp> {
- public TimestampToSet() {
- super(Timestamp.class);
- }
- }
-
- public static class TimestampToSqlDate extends
AbstractConverter<Timestamp, java.sql.Date> {
- public TimestampToSqlDate() {
- super(Timestamp.class, java.sql.Date.class);
- }
-
- @Override
- public boolean canConvert(Class<?> sourceClass, Class<?> targetClass) {
- return java.sql.Timestamp.class.equals(sourceClass) &&
java.sql.Date.class.equals(targetClass);
- }
-
- public java.sql.Date convert(Timestamp obj) throws ConversionException
{
- return new java.sql.Date(obj.getTime());
- }
- }
-
public static class TimestampToString extends
GenericLocalizedConverter<java.sql.Timestamp, String> {
public TimestampToString() {
super(java.sql.Timestamp.class, String.class);
Modified:
commons/sandbox/convert/trunk/src/test/java/org/apache/commons/convert/TestDateTimeConverters.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/convert/trunk/src/test/java/org/apache/commons/convert/TestDateTimeConverters.java?rev=932838&r1=932837&r2=932838&view=diff
==============================================================================
---
commons/sandbox/convert/trunk/src/test/java/org/apache/commons/convert/TestDateTimeConverters.java
(original)
+++
commons/sandbox/convert/trunk/src/test/java/org/apache/commons/convert/TestDateTimeConverters.java
Sun Apr 11 05:46:37 2010
@@ -18,62 +18,91 @@
*******************************************************************************/
package org.apache.commons.convert;
-import org.apache.commons.convert.Converter;
-import org.apache.commons.convert.DateTimeConverters;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import java.util.TimeZone;
import junit.framework.TestCase;
public class TestDateTimeConverters extends TestCase {
- public TestDateTimeConverters(String name) {
- super(name);
+ public static <S, T> void assertConversion(String label, Converter<S, T>
converter, S source, T target) throws Exception {
+ assertConversion(label, converter, source, target, true);
}
- public static <S, T> void assertConversion(String label, Converter<S, T>
converter, S source, T target) throws Exception {
+ @SuppressWarnings("unchecked")
+ public static <S, T> void assertConversion(String label, Converter<S, T>
converter, S source, T target, boolean testRegistration) throws Exception {
assertTrue(label + " can convert",
converter.canConvert(source.getClass(), target.getClass()));
+ if (testRegistration) {
+ assertEquals(label + " registered", converter.getClass(),
Converters.getConverter(source.getClass(), target.getClass()).getClass());
+ }
assertEquals(label + " converted", target, converter.convert(source));
+ try {
+ Converter<T, S> reflectiveConverter = (Converter<T, S>)
Converters.getConverter(target.getClass(), source.getClass());
+ assertEquals(label + " reflection converted", source,
reflectiveConverter.convert(target));
+ } catch (ClassNotFoundException e) {
+ System.out.println(converter.getClass() + " not reflective");
+ }
}
- public static <S, T> void assertStringConversion(String label,
Converter<S, T> converter, S source, java.util.Date target) throws Exception {
- assertTrue(label + " can convert",
converter.canConvert(source.getClass(), target.getClass()));
- T result = converter.convert(source);
- assertEquals(label + " converted", source, result.toString());
+ @SuppressWarnings("unchecked")
+ public static <S> void assertToCollection(String label, S source) throws
Exception {
+ Converter<S, ? extends Collection> toList = (Converter<S, ? extends
Collection>) Converters.getConverter(source.getClass(), List.class);
+ Collection<S> listResult = toList.convert(source);
+ assertEquals(label + " converted to List", source,
listResult.toArray()[0]);
+ Converter<S, ? extends Collection> toSet = (Converter<S, ? extends
Collection>) Converters.getConverter(source.getClass(), Set.class);
+ Collection<S> setResult = toSet.convert(source);
+ assertEquals(label + " converted to Set", source,
setResult.toArray()[0]);
+ }
+
+ public TestDateTimeConverters(String name) {
+ super(name);
}
+ @SuppressWarnings("deprecation")
public void testDateTimeConverters() throws Exception {
+ ConverterLoader loader = new DateTimeConverters();
+ loader.loadConverters();
long currentTime = System.currentTimeMillis();
+ java.util.Calendar cal = java.util.Calendar.getInstance();
+ cal.setTimeInMillis(currentTime);
java.util.Date utilDate = new java.util.Date(currentTime);
- java.sql.Date sqlDate = new java.sql.Date(currentTime);
- java.sql.Time sqlTime = new java.sql.Time(currentTime);
+ java.sql.Date sqlDate = new java.sql.Date(cal.get(Calendar.YEAR),
cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH));
+ java.sql.Time sqlTime = new java.sql.Time(cal.get(Calendar.HOUR),
cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND));
java.sql.Timestamp timestamp = new java.sql.Timestamp(currentTime);
+ // Source class = java.util.Calendar
+ DateFormat df = new
SimpleDateFormat(DateTimeConverters.CALENDAR_FORMAT);
+ df.setCalendar(cal);
+ assertConversion("CalendarToLong", new
DateTimeConverters.CalendarToLong(), cal , currentTime);
+ assertConversion("CalendarToString", new
DateTimeConverters.CalendarToString(), cal , df.format(cal.getTime()));
+ assertToCollection("CalendarToCollection", cal);
// Source class = java.util.Date
- assertConversion("DateToLong", new DateTimeConverters.DateToLong(),
utilDate, currentTime);
- assertConversion("DateToSqlDate", new
DateTimeConverters.DateToSqlDate(), utilDate, new java.sql.Date(currentTime));
- assertConversion("DateToString", new
DateTimeConverters.DateToString(), utilDate, utilDate.toString());
- assertConversion("DateToTimestamp", new
DateTimeConverters.DateToTimestamp(), utilDate, new
java.sql.Timestamp(currentTime));
+ assertConversion("DateToLong", new
DateTimeConverters.GenericDateToLong<java.util.Date>(java.util.Date.class),
utilDate, currentTime);
+ assertConversion("DateToSqlDate", new
DateTimeConverters.DateToSqlDate(), new java.util.Date(sqlDate.getTime()),
sqlDate);
+ assertConversion("DateToSqlDate", new
DateTimeConverters.DateToSqlDate(), new java.sql.Timestamp(sqlDate.getTime()),
sqlDate);
+ assertConversion("DateToString", new
DateTimeConverters.DateToString(), utilDate, df.format(cal.getTime()));
+ assertConversion("DateToTimestamp", new
DateTimeConverters.DateToTimestamp(), utilDate, timestamp);
+ assertConversion("DateToTimestamp", new
DateTimeConverters.DateToTimestamp(), timestamp, timestamp, false);
+ assertToCollection("DateToCollection", utilDate);
// Source class = java.sql.Date
- assertConversion("SqlDateToDate", new
DateTimeConverters.SqlDateToDate(), sqlDate, utilDate);
- assertConversion("SqlDateToLong", new
DateTimeConverters.SqlDateToLong(), sqlDate, currentTime);
- assertConversion("SqlDateToString", new
DateTimeConverters.SqlDateToString(), sqlDate, sqlDate.toString());
- assertConversion("SqlDateToTimestamp", new
DateTimeConverters.SqlDateToTimestamp(), sqlDate, timestamp);
+ assertConversion("SqlDateToDate", new
DateTimeConverters.SqlDateToDate(), sqlDate, new
java.util.Date(sqlDate.getTime()));
+ assertConversion("SqlDateToLong", new
DateTimeConverters.GenericDateToLong<java.sql.Date>(java.sql.Date.class),
sqlDate, sqlDate.getTime());
+ assertConversion("SqlDateToTimestamp", new
DateTimeConverters.SqlDateToTimestamp(), sqlDate, new
java.sql.Timestamp(sqlDate.getTime()));
+ assertToCollection("SqlDateToCollection", sqlDate);
// Source class = java.sql.Time
- // assertConversion("SqlTimeToDate", new
DateTimeConverters.SqlTimeToSqlDate(), sqlTime, sqlDate);
- assertConversion("SqlTimeToLong", new
DateTimeConverters.SqlTimeToLong(), sqlTime, currentTime);
- assertConversion("SqlTimeToString", new
DateTimeConverters.SqlTimeToString(), sqlTime, sqlTime.toString());
+ assertConversion("SqlTimeToLong", new
DateTimeConverters.GenericDateToLong<java.sql.Time>(java.sql.Time.class),
sqlTime, sqlTime.getTime());
+ assertToCollection("SqlTimeToCollection", sqlTime);
// Source class = java.sql.Timestamp
- assertConversion("TimestampToDate", new
DateTimeConverters.TimestampToDate(), timestamp, utilDate);
- assertConversion("TimestampToLong", new
DateTimeConverters.TimestampToLong(), timestamp, currentTime);
- assertConversion("TimestampToSqlDate", new
DateTimeConverters.TimestampToSqlDate(), timestamp, sqlDate);
+ assertConversion("TimestampToLong", new
DateTimeConverters.GenericDateToLong<java.sql.Timestamp>(java.sql.Timestamp.class),
timestamp, currentTime);
assertConversion("TimestampToString", new
DateTimeConverters.TimestampToString(), timestamp, timestamp.toString());
- // Source class = java.lang.String
- assertStringConversion("StringToDate", new
DateTimeConverters.StringToDate(), utilDate.toString(), utilDate);
- assertStringConversion("StringToSqlDate", new
DateTimeConverters.StringToSqlDate(), sqlDate.toString(), sqlDate);
- assertStringConversion("StringToSqlTime", new
DateTimeConverters.StringToSqlTime(), sqlTime.toString(), sqlTime);
- assertStringConversion("StringToTimestamp", new
DateTimeConverters.StringToTimestamp(), timestamp.toString(), timestamp);
- // Source class = java.lang.Long
- assertConversion("LongToDate", new DateTimeConverters.LongToDate(),
currentTime, utilDate);
- assertConversion("LongToSqlDate", new
DateTimeConverters.LongToSqlDate(), currentTime, sqlDate);
- assertConversion("LongToSqlTime", new
DateTimeConverters.LongToSqlTime(), currentTime, sqlTime);
- assertConversion("LongToTimestamp", new
DateTimeConverters.LongToTimestamp(), currentTime, timestamp);
+ assertToCollection("TimestampToCollection", timestamp);
+ // TimeZone tests
+ TimeZone tz = TimeZone.getDefault();
+ assertConversion("TimeZoneToString", new
DateTimeConverters.TimeZoneToString(), tz, tz.getID());
+ assertToCollection("TimeZoneToCollection", tz);
}
}