package hirondelle.web4j.config;
import java.util.*;
import java.text.*;
import java.util.regex.*;
import hirondelle.web4j.request.DateConverter;
public final class DateConverterImpl implements DateConverter {
public String formatEyeFriendly(Date aDate, Locale aLocale, TimeZone aTimeZone) {
SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm"); format.setTimeZone(aTimeZone);
String result = format.format(aDate);
String UNWANTED = "00:00";
if ( result.endsWith(UNWANTED) ) {
int end = result.length() - UNWANTED.length() - 1;
result = result.substring(0,end);
}
return result;
}
public Date parseHandFriendly(String aInputValue, Locale aLocale, TimeZone aTimeZone) {
return parse(aInputValue, HAND_FRIENDLY_REGEX, aTimeZone);
}
public Date parseEyeFriendly(String aInputValue, Locale aLocale, TimeZone aTimeZone) {
return parse(aInputValue, EYE_FRIENDLY_REGEX, aTimeZone);
}
private static final String MONTH =
"(01|02|03|04|05|06|07|08|09|10|11|12)"
;
private static final String DAY_OF_MONTH =
"(01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)"
;
private static final String HOURS =
"(00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23)"
;
private static final String MINUTES =
"((0|1|2|3|4|5)\\d)"
;
private static final Pattern HAND_FRIENDLY_REGEX =
Pattern.compile(MONTH + DAY_OF_MONTH + "(\\d\\d\\d\\d)" + "(?: " + HOURS + ":" + MINUTES + ")?")
;
private static final Pattern EYE_FRIENDLY_REGEX =
Pattern.compile(MONTH + "/" + DAY_OF_MONTH + "/" + "(\\d\\d\\d\\d)" + "(?: " + HOURS + ":" + MINUTES + ")?")
;
private Date parse(String aInputValue, Pattern aRegex, TimeZone aTimeZone){
Date result = null;
Matcher matcher = aRegex.matcher(aInputValue);
if( matcher.matches() ) {
Integer month = new Integer(matcher.group(1));
Integer day = new Integer(matcher.group(2));
Integer year = new Integer( matcher.group(3) );
String hour = matcher.group(4);
String minute = matcher.group(5);
Calendar cal = null;
if( hour == null ){
cal = new GregorianCalendar(year.intValue(), month.intValue() - 1, day.intValue(), 0,0,0);
}
else {
Integer hourVal = new Integer(hour);
Integer minuteVal = new Integer(minute);
cal = new GregorianCalendar(year.intValue(), month.intValue() - 1, day.intValue(), hourVal.intValue(), minuteVal.intValue(), 0);
}
cal.setTimeZone(aTimeZone);
result = cal.getTime();
}
return result;
}
}