Hello.

We've recently have had a discussion on the Wicket Sweden mailing list / user group ([EMAIL PROTECTED]) regarding how to format the dates of the validation messages in DateValidator. It is, as you probably know, possible to customize (localize) the validation message i.e.: DateValidator.range=The date is not within range! The date must be after ${minimum} and before ${maximum}.

Our problem is that we can't find a way to affect the format of the variables ${minimum} and ${maximum} (they will always be formated as a new Date().toString()). These variables are added to the variablesMap by static inner classes, i.e.:
DateValidator$RangeValidator.variablesMap(IValidatable validatable).

I proposed a solution where you extend the constructors of DateValidator to include a SimpleDateFormat format, see below. Alternatively, try to look up a pattern from a property (this would result in the possibility to format the min and max dates diffrently) i.e.:
DateValidator.minimum.format=yyyy-MM-dd

Thoughts? Is there a more simple/elegant solution?

Regards,
Per Engström
Curalia AB

import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.validation.IValidatable;
import org.apache.wicket.validation.validator.AbstractValidator;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

public abstract class DateValidator extends AbstractValidator {
        private static final long serialVersionUID = 1L;
        
public static DateValidator range(Date minimum, Date maximum, String format) {
                return new RangeValidator(minimum, maximum, format);
        }

        public static DateValidator minimum(Date minimum, String format) {
                return new MinimumValidator(minimum, format);
        }

        public static DateValidator maximum(Date maximum, String format) {
                return new MaximumValidator(maximum, format);
        }


        private static class RangeValidator extends DateValidator {
                private static final long serialVersionUID = 1L;
                private final Date minimum;
                private final Date maximum;
                private String format;

                private RangeValidator(Date minimum, Date maximum, String 
format) {
                        this.format = format;
                        this.minimum = minimum;
                        this.maximum = maximum;

                }

                protected Map variablesMap(IValidatable validatable) {
                        final Map map = super.variablesMap(validatable);
                        map.put("minimum", new 
SimpleDateFormat(format).format(minimum));
                        map.put("maximum", new 
SimpleDateFormat(format).format(maximum));
                        return map;
                }
                
                protected String resourceKey() {
                        return "DateValidator.range";
                }

                protected void onValidate(IValidatable validatable) {
                        Date value = (Date)validatable.getValue();
                        if (value.before(minimum) || value.after(maximum)) {
                                error(validatable);
                        }
                }
        }

        private static class MinimumValidator extends DateValidator {
                private static final long serialVersionUID = 1L;
                private final Date minimum;
                private String format;

                private MinimumValidator(Date minimum, String format) {
                        this.format = format;
                        this.minimum = minimum;
                }

                protected Map variablesMap(IValidatable validatable) {
                        final Map map = super.variablesMap(validatable);
                        map.put("minimum", new 
SimpleDateFormat(format).format(minimum));
                        return map;
                }

                protected String resourceKey() {
                        return "DateValidator.minimum";
                }

                protected void onValidate(IValidatable validatable) {
                        Date value = (Date)validatable.getValue();
                        if (value.before(minimum)) {
                                error(validatable);
                        }
                }
        }

        private static class MaximumValidator extends DateValidator {
                private static final long serialVersionUID = 1L;
                private final Date maximum;
                private String format;

                private MaximumValidator(Date maximum, String format) {
                        this.format = format;
                        this.maximum = maximum;
                }

                protected Map variablesMap(IValidatable validatable) {
                        final Map map = super.variablesMap(validatable);
                        map.put("maximum", new 
SimpleDateFormat(format).format(maximum));
                        return map;
                }

                protected String resourceKey() {
                        return "DateValidator.maximum";
                }

                protected void onValidate(IValidatable validatable) {
                        Date value = (Date)validatable.getValue();
                        if (value.after(maximum)) {
                                error(validatable);
                        }
                }
        }
}

Reply via email to