You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@wicket.apache.org by Per Engström <pe...@gmail.com> on 2008/08/13 15:19:24 UTC

Formatting of dates in validation messages

Hello.

We've recently have had a discussion on the Wicket Sweden mailing  
list / user group (wicketsweden@googlegroups.com) 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);
			}
		}
	}
}