001    package org.springframework.richclient.samples.simple.ui;
002    
003    import java.text.ParseException;
004    import java.text.SimpleDateFormat;
005    import java.util.Date;
006    import java.util.regex.Matcher;
007    import java.util.regex.Pattern;
008    
009    import org.springframework.binding.format.Formatter;
010    import org.springframework.binding.format.InvalidFormatException;
011    import org.springframework.binding.format.support.AbstractFormatter;
012    import org.springframework.binding.format.support.DateFormatter;
013    import org.springframework.binding.format.support.SimpleFormatterFactory;
014    import org.springframework.util.StringUtils;
015    
016    /**
017     * Simple formatter factory that returns a custom date/time formatter.  By default, this 
018     * formatter is used to format all date fields in the application.
019     *
020     * @author Keith Donald
021     */
022    public class SimpleAppFormatterFactory extends SimpleFormatterFactory {
023    
024            public Formatter getDateTimeFormatter() {
025                    return new AppDateFormatter();
026            }
027    
028            /**
029             * Formatter for date fields in the application.
030             * @author Larry and Geoffrey (by Keith)
031             */
032            class AppDateFormatter extends AbstractFormatter {
033    
034                    /** Default Date format. */
035                    private final DateFormatter format = new DateFormatter(new SimpleDateFormat("MM-dd-yyyy"));
036    
037                    /** Pattern to verify date contains full 4 digit year. */
038                    private final Pattern MDY_PATTERN = Pattern.compile("[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}");
039    
040                    protected String doFormatValue(Object value) {
041                            return (value == null) ? "" : format.formatValue(value);
042                    }
043    
044                    protected Object doParseValue(String formattedString, Class targetClass) throws InvalidFormatException,
045                                    ParseException {
046                            String src = (String) formattedString;
047                            // If the user entered slashes, convert them to dashes
048                            if (src.indexOf('/') >= 0) {
049                                    src = src.replace('/', '-');
050                            }
051                            Object value = null;
052                            if (StringUtils.hasText(src)) {
053    
054                                    Matcher matcher = MDY_PATTERN.matcher(src);
055    
056                                    if (!matcher.matches()) {
057                                            throw new ParseException("Invalid date format: " + src, 0);
058                                    }
059    
060                                    value = format.parseValue(src, Date.class);
061                            }
062                            return value;
063                    }
064            }
065    }