Author: adrianc Date: Sun Apr 11 08:08:28 2010 New Revision: 932851 URL: http://svn.apache.org/viewvc?rev=932851&view=rev Log: Improved date/time conversion reflection, added date/time converter localized tests.
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=932851&r1=932850&r2=932851&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 08:08:28 2010 @@ -18,6 +18,7 @@ *******************************************************************************/ package org.apache.commons.convert; +import java.sql.Time; import java.sql.Timestamp; import java.text.DateFormat; import java.text.ParseException; @@ -30,37 +31,34 @@ 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"; + public static final String CALENDAR_FORMAT = "EEE MMM dd HH:mm:ss.SSS z yyyy"; + public static final String JDBC_DATE_FORMAT = "yyyy-MM-dd"; + public static final String JDBC_TIME_FORMAT = "HH:mm:ss"; + public static final String JDBC_TIMESTAMP_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS"; /** * Returns an initialized DateFormat object. - * - * @param dateFormat - * optional format string + * * @param tz - * @param locale - * can be null if dateFormat is not null * @return DateFormat object */ - public static DateFormat toDateFormat(String dateFormat, TimeZone tz, Locale locale) { - DateFormat df = null; - if (Util.isEmpty(dateFormat)) { - df = DateFormat.getDateInstance(DateFormat.SHORT, locale); - } else { - df = new SimpleDateFormat(dateFormat); - } + protected static DateFormat toDateFormat(TimeZone tz) { + DateFormat df = new SimpleDateFormat(JDBC_DATE_FORMAT); df.setTimeZone(tz); return df; } /** * Returns an initialized DateFormat object. - * @param dateTimeFormat optional format string + * + * @param dateTimeFormat + * optional format string * @param tz - * @param locale can be null if dateTimeFormat is not null + * @param locale + * can be null if dateTimeFormat is not null * @return DateFormat object */ - public static DateFormat toDateTimeFormat(String dateTimeFormat, TimeZone tz, Locale locale) { + protected static DateFormat toDateTimeFormat(String dateTimeFormat, TimeZone tz, Locale locale) { DateFormat df = null; if (Util.isEmpty(dateTimeFormat)) { df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, locale); @@ -73,18 +71,12 @@ public class DateTimeConverters implemen /** * Returns an initialized DateFormat object. - * @param timeFormat optional format string + * * @param tz - * @param locale can be null if timeFormat is not null * @return DateFormat object */ - public static DateFormat toTimeFormat(String timeFormat, TimeZone tz, Locale locale) { - DateFormat df = null; - if (Util.isEmpty(timeFormat)) { - df = DateFormat.getTimeInstance(DateFormat.MEDIUM, locale); - } else { - df = new SimpleDateFormat(timeFormat); - } + protected static DateFormat toTimeFormat(TimeZone tz) { + DateFormat df = new SimpleDateFormat(JDBC_TIME_FORMAT); df.setTimeZone(tz); return df; } @@ -107,8 +99,6 @@ public class DateTimeConverters implemen 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> { @@ -134,7 +124,7 @@ public class DateTimeConverters implemen } public String convert(Calendar obj, Locale locale, TimeZone timeZone, String formatString) throws ConversionException { - DateFormat df = toDateTimeFormat(formatString, timeZone, locale); + DateFormat df = toDateTimeFormat(formatString == null ? CALENDAR_FORMAT : formatString, timeZone, locale); df.setCalendar(obj); return df.format(obj.getTime()); } @@ -167,7 +157,7 @@ public class DateTimeConverters implemen } public String convert(Date obj, Locale locale, TimeZone timeZone, String formatString) throws ConversionException { - DateFormat df = toDateTimeFormat(formatString, timeZone, locale); + DateFormat df = toDateTimeFormat(formatString == null ? CALENDAR_FORMAT : formatString, timeZone, locale); return df.format(obj); } } @@ -193,7 +183,7 @@ public class DateTimeConverters implemen } public Long convert(S obj) throws ConversionException { - return obj.getTime(); + return obj.getTime(); } } @@ -207,7 +197,7 @@ public class DateTimeConverters implemen } } - public static class LongToCalendar extends AbstractLocalizedConverter<Long, Calendar> { + public static class LongToCalendar extends GenericLocalizedConverter<Long, Calendar> { public LongToCalendar() { super(Long.class, Calendar.class); } @@ -218,15 +208,11 @@ public class DateTimeConverters implemen return cal; } - public Calendar convert(Long obj, Locale locale, TimeZone timeZone) throws ConversionException { + public Calendar convert(Long obj, Locale locale, TimeZone timeZone, String formatString) throws ConversionException { Calendar cal = Calendar.getInstance(timeZone, locale); cal.setTimeInMillis(obj); return cal; } - - public Calendar convert(Long obj, Locale locale, TimeZone timeZone, String formatString) throws ConversionException { - return convert(obj, locale, timeZone); - } } public static class LongToDate extends AbstractConverter<Long, Date> { @@ -235,7 +221,7 @@ public class DateTimeConverters implemen } public Date convert(Long obj) throws ConversionException { - return new Date(obj.longValue()); + return new Date(obj.longValue()); } } @@ -245,7 +231,7 @@ public class DateTimeConverters implemen } public java.sql.Date convert(Long obj) throws ConversionException { - return new java.sql.Date(obj.longValue()); + return new java.sql.Date(obj.longValue()); } } @@ -255,7 +241,7 @@ public class DateTimeConverters implemen } public java.sql.Time convert(Long obj) throws ConversionException { - return new java.sql.Time(obj.longValue()); + return new java.sql.Time(obj.longValue()); } } @@ -265,7 +251,7 @@ public class DateTimeConverters implemen } public java.sql.Timestamp convert(Long obj) throws ConversionException { - return new java.sql.Timestamp(obj.longValue()); + return new java.sql.Timestamp(obj.longValue()); } } @@ -284,6 +270,22 @@ public class DateTimeConverters implemen } } + 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(timeZone); + 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); @@ -296,7 +298,23 @@ public class DateTimeConverters implemen public java.sql.Timestamp convert(java.sql.Date obj) throws ConversionException { return new java.sql.Timestamp(obj.getTime()); - } + } + } + + public static class SqlTimeToString extends GenericLocalizedConverter<java.sql.Time, String> { + public SqlTimeToString() { + super(java.sql.Time.class, String.class); + } + + @Override + public String convert(java.sql.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(timeZone); + return df.format(obj); + } } public static class StringToCalendar extends GenericLocalizedConverter<String, Calendar> { @@ -316,7 +334,7 @@ public class DateTimeConverters implemen } public Calendar convert(String obj, Locale locale, TimeZone timeZone, String formatString) throws ConversionException { - DateFormat df = toDateTimeFormat(formatString, timeZone, locale); + DateFormat df = toDateTimeFormat(formatString == null ? CALENDAR_FORMAT : formatString, timeZone, locale); try { Date date = df.parse(obj); Calendar cal = Calendar.getInstance(timeZone, locale); @@ -344,7 +362,7 @@ public class DateTimeConverters implemen } public Date convert(String obj, Locale locale, TimeZone timeZone, String formatString) throws ConversionException { - DateFormat df = toDateTimeFormat(formatString, timeZone, locale); + DateFormat df = toDateTimeFormat(formatString == null ? CALENDAR_FORMAT : formatString, timeZone, locale); try { return df.parse(obj); } catch (ParseException e) { @@ -353,7 +371,7 @@ public class DateTimeConverters implemen } } - public static class StringToSqlDate extends AbstractConverter<String, java.sql.Date> { + public static class StringToSqlDate extends GenericLocalizedConverter<String, java.sql.Date> { public StringToSqlDate() { super(String.class, java.sql.Date.class); } @@ -362,9 +380,19 @@ public class DateTimeConverters implemen public java.sql.Date convert(String obj) throws ConversionException { return java.sql.Date.valueOf(obj); } + + @Override + public java.sql.Date convert(String obj, Locale locale, TimeZone timeZone, String formatString) throws ConversionException { + DateFormat df = toDateFormat(timeZone); + try { + return new java.sql.Date(df.parse(obj).getTime()); + } catch (ParseException e) { + throw new ConversionException(e); + } + } } - public static class StringToSqlTime extends AbstractConverter<String, java.sql.Time> { + public static class StringToSqlTime extends GenericLocalizedConverter<String, java.sql.Time> { public StringToSqlTime() { super(String.class, java.sql.Time.class); } @@ -373,6 +401,16 @@ public class DateTimeConverters implemen public java.sql.Time convert(String obj) throws ConversionException { return java.sql.Time.valueOf(obj); } + + @Override + public Time convert(String obj, Locale locale, TimeZone timeZone, String formatString) throws ConversionException { + DateFormat df = toTimeFormat(timeZone); + 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> { @@ -386,7 +424,7 @@ public class DateTimeConverters implemen } public java.sql.Timestamp convert(String obj, Locale locale, TimeZone timeZone, String formatString) throws ConversionException { - DateFormat df = toDateTimeFormat(formatString, timeZone, locale); + DateFormat df = toDateTimeFormat(formatString == null ? JDBC_TIMESTAMP_FORMAT : formatString, timeZone, locale); try { return new java.sql.Timestamp(df.parse(obj).getTime()); } catch (ParseException e) { @@ -431,7 +469,7 @@ public class DateTimeConverters implemen } public String convert(java.sql.Timestamp obj, Locale locale, TimeZone timeZone, String formatString) throws ConversionException { - DateFormat df = toDateFormat(formatString, timeZone, locale); + DateFormat df = toDateTimeFormat(formatString == null ? JDBC_TIMESTAMP_FORMAT : formatString, timeZone, locale); return df.format(obj); } } 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=932851&r1=932850&r2=932851&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 08:08:28 2010 @@ -23,6 +23,7 @@ import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Collection; import java.util.List; +import java.util.Locale; import java.util.Set; import java.util.TimeZone; @@ -41,12 +42,23 @@ public class TestDateTimeConverters exte assertEquals(label + " registered", converter.getClass(), Converters.getConverter(source.getClass(), target.getClass()).getClass()); } assertEquals(label + " converted", target, converter.convert(source)); + Converter<T, S> reflectiveConverter = null; try { - Converter<T, S> reflectiveConverter = (Converter<T, S>) Converters.getConverter(target.getClass(), source.getClass()); + 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"); } + try { + LocalizedConverter<S,T> localizedConverter = (LocalizedConverter) converter; + T localizedResult = localizedConverter.convert(source, Locale.getDefault(), TimeZone.getDefault()); + T formattedResult = localizedConverter.convert(source, Locale.getDefault(), TimeZone.getDefault(), DateTimeConverters.CALENDAR_FORMAT); + if (reflectiveConverter != null) { + LocalizedConverter<T, S> localizedReflectiveConverter = (LocalizedConverter) reflectiveConverter; + assertEquals(label + " localized reflection converted", source, localizedReflectiveConverter.convert(localizedResult, Locale.getDefault(), TimeZone.getDefault())); + assertEquals(label + " formatted reflection converted", source, localizedReflectiveConverter.convert(formattedResult, Locale.getDefault(), TimeZone.getDefault(), DateTimeConverters.CALENDAR_FORMAT)); + } + } catch (ClassCastException e) {} } @SuppressWarnings("unchecked") @@ -77,8 +89,8 @@ public class TestDateTimeConverters exte // 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())); + 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.GenericDateToLong<java.util.Date>(java.util.Date.class), utilDate, currentTime); @@ -91,11 +103,13 @@ public class TestDateTimeConverters exte // Source class = java.sql.Date 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("SqlDateToString", new DateTimeConverters.SqlDateToString(), sqlDate, sqlDate.toString()); assertConversion("SqlDateToTimestamp", new DateTimeConverters.SqlDateToTimestamp(), sqlDate, new java.sql.Timestamp(sqlDate.getTime())); assertToCollection("SqlDateToCollection", sqlDate); // Source class = java.sql.Time assertConversion("SqlTimeToLong", new DateTimeConverters.GenericDateToLong<java.sql.Time>(java.sql.Time.class), sqlTime, sqlTime.getTime()); assertToCollection("SqlTimeToCollection", sqlTime); + assertConversion("SqlTimeToString", new DateTimeConverters.SqlTimeToString(), sqlTime, sqlTime.toString()); // Source class = java.sql.Timestamp assertConversion("TimestampToLong", new DateTimeConverters.GenericDateToLong<java.sql.Timestamp>(java.sql.Timestamp.class), timestamp, currentTime); assertConversion("TimestampToString", new DateTimeConverters.TimestampToString(), timestamp, timestamp.toString());