1 package org.seasar.cubby.validator.validators; 2 3 import java.text.DateFormat; 4 import java.text.ParsePosition; 5 import java.text.SimpleDateFormat; 6 import java.util.Date; 7 8 import org.seasar.cubby.action.FormatPattern; 9 import org.seasar.cubby.validator.BaseValidator; 10 import org.seasar.cubby.validator.ValidationContext; 11 import org.seasar.framework.exception.SRuntimeException; 12 import org.seasar.framework.util.StringUtil; 13 14 public class DateFormatValidator extends BaseValidator { 15 16 private final String pattern; 17 18 public DateFormatValidator() { 19 this(null); 20 } 21 22 public DateFormatValidator(final String pattern) { 23 this(pattern, "valid.dateFormat"); 24 } 25 26 public DateFormatValidator(final String pattern, final String messageKey) { 27 this.pattern = pattern; 28 this.setMessageKey(messageKey); 29 } 30 31 public String validate(final ValidationContext ctx) { 32 final Object value = ctx.getValue(); 33 if (value == null) { 34 return null; 35 } 36 if (value instanceof String) { 37 final String stringValue = (String) value; 38 if (StringUtil.isEmpty((String) value)) { 39 return null; 40 } 41 try { 42 final DateFormat dateFormat = createDateFormat(ctx); 43 final ParsePosition parsePosition = new ParsePosition(0); 44 final Date date = dateFormat.parse(stringValue, parsePosition); 45 if (date != null && parsePosition.getIndex() == stringValue.length()) { 46 return null; 47 } 48 } catch (final Exception e) { 49 } 50 } 51 return getMessage(getPropertyMessage(ctx.getName())); 52 } 53 54 private DateFormat createDateFormat(final ValidationContext context) { 55 final SimpleDateFormat dateFormat = new SimpleDateFormat(); 56 final String pattern; 57 if (StringUtil.isEmpty(this.pattern)) { 58 FormatPattern formatPattern = context.getFormatPattern(); 59 if (formatPattern == null) { 60 throw new SRuntimeException("ECUB0301", new Object[] { this, 61 context.getValue() }); 62 } 63 pattern = formatPattern.getDatePattern(); 64 } else { 65 pattern = this.pattern; 66 } 67 dateFormat.applyPattern(pattern); 68 dateFormat.setLenient(false); 69 return dateFormat; 70 } 71 }