package com.joe.jsf.converter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.TimeZone; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.faces.application.FacesMessage; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.convert.ConverterException; import javax.faces.convert.DateTimeConverter; import javax.faces.convert.FacesConverter; import org.apache.commons.lang.StringUtils; @FacesConverter( value="CustomDateConverter" ) public class CustomDateConverter extends DateTimeConverter{ private static final String DATE_PATTERN = "MM/dd/yyyy"; private static final String REGULAR_EXPRESSION = "\\d{1,2}/\\d{1,2}/\\d{2,4}"; public CustomDateConverter(){ super(); setTimeZone(TimeZone.getDefault()); setPattern(DATE_PATTERN); } /** * Override getAsObject to check for 2 digit year field */ public Object getAsObject(FacesContext context, UIComponent component, String value){ // if user specified letter T, return today's date if ("T".equalsIgnoreCase(value)){ return new Date(); } if (value != null && !value.equals("") && !validateDateTime(value)) { FacesMessage message = new FacesMessage(); message.setDetail("Invalid date entered. Please enter a date in the format MM/DD/CCYY."); message.setSummary("Invalid date entered. Please enter a date in the format MM/DD/CCYY."); message.setSeverity(FacesMessage.SEVERITY_ERROR); throw new ConverterException(message); } Date dateValue = (Date)super.getAsObject(context, component, value); if (dateValue != null){ String [] dateComps = StringUtils.split(value,"/"); String year = dateComps[2]; // if 2 digit year is specified if (year.length() == 2){ // convert to 4 digits try{ int yearValue = Integer.parseInt(year); // if 2-digit year value is less than 50, make it 21st century if (yearValue < 50){ dateComps[2] = "20".concat(year); } else{ // else make it 20th century dateComps[2] = "19".concat(year); } } catch (NumberFormatException nfe){ //return null; FacesMessage message = new FacesMessage(); message.setDetail("Invalid date entered. Please enter a date in the format MM/DD/CCYY."); message.setSummary("Invalid date entered. Please enter a date in the format MM/DD/CCYY."); message.setSeverity(FacesMessage.SEVERITY_ERROR); throw new ConverterException(message); } SimpleDateFormat df = new SimpleDateFormat(DATE_PATTERN); try { dateValue = df.parse(StringUtils.join(dateComps, '/')); } catch (ParseException e) { //e.printStackTrace(); FacesMessage message = new FacesMessage(); message.setDetail("Invalid date entered. Please enter a date in the format MM/DD/CCYY."); message.setSummary("Invalid date entered. Please enter a date in the format MM/DD/CCYY."); message.setSeverity(FacesMessage.SEVERITY_ERROR); throw new ConverterException(message); } } } return dateValue; } private boolean validateDateTime(String date) { boolean isValid = false; Pattern p = Pattern.compile(REGULAR_EXPRESSION); Matcher m = p.matcher(date); if(!m.matches()){ return isValid; } String [] dateArray = StringUtils.split(date,"/"); int day= Integer.valueOf(dateArray[1]).intValue(); int month = Integer.valueOf(dateArray[0]).intValue(); int year = Integer.valueOf(dateArray[2]).intValue(); if ((day > 0 && day <= 31) && (month > 0 && month <= 12)) { isValid = true; try { GregorianCalendar cal = new GregorianCalendar(); cal.setLenient(false); cal.set(year, (month - 1), day); cal.add(Calendar.SECOND, 1); } catch (IllegalArgumentException iae) { isValid = false; } } return isValid; } }