You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by iv...@apache.org on 2011/11/17 02:02:41 UTC

svn commit: r1202963 [1/2] - in /wicket/trunk: testing/wicket-threadtest/src/main/java/org/apache/wicket/threadtest/apps/app1/ wicket-core/src/main/java/org/apache/wicket/ wicket-core/src/main/java/org/apache/wicket/validation/ wicket-core/src/main/jav...

Author: ivaynberg
Date: Thu Nov 17 01:02:40 2011
New Revision: 1202963

URL: http://svn.apache.org/viewvc?rev=1202963&view=rev
Log:
remove abstract validator
rewrote date/string/range validators to use the same baseclass since they were all doing basically the same thing
Issue: WICKET-4234

Added:
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/AbstractRangeValidator.java
Removed:
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/AbstractValidator.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/MaximumValidator.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/MinimumValidator.java
    wicket/trunk/wicket-core/src/test/java/org/apache/wicket/validation/validator/MaximumValidatorTest.java
    wicket/trunk/wicket-core/src/test/java/org/apache/wicket/validation/validator/MinimumValidatorTest.java
Modified:
    wicket/trunk/testing/wicket-threadtest/src/main/java/org/apache/wicket/threadtest/apps/app1/Home.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/Application.properties
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/ValidationError.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/CreditCardValidator.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/DateValidator.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/PatternValidator.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/RangeValidator.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/StringValidator.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/UrlValidator.java
    wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadError.java
    wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/validation/FormValidatorBehaviorTest.java
    wicket/trunk/wicket-core/src/test/java/org/apache/wicket/model/HomePage.java
    wicket/trunk/wicket-core/src/test/java/org/apache/wicket/resource/loader/ClassStringResourceLoaderTest.java
    wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/MockAjaxFormPage.java
    wicket/trunk/wicket-core/src/test/java/org/apache/wicket/validation/ValidationErrorTest.java
    wicket/trunk/wicket-core/src/test/java/org/apache/wicket/validation/ValidatorBehaviorTest.java
    wicket/trunk/wicket-core/src/test/java/org/apache/wicket/validation/validator/CreditCardValidatorTest.java
    wicket/trunk/wicket-core/src/test/java/org/apache/wicket/validation/validator/RangeValidatorTest.java
    wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/FormPage.java
    wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/library/EditBook.java
    wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage.java
    wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage1.java
    wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage2.java
    wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage3.java
    wicket/trunk/wicket-extensions/.settings/org.eclipse.jdt.core.prefs
    wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/validation/validator/RfcCompliantEmailAddressValidator.java

Modified: wicket/trunk/testing/wicket-threadtest/src/main/java/org/apache/wicket/threadtest/apps/app1/Home.java
URL: http://svn.apache.org/viewvc/wicket/trunk/testing/wicket-threadtest/src/main/java/org/apache/wicket/threadtest/apps/app1/Home.java?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/testing/wicket-threadtest/src/main/java/org/apache/wicket/threadtest/apps/app1/Home.java (original)
+++ wicket/trunk/testing/wicket-threadtest/src/main/java/org/apache/wicket/threadtest/apps/app1/Home.java Thu Nov 17 01:02:40 2011
@@ -56,7 +56,6 @@ import org.apache.wicket.threadtest.apps
 import org.apache.wicket.util.convert.ConversionException;
 import org.apache.wicket.util.convert.IConverter;
 import org.apache.wicket.util.convert.MaskConverter;
-import org.apache.wicket.validation.validator.MinimumValidator;
 import org.apache.wicket.validation.validator.RangeValidator;
 
 /**
@@ -124,7 +123,7 @@ public class Home extends WebPage
 			add(stringTextField);
 			TextField<Integer> integerTextField = new TextField<Integer>("integerProperty",
 				Integer.class);
-			add(integerTextField.add(new MinimumValidator<Integer>(0)));
+			add(integerTextField.add(new RangeValidator<Integer>(0, null)));
 			add(new TextField<Double>("doubleProperty", Double.class));
 			WebMarkupContainer dateLabel = new WebMarkupContainer("dateLabel");
 			add(dateLabel);

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/Application.properties
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/Application.properties?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/Application.properties (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/Application.properties Thu Nov 17 01:02:40 2011
@@ -16,9 +16,17 @@ Required=Field '${label}' is required.
 IConverter='${input}' is not a valid ${type}.
 
 RangeValidator=${input} is not between ${minimum} and ${maximum}.
+RangeValidator.minimum='${input}' is smaller than the minimum of ${minimum}.
+RangeValidator.maximum='${input}' is larger than the maximum of ${maximum}.
+
+#deprecated, use RangeValidator.minimum
 MinimumValidator='${input}' is smaller than the minimum of ${minimum}.
+#deprecated, use RangeValidator.maximum
 MaximumValidator='${input}' is larger than the maximum of ${maximum}.
+
+#raplaced with RangeValidator 
 NumberValidator.positive='${input}' must be positive.
+#replaced with RangeValidator
 NumberValidator.negative='${input}' must be negative.
 
 StringValidator.range='${input}' is not between ${minimum} and ${maximum} characters long.

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/ValidationError.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/ValidationError.java?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/ValidationError.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/ValidationError.java Thu Nov 17 01:02:40 2011
@@ -44,7 +44,7 @@ import org.apache.wicket.util.string.Str
  * @author Igor Vaynberg (ivaynberg)
  * @since 1.2.6
  */
-public class ValidationError implements IValidationError
+public final class ValidationError implements IValidationError
 {
 	private static final long serialVersionUID = 1L;
 
@@ -60,7 +60,7 @@ public class ValidationError implements 
 	private String message;
 
 	/**
-	 * Constructor.
+	 * Constructs an empty error
 	 */
 	public ValidationError()
 	{
@@ -68,6 +68,46 @@ public class ValidationError implements 
 	}
 
 	/**
+	 * Constructs a validation error with the validator's standard key. Equivalent to calling
+	 * {@link #addKey(IValidator)}
+	 * 
+	 * @param validator
+	 *            validator
+	 */
+	public ValidationError(IValidator<?> validator)
+	{
+		addKey(validator);
+	}
+
+	/**
+	 * Constructs a validation error with a variation of validator's standard key. Equivalent to
+	 * calling {@link #addKey(IValidator, String)}
+	 * 
+	 * @param validator
+	 *            validator
+	 * @param variation
+	 *            key variation
+	 * 
+	 * 
+	 */
+	public ValidationError(IValidator<?> validator, String variation)
+	{
+		addKey(validator, variation);
+	}
+
+	/**
+	 * Constructs a validation error with the specified message. Equivalent to calling
+	 * {@link #setMessage(String)}
+	 * 
+	 * @param message
+	 *            message
+	 */
+	public ValidationError(String message)
+	{
+		setMessage(message);
+	}
+
+	/**
 	 * Adds a key to the list of keys that will be tried against <code>IErrorMessageSource</code> to
 	 * locate the error message string.
 	 * 
@@ -154,7 +194,6 @@ public class ValidationError implements 
 	public ValidationError setVariable(String name, Object value)
 	{
 		Args.notEmpty(name, "name");
-		Args.notNull(value, "value");
 
 		getVariables().put(name, value);
 

Added: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/AbstractRangeValidator.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/AbstractRangeValidator.java?rev=1202963&view=auto
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/AbstractRangeValidator.java (added)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/AbstractRangeValidator.java Thu Nov 17 01:02:40 2011
@@ -0,0 +1,201 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.validation.validator;
+
+import java.io.Serializable;
+
+import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.validation.IValidatable;
+import org.apache.wicket.validation.IValidator;
+import org.apache.wicket.validation.ValidationError;
+
+/**
+ * Base class for validators that check if a given value falls within [min,max] range.
+ * 
+ * If either min or max are {@code null} they are not checked.
+ * 
+ * <p>
+ * Resource keys:
+ * <ul>
+ * <li>{@code <class.simpleName>.exact} if min==max</li>
+ * <li>{@code <class.simpleName>.range} if both min and max are not {@code null}</li>
+ * <li>{@code <class.simpleName>.minimum} if max is {@code null}</li>
+ * <li>{@code <class.simpleName>.maximum} if min is {@code null}</li>
+ * </ul>
+ * </p>
+ * 
+ * <p>
+ * Error Message Variables:
+ * <ul>
+ * <li>{@code name}: the id of {@code Component} that failed</li>
+ * <li>{@code label}: the label of the {@code Component} (either comes from
+ * {@code FormComponent.labelModel} or resource key {@code <form-id>.<form-component-id>}</li>
+ * <li>{@code input}: the input value</li>
+ * <li>{@code minimum}: the minimum allowed value</li>
+ * <li>{@code maximum}: the maximum allowed value</li>
+ * </ul>
+ * </p>
+ * 
+ * @param <R>
+ *            type of range value
+ * @param <V>
+ *            type of validatable
+ * 
+ * @author igor
+ */
+public abstract class AbstractRangeValidator<R extends Comparable<R> & Serializable, V extends Serializable>
+	extends Behavior implements IValidator<V>
+{
+	private static final long serialVersionUID = 1L;
+	private R minimum;
+	private R maximum;
+
+	/**
+	 * Constructor that sets the minimum and maximum values.
+	 * 
+	 * @param minimum
+	 *            the minimum value
+	 * @param maximum
+	 *            the maximum value
+	 */
+	public AbstractRangeValidator(R minimum, R maximum)
+	{
+		setRange(minimum, maximum);
+	}
+
+	/**
+	 * Constructor used for subclasses who want to set the range using
+	 * {@link #setRange(Comparable, Comparable)}
+	 */
+	protected AbstractRangeValidator()
+	{
+	}
+
+	/**
+	 * Sets validator range
+	 * 
+	 * @param minimum
+	 * @param maximum
+	 */
+	protected final void setRange(R minimum, R maximum)
+	{
+		if (minimum == null && maximum == null)
+		{
+			throw new IllegalArgumentException("Both minimum and maximum values cannot be null");
+		}
+		this.minimum = minimum;
+		this.maximum = maximum;
+	}
+
+	@Override
+	public void validate(IValidatable<V> validatable)
+	{
+		R value = getValue(validatable);
+		final R min = getMinimum();
+		final R max = getMaximum();
+		if ((min != null && value.compareTo(min) < 0) || (max != null && value.compareTo(max) > 0))
+		{
+			ValidationError error = new ValidationError(this, getMode().getVariation());
+			error.setVariable("minimum", min);
+			error.setVariable("maximum", max);
+			validatable.error(decorate(error, validatable));
+		}
+	}
+
+	/**
+	 * Gets the value that should be validated against the range
+	 * 
+	 * @param validatable
+	 * @return value to validate
+	 */
+	protected abstract R getValue(IValidatable<V> validatable);
+
+	/**
+	 * Gets the minimum value.
+	 * 
+	 * @return minimum value
+	 */
+	public R getMinimum()
+	{
+		return minimum;
+	}
+
+	/**
+	 * Gets the maximum value.
+	 * 
+	 * @return maximum value
+	 */
+	public R getMaximum()
+	{
+		return maximum;
+	}
+
+	/**
+	 * Allows subclasses to decorate reported errors
+	 * 
+	 * @param error
+	 * @param validatable
+	 * @return decorated error
+	 */
+	protected ValidationError decorate(ValidationError error, IValidatable<V> validatable)
+	{
+		return error;
+	}
+
+	/**
+	 * Gets validation mode which is determined by whether min, max, or both values are provided
+	 * 
+	 * @return validation mode
+	 */
+	public final Mode getMode()
+	{
+		final R min = getMinimum();
+		final R max = getMaximum();
+
+		if (min == null && max != null)
+		{
+			return Mode.MAXIMUM;
+		}
+		else if (max == null && min != null)
+		{
+			return Mode.MINIMUM;
+		}
+		else if (max.equals(min))
+		{
+			return Mode.EXACT;
+		}
+		else
+		{
+			return Mode.RANGE;
+		}
+	}
+
+	/**
+	 * Validator mode
+	 * 
+	 * @author igor
+	 */
+	public static enum Mode {
+		MINIMUM, MAXIMUM, RANGE, EXACT;
+
+		public String getVariation()
+		{
+			return name().toLowerCase();
+		}
+	}
+
+}
\ No newline at end of file

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/CreditCardValidator.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/CreditCardValidator.java?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/CreditCardValidator.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/CreditCardValidator.java Thu Nov 17 01:02:40 2011
@@ -17,6 +17,8 @@
 package org.apache.wicket.validation.validator;
 
 import org.apache.wicket.validation.IValidatable;
+import org.apache.wicket.validation.IValidator;
+import org.apache.wicket.validation.ValidationError;
 
 /**
  * Checks if a credit card number is valid. The number will be checked for "American Express",
@@ -33,7 +35,7 @@ import org.apache.wicket.validation.IVal
  * @author Joachim F. Rohde
  * @since 1.2.6
  */
-public class CreditCardValidator extends AbstractValidator<String>
+public class CreditCardValidator implements IValidator<String>
 {
 	private static final long serialVersionUID = 1L;
 
@@ -119,11 +121,8 @@ public class CreditCardValidator extends
 		this.cardId = cardId;
 	}
 
-	/**
-	 * {@inheritDoc}
-	 */
 	@Override
-	protected void onValidate(final IValidatable<String> validatable)
+	public void validate(final IValidatable<String> validatable)
 	{
 		final String value = validatable.getValue();
 
@@ -131,16 +130,28 @@ public class CreditCardValidator extends
 		{
 			if (!isLengthAndPrefixCorrect(value))
 			{
-				error(validatable);
+				validatable.error(decorate(new ValidationError(this), validatable));
 			}
 		}
 		catch (final NumberFormatException ex)
 		{
-			error(validatable);
+			validatable.error(decorate(new ValidationError(this), validatable));
 		}
 	}
 
 	/**
+	 * Allows subclasses to decorate reported errors
+	 * 
+	 * @param error
+	 * @param validatable
+	 * @return decorated error
+	 */
+	protected ValidationError decorate(ValidationError error, IValidatable<String> validatable)
+	{
+		return error;
+	}
+
+	/**
 	 * Checks if the credit card number can be determined as a valid number.
 	 * 
 	 * @param creditCardNumber

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/DateValidator.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/DateValidator.java?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/DateValidator.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/DateValidator.java Thu Nov 17 01:02:40 2011
@@ -18,298 +18,81 @@ package org.apache.wicket.validation.val
 
 import java.text.SimpleDateFormat;
 import java.util.Date;
-import java.util.Map;
 
-import org.apache.wicket.markup.html.form.FormComponent;
 import org.apache.wicket.validation.IValidatable;
-
+import org.apache.wicket.validation.ValidationError;
 
 /**
- * Validator for checking dates. This validator can be extended or can be used for one of its static
- * factory methods to get the default <code>DateValidator</code> as a range, maximum, or minimum
- * type.
+ * Validator for checking if a given date falls within [min,max] range.
+ * 
+ * If either min or max are {@code null} they are not checked.
+ * 
+ * <p>
+ * Resource keys:
+ * <ul>
+ * <li>{@code DateValidator.exact} if min==max</li>
+ * <li>{@code DateValidator.range} if both min and max are not {@code null}</li>
+ * <li>{@code DateValidator.minimum} if max is {@code null}</li>
+ * <li>{@code DateValidator.maximum} if min is {@code null}</li>
+ * </ul>
+ * </p>
+ * 
+ * <p>
+ * Error Message Variables:
+ * <ul>
+ * <li>{@code name}: the id of {@code Component} that failed</li>
+ * <li>{@code label}: the label of the {@code Component} (either comes from
+ * {@code FormComponent.labelModel} or resource key {@code <form-id>.<form-component-id>}</li>
+ * <li>{@code input}: the input value</li>
+ * <li>{@code inputdate}: the formatted input value</li>
+ * <li>{@code minimum}: the minimum allowed value</li>
+ * <li>{@code maximum}: the maximum allowed value</li>
+ * </ul>
+ * </p>
  * 
- * @author Jonathan Locke
- * @author Johan Compagner
- * @author Igor Vaynberg (ivaynberg)
- * @since 1.2.6
+ * @author igor
  */
-public abstract class DateValidator extends AbstractValidator<Date>
+public class DateValidator extends RangeValidator<Date>
 {
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Gets a <code>Date</code> range validator for checking if the <code>Date</code> value falls
-	 * between the minimum and maximum <code>Date</code> values. If that is not the case, an error
-	 * message will be generated with the key "DateValidator.range". The message keys that can be
-	 * used are:
-	 * <p>
-	 * <ul>
-	 * <li>${minimum}: the minimum date</li>
-	 * <li>${maximum}: the maximum date</li>
-	 * <li>${input}: the input the user gave</li>
-	 * <li>${name}: the name of the <code>Component</code> that failed</li>
-	 * <li>${label}: the label of the <code>Component</code> - either comes from
-	 * <code>FormComponent.labelModel</code> or resource key [form-id].[form-component-id] in that
-	 * order</li>
-	 * </ul>
-	 * 
-	 * @param minimum
-	 *            the minimum <code>Date</code>
-	 * @param maximum
-	 *            the maximum <code>Date</code>
-	 * 
-	 * @return the requested <code>DateValidator</code>
-	 */
-	public static DateValidator range(Date minimum, Date maximum)
-	{
-		return new RangeValidator(minimum, maximum, null);
-	}
-
-	/**
-	 * @see #range(Date, Date)
-	 * 
-	 * @param minimum
-	 *            the minimum <code>Date</code>
-	 * @param maximum
-	 *            the maximum <code>Date</code>
-	 * @param format
-	 *            The format string used to format the date with SimpleDateFormat
-	 * 
-	 * @return the requested <code>DateValidator</code>
-	 */
-	public static DateValidator range(Date minimum, Date maximum, String format)
-	{
-		return new RangeValidator(minimum, maximum, format);
-	}
-
-	/**
-	 * Gets a <code>Date</code> minimum validator for checking if a <code>Date</code> value is
-	 * greater than the given minimum <code>Date</code> value. If that is not the case, an error
-	 * message will be generated with the key "DateValidator.minimum". The message keys that can be
-	 * used are:
-	 * <p>
-	 * <ul>
-	 * <li>${minimum}: the minimum date</li>
-	 * <li>${input}: the input the user gave</li>
-	 * <li>${name}: the name of the <code>Component</code> that failed</li>
-	 * <li>${label}: the label of the <code>Component</code> - either comes from
-	 * <code>FormComponent.labelModel</code> or resource key [form-id].[form-component-id] in that
-	 * order</li>
-	 * </ul>
-	 * 
-	 * @param minimum
-	 *            the minimum <code>Date</code>
-	 * 
-	 * @return the requested <code>DateValidator</code>
-	 */
-	public static DateValidator minimum(Date minimum)
-	{
-		return new MinimumValidator(minimum, null);
-	}
-
-	/**
-	 * @see #minimum(Date)
-	 * 
-	 * @param minimum
-	 *            the minimum <code>Date</code>
-	 * @param format
-	 *            The format string used to format the date with SimpleDateFormat
-	 * 
-	 * @return the requested <code>DateValidator</code>
-	 */
-	public static DateValidator minimum(Date minimum, String format)
-	{
-		return new MinimumValidator(minimum, format);
-	}
+	private String format;
 
-	/**
-	 * Gets a <code>Date</code> maximum validator for checking if a <code>Date</code> value is
-	 * smaller than the given maximum value. If that is not the case, an error message will be
-	 * generated with the key "DateValidator.maximum". The message keys that can be used are:
-	 * <p>
-	 * <ul>
-	 * <li>${maximum}: the maximum date</li>
-	 * <li>${input}: the input the user gave</li>
-	 * <li>${name}: the name of the <code>Component</code> that failed</li>
-	 * <li>${label}: the label of the <code>Component</code> - either comes from
-	 * <code>FormComponent.labelModel</code> or resource key [form-id].[form-component-id] in that
-	 * order</li>
-	 * </ul>
-	 * 
-	 * @param maximum
-	 *            the maximum <code>Date</code>
-	 * 
-	 * @return the requested <code>DateValidator</code>
-	 */
-	public static DateValidator maximum(Date maximum)
+	public DateValidator(Date minimum, Date maximum, String format)
 	{
-		return new MaximumValidator(maximum, null);
+		super(minimum, maximum);
+		this.format = format;
 	}
 
-	/**
-	 * @see #maximum(Date)
-	 * 
-	 * @param maximum
-	 *            the maximum <code>Date</code>
-	 * @param format
-	 *            The format string used to format the date with SimpleDateFormat
-	 * 
-	 * @return the requested <code>DateValidator</code>
-	 */
-	public static DateValidator maximum(Date maximum, String format)
+	public DateValidator(Date minimum, Date maximum)
 	{
-		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 final String format;
-
-		private RangeValidator(Date minimum, Date maximum, String format)
-		{
-			this.minimum = minimum;
-			this.maximum = maximum;
-			this.format = format;
-		}
-
-		@Override
-		protected Map<String, Object> variablesMap(IValidatable<Date> validatable)
-		{
-			final Map<String, Object> map = super.variablesMap(validatable);
-			if (format == null)
-			{
-				map.put("minimum", minimum);
-				map.put("maximum", maximum);
-				map.put("inputdate", validatable.getValue());
-			}
-			else
-			{
-				SimpleDateFormat sdf = new SimpleDateFormat(format);
-				map.put("minimum", sdf.format(minimum));
-				map.put("maximum", sdf.format(maximum));
-				map.put("inputdate", sdf.format(validatable.getValue()));
-			}
-			return map;
-		}
-
-		/**
-		 * @see AbstractValidator#resourceKey(FormComponent)
-		 */
-		@Override
-		protected String resourceKey()
-		{
-			return "DateValidator.range";
-		}
-
-		@Override
-		protected void onValidate(IValidatable<Date> validatable)
-		{
-			Date value = validatable.getValue();
-			if (value.before(minimum) || value.after(maximum))
-			{
-				error(validatable);
-			}
-		}
+		this(minimum, maximum, null);
 	}
 
-	private static class MinimumValidator extends DateValidator
+	public DateValidator()
 	{
-		private static final long serialVersionUID = 1L;
-		private final Date minimum;
-		private final String format;
-
-		private MinimumValidator(Date minimum, String format)
-		{
-			this.minimum = minimum;
-			this.format = format;
-		}
-
-		@Override
-		protected Map<String, Object> variablesMap(IValidatable<Date> validatable)
-		{
-			final Map<String, Object> map = super.variablesMap(validatable);
-			if (format == null)
-			{
-				map.put("minimum", minimum);
-				map.put("inputdate", validatable.getValue());
-			}
-			else
-			{
-				SimpleDateFormat sdf = new SimpleDateFormat(format);
-				map.put("minimum", sdf.format(minimum));
-				map.put("inputdate", sdf.format(validatable.getValue()));
-			}
-			return map;
-		}
-
-		@Override
-		protected String resourceKey()
-		{
-			return "DateValidator.minimum";
-		}
-
-		@Override
-		protected void onValidate(IValidatable<Date> validatable)
-		{
-			Date value = validatable.getValue();
-			if (value.before(minimum))
-			{
-				error(validatable);
-			}
-		}
 	}
 
-	private static class MaximumValidator extends DateValidator
+	@Override
+	protected ValidationError decorate(ValidationError error, IValidatable<Date> validatable)
 	{
-		private static final long serialVersionUID = 1L;
-		private final Date maximum;
-		private final String format;
+		error = super.decorate(error, validatable);
 
-		private MaximumValidator(Date maximum, String format)
-		{
-			this.maximum = maximum;
-			this.format = format;
-		}
+		error.setVariable("inputdate", validatable.getValue());
 
-		@Override
-		protected Map<String, Object> variablesMap(IValidatable<Date> validatable)
+		// format variables if format has been specified
+		if (format != null)
 		{
-			final Map<String, Object> map = super.variablesMap(validatable);
-			if (format == null)
+			SimpleDateFormat sdf = new SimpleDateFormat(format);
+			if (getMinimum() != null)
 			{
-				map.put("maximum", maximum);
-				map.put("inputdate", validatable.getValue());
+				error.setVariable("minimum", sdf.format(getMinimum()));
 			}
-			else
+			if (getMaximum() != null)
 			{
-				SimpleDateFormat sdf = new SimpleDateFormat(format);
-				map.put("maximum", sdf.format(maximum));
-				map.put("inputdate", sdf.format(validatable.getValue()));
+				error.setVariable("maximum", sdf.format(getMaximum()));
 			}
-			return map;
-		}
-
-		@Override
-		protected String resourceKey()
-		{
-			return "DateValidator.maximum";
+			error.setVariable("inputdate", sdf.format(validatable.getValue()));
 		}
 
-		@Override
-		protected void onValidate(IValidatable<Date> validatable)
-		{
-			Date value = validatable.getValue();
-			if (value.after(maximum))
-			{
-				error(validatable);
-			}
-		}
+		return error;
 	}
 }

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/PatternValidator.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/PatternValidator.java?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/PatternValidator.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/PatternValidator.java Thu Nov 17 01:02:40 2011
@@ -16,11 +16,12 @@
  */
 package org.apache.wicket.validation.validator;
 
-import java.util.Map;
 import java.util.regex.Pattern;
 
 import org.apache.wicket.util.parse.metapattern.MetaPattern;
 import org.apache.wicket.validation.IValidatable;
+import org.apache.wicket.validation.IValidator;
+import org.apache.wicket.validation.ValidationError;
 
 // FIXME 2.0: ivaynberg: look over javadoc
 /**
@@ -59,7 +60,7 @@ import org.apache.wicket.validation.IVal
  * 
  * @since 1.2.6
  */
-public class PatternValidator extends StringValidator
+public class PatternValidator implements IValidator<String>
 {
 	private static final long serialVersionUID = 1L;
 
@@ -139,20 +140,6 @@ public class PatternValidator extends St
 	}
 
 	/**
-	 * Checks a value against this <code>PatternValidator</code>'s {@link Pattern}.
-	 * 
-	 * @param validatable
-	 *            the <code>IValidatable</code> to check
-	 */
-	@Override
-	protected Map<String, Object> variablesMap(IValidatable<String> validatable)
-	{
-		final Map<String, Object> map = super.variablesMap(validatable);
-		map.put("pattern", pattern.pattern());
-		return map;
-	}
-
-	/**
 	 * @see java.lang.Object#toString()
 	 */
 	@Override
@@ -168,12 +155,27 @@ public class PatternValidator extends St
 	 *            the <code>IValidatable</code> to check
 	 */
 	@Override
-	protected void onValidate(IValidatable<String> validatable)
+	public void validate(IValidatable<String> validatable)
 	{
 		// Check value against pattern
 		if (pattern.matcher(validatable.getValue()).matches() == reverse)
 		{
-			error(validatable);
+			ValidationError error = new ValidationError(this);
+			error.setVariable("pattern", pattern.pattern());
+			validatable.error(decorate(error, validatable));
 		}
 	}
+
+	/**
+	 * Allows subclasses to decorate reported errors
+	 * 
+	 * @param error
+	 * @param validatable
+	 * @return decorated error
+	 */
+	protected ValidationError decorate(ValidationError error, IValidatable<String> validatable)
+	{
+		return error;
+	}
+
 }

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/RangeValidator.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/RangeValidator.java?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/RangeValidator.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/RangeValidator.java Thu Nov 17 01:02:40 2011
@@ -18,24 +18,45 @@ package org.apache.wicket.validation.val
 
 import java.io.Serializable;
 
-import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.validation.IValidatable;
-import org.apache.wicket.validation.IValidator;
 import org.apache.wicket.validation.ValidationError;
 
 /**
  * Validator for checking if a given value falls within [min,max] range.
  * 
+ * If either min or max are {@code null} they are not checked.
+ * 
+ * <p>
+ * Resource keys:
+ * <ul>
+ * <li>{@code RangeValidator.exact} if min==max</li>
+ * <li>{@code RangeValidator.range} if both min and max are not {@code null}</li>
+ * <li>{@code RangeValidator.minimum} if max is {@code null}</li>
+ * <li>{@code RangeValidator.maximum} if min is {@code null}</li>
+ * </ul>
+ * </p>
+ * 
+ * <p>
+ * Error Message Variables:
+ * <ul>
+ * <li>{@code name}: the id of {@code Component} that failed</li>
+ * <li>{@code label}: the label of the {@code Component} (either comes from
+ * {@code FormComponent.labelModel} or resource key {@code <form-id>.<form-component-id>}</li>
+ * <li>{@code input}: the input value</li>
+ * <li>{@code minimum}: the minimum allowed value</li>
+ * <li>{@code maximum}: the maximum allowed value</li>
+ * </ul>
+ * </p>
+ * 
  * @param <Z>
  *            type of validatable
+ * 
+ * @author igor
  */
-public class RangeValidator<Z extends Comparable<Z> & Serializable> extends Behavior
-	implements
-		IValidator<Z>
+public class RangeValidator<Z extends Comparable<Z> & Serializable> extends
+	AbstractRangeValidator<Z, Z>
 {
 	private static final long serialVersionUID = 1L;
-	private Z minimum;
-	private Z maximum;
 
 	/**
 	 * Constructor that sets the minimum and maximum values.
@@ -58,67 +79,26 @@ public class RangeValidator<Z extends Co
 	{
 	}
 
-	/**
-	 * Sets validator range
-	 * 
-	 * @param minimum
-	 * @param maximum
-	 */
-	protected final void setRange(Z minimum, Z maximum)
+	@Override
+	protected Z getValue(IValidatable<Z> validatable)
 	{
-		this.minimum = minimum;
-		this.maximum = maximum;
+		return validatable.getValue();
 	}
 
-	/** {@inheritDoc} */
 	@Override
-	public void validate(IValidatable<Z> validatable)
+	protected ValidationError decorate(ValidationError error, IValidatable<Z> validatable)
 	{
-		Z value = validatable.getValue();
-		final Z min = getMinimum();
-		final Z max = getMaximum();
-		if ((min != null && value.compareTo(min) < 0) || (max != null && value.compareTo(max) > 0))
+		// TODO wicket 7: remove deprecated keys
+		error = super.decorate(error, validatable);
+		switch (getMode())
 		{
-			ValidationError error = new ValidationError();
-			error.addKey(resourceKey());
-			error.setVariable("minimum", min);
-			error.setVariable("maximum", max);
-			validatable.error(error);
+			case MINIMUM :
+				error.addKey("MaximumValidator");
+				break;
+			case MAXIMUM :
+				error.addKey("MinimumValidator");
+				break;
 		}
+		return error;
 	}
-
-	/**
-	 * Gets the minimum value.
-	 * 
-	 * @return minimum value
-	 */
-	public Z getMinimum()
-	{
-		return minimum;
-	}
-
-	/**
-	 * Gets the maximum value.
-	 * 
-	 * @return maximum value
-	 */
-	public Z getMaximum()
-	{
-		return maximum;
-	}
-
-	/**
-	 * Gets the message resource key for this validator's error message from the
-	 * <code>ApplicationSettings</code> class.
-	 * 
-	 * <strong>NOTE</strong>: THIS METHOD SHOULD NEVER RETURN <code>null</code>.
-	 * 
-	 * @return the message resource key for this validator
-	 */
-	// TODO Wicket 1.6 - remove that method and make this class extending AbstractValidator
-	protected String resourceKey()
-	{
-		return getClass().getSimpleName();
-	}
-
 }
\ No newline at end of file

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/StringValidator.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/StringValidator.java?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/StringValidator.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/StringValidator.java Thu Nov 17 01:02:40 2011
@@ -16,404 +16,94 @@
  */
 package org.apache.wicket.validation.validator;
 
-import java.util.Map;
-
+import org.apache.wicket.Component;
+import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.validation.IValidatable;
-
+import org.apache.wicket.validation.ValidationError;
 
 /**
- * Validator for checking <code>String</code> lengths. Usually this validator is used through the
- * static factory methods, but it and its inner classes can also be subclassed directly.
+ * Validator for checking if length of a string falls within [min,max] range.
+ * 
+ * If either min or max are {@code null} they are not checked.
+ * 
+ * <p>
+ * If the component is attached to an {@code input} tag, a {@code maxlen} attribute will be added if
+ * the maximum is set.
  * 
- * @author Jonathan Locke
- * @author Johan Compagner
- * @author Igor Vaynberg (ivaynberg)
- * @since 1.2.6
+ * *
+ * <p>
+ * Resource keys:
+ * <ul>
+ * <li>{@code RangeValidator.exact} if min==max</li>
+ * <li>{@code RangeValidator.range} if both min and max are not {@code null}</li>
+ * <li>{@code RangeValidator.minimum} if max is {@code null}</li>
+ * <li>{@code RangeValidator.maximum} if min is {@code null}</li>
+ * </ul>
+ * (for backwards compatibility reasons resource keys of form {@code StringValidator.*} are still
+ * checked)
+ * </p>
+ * 
+ * <p>
+ * Error Message Variables:
+ * <ul>
+ * <li>{@code name}: the id of {@code Component} that failed</li>
+ * <li>{@code label}: the label of the {@code Component} (either comes from
+ * {@code FormComponent.labelModel} or resource key {@code <form-id>.<form-component-id>}</li>
+ * <li>{@code input}: the input value</li>
+ * <li>{@code length}: the length of the entered</li>
+ * <li>{@code minimum}: the minimum alloed length</li>
+ * <li>{@code maximum}: the maximum allowed length</li>
+ * </ul>
+ * </p>
+ * 
+ * @author igor
  */
-public abstract class StringValidator extends AbstractValidator<String>
+public class StringValidator extends AbstractRangeValidator<Integer, String>
 {
-
-	/**
-	 * 
-	 */
 	private static final long serialVersionUID = 1L;
 
 	/**
-	 * Validator for checking if the length of a <code>String</code> is exactly the specified
-	 * length.
-	 */
-	public static class ExactLengthValidator extends StringValidator
-	{
-		private static final long serialVersionUID = 1L;
-		private final int length;
-
-		/**
-		 * Constructor.
-		 * 
-		 * @param length
-		 *            the length value
-		 */
-		public ExactLengthValidator(int length)
-		{
-			this.length = length;
-		}
-
-		/**
-		 * Retrieves the length value.
-		 * 
-		 * @return the length value
-		 */
-		public final int getLength()
-		{
-			return length;
-		}
-
-		/**
-		 * see AbstractValidator#onValidate(IValidatable)
-		 */
-		@Override
-		protected void onValidate(IValidatable<String> validatable)
-		{
-			if ((validatable.getValue()).length() != length)
-			{
-				error(validatable);
-			}
-		}
-
-		/**
-		 * @see AbstractValidator#resourceKey()
-		 */
-		@Override
-		protected String resourceKey()
-		{
-			return "StringValidator.exact";
-		}
-
-		/**
-		 * @see AbstractValidator#variablesMap(IValidatable)
-		 */
-		@Override
-		protected Map<String, Object> variablesMap(IValidatable<String> validatable)
-		{
-			final Map<String, Object> map = super.variablesMap(validatable);
-			map.put("length", (validatable.getValue() != null) ? (validatable.getValue()).length() : 0);
-			map.put("exact", length);
-			return map;
-		}
-
-	}
-
-	/**
-	 * Validator for checking if the length of a <code>String</code> is within the specified range.
-	 */
-	public static class LengthBetweenValidator extends StringValidator
-	{
-		private static final long serialVersionUID = 1L;
-		private final int maximum;
-		private final int minimum;
-
-		/**
-		 * Constructor that sets the minimum and maximum values.
-		 * 
-		 * @param minimum
-		 *            the minimum value
-		 * @param maximum
-		 *            the maximum value
-		 */
-		public LengthBetweenValidator(int minimum, int maximum)
-		{
-			this.minimum = minimum;
-			this.maximum = maximum;
-
-		}
-
-		/**
-		 * Retrieves the maximum value.
-		 * 
-		 * @return the maximum value
-		 */
-		public final int getMaximum()
-		{
-			return maximum;
-		}
-
-		/**
-		 * Retrieves the minimum value.
-		 * 
-		 * @return the minimum value
-		 */
-		public final int getMinimum()
-		{
-			return minimum;
-		}
-
-		/**
-		 * see AbstractValidator#onValidate(IValidatable)
-		 */
-		@Override
-		protected void onValidate(IValidatable<String> validatable)
-		{
-			final String value = validatable.getValue();
-			if (value.length() < minimum || value.length() > maximum)
-			{
-				error(validatable);
-			}
-
-		}
-
-		/**
-		 * @see AbstractValidator#resourceKey()
-		 */
-		@Override
-		protected String resourceKey()
-		{
-			return "StringValidator.range";
-		}
-
-		/**
-		 * @see AbstractValidator#variablesMap(IValidatable)
-		 */
-		@Override
-		protected Map<String, Object> variablesMap(IValidatable<String> validatable)
-		{
-			final Map<String, Object> map = super.variablesMap(validatable);
-			map.put("minimum", minimum);
-			map.put("maximum", maximum);
-			map.put("length", (validatable.getValue()).length());
-			return map;
-		}
-
-	}
-
-	/**
-	 * Validator for checking if the length of a <code>String</code> meets the maximum length
-	 * requirement.
-	 */
-	public static class MaximumLengthValidator extends StringValidator
-	{
-		private static final long serialVersionUID = 1L;
-		private final int maximum;
-
-		/**
-		 * Constructor that sets a maximum length value.
-		 * 
-		 * @param maximum
-		 *            the maximum length value
-		 */
-		public MaximumLengthValidator(int maximum)
-		{
-			this.maximum = maximum;
-		}
-
-		/**
-		 * Retrieves the maximum length value.
-		 * 
-		 * @return the maximum length value
-		 */
-		public final int getMaximum()
-		{
-			return maximum;
-		}
-
-		/**
-		 * see AbstractValidator#onValidate(IValidatable)
-		 */
-		@Override
-		protected void onValidate(IValidatable<String> validatable)
-		{
-			if ((validatable.getValue()).length() > maximum)
-			{
-				error(validatable);
-			}
-		}
-
-		/**
-		 * @see AbstractValidator#resourceKey()
-		 */
-		@Override
-		protected String resourceKey()
-		{
-			return "StringValidator.maximum";
-		}
-
-		/**
-		 * @see AbstractValidator#variablesMap(IValidatable)
-		 */
-		@Override
-		protected Map<String, Object> variablesMap(IValidatable<String> validatable)
-		{
-			final Map<String, Object> map = super.variablesMap(validatable);
-			map.put("maximum", maximum);
-			map.put("length", (validatable.getValue()).length());
-			return map;
-		}
-	}
-
-	/**
-	 * Validator for checking if the length of a <code>String</code> meets the minimum length
-	 * requirement.
+	 * Constructor that sets the minimum and maximum length values.
+	 * 
+	 * @param minimum
+	 *            the minimum lenghh
+	 * @param maximum
+	 *            the maximum length
 	 */
-	public static class MinimumLengthValidator extends StringValidator
+	public StringValidator(Integer minimum, Integer maximum)
 	{
-		private static final long serialVersionUID = 1L;
-		private final int minimum;
-
-		/**
-		 * Constructor that sets a minimum length value.
-		 * 
-		 * @param minimum
-		 *            the minimum length value
-		 */
-		public MinimumLengthValidator(int minimum)
-		{
-			this.minimum = minimum;
-		}
-
-		/**
-		 * Retrieves the minimum length value.
-		 * 
-		 * @return the minimum length value
-		 */
-		public final int getMinimum()
-		{
-			return minimum;
-		}
-
-		/**
-		 * see AbstractValidator#onValidate(IValidatable)
-		 */
-		@Override
-		protected void onValidate(IValidatable<String> validatable)
-		{
-			if ((validatable.getValue()).length() < minimum)
-			{
-				error(validatable);
-			}
-		}
-
-		/**
-		 * @see AbstractValidator#resourceKey()
-		 */
-		@Override
-		protected String resourceKey()
-		{
-			return "StringValidator.minimum";
-		}
-
-		/**
-		 * @see AbstractValidator#variablesMap(IValidatable)
-		 */
-		@Override
-		protected Map<String, Object> variablesMap(IValidatable<String> validatable)
-		{
-			final Map<String, Object> map = super.variablesMap(validatable);
-			map.put("minimum", minimum);
-			map.put("length", (validatable.getValue()).length());
-			return map;
-		}
-
+		setRange(minimum, maximum);
 	}
 
 	/**
-	 * Gets a <code>String</code> exact length validator for checking if a string length is exactly
-	 * the same as the given length value. If that is not the case, then an error message will be
-	 * generated with the key "StringValidator.exact". The message keys that can be used are:
-	 * <p>
-	 * <ul>
-	 * <li>${exact}: the maximum length</li>
-	 * <li>${length}: the length of the user input</li>
-	 * <li>${input}: the input the user gave</li>
-	 * <li>${name}: the name of the <code>Component</code> that failed</li>
-	 * <li>${label}: the label of the <code>Component</code> - either comes from
-	 * <code>FormComponent.labelModel</code> or resource key [form-id].[form-component-id] in that
-	 * order</li>
-	 * </ul>
-	 * 
-	 * @param length
-	 *            the required length of the string
-	 * 
-	 * @return the requested <code>StringValidator</code>
+	 * Constructor used for subclasses who want to set the range using
+	 * {@link #setRange(Comparable, Comparable)}
 	 */
-	public static StringValidator exactLength(int length)
+	protected StringValidator()
 	{
-		return new ExactLengthValidator(length);
 	}
 
-	/**
-	 * Gets a <code>String</code> range validator for checking if a string length falls between the
-	 * minimum and and maximum lengths. If that is not the case, then an error message will be
-	 * generated with the key "StringValidator.range". The message keys that can be used are:
-	 * <p>
-	 * <ul>
-	 * <li>${minimum}: the minimum length</li>
-	 * <li>${maximum}: the maximum length</li>
-	 * <li>${length}: the length of the user input</li>
-	 * <li>${input}: the input the user gave</li>
-	 * <li>${name}: the name of the <code>Component</code> that failed</li>
-	 * <li>${label}: the label of the <code>Component</code> - either comes from
-	 * <code>FormComponent.labelModel</code> or resource key [form-id].[form-component-id] in that
-	 * order</li>
-	 * </ul>
-	 * 
-	 * @param minimum
-	 *            the minimum length of the string
-	 * @param maximum
-	 *            the maximum length of the string
-	 * 
-	 * @return the requested <code>StringValidator</code>
-	 */
-	public static StringValidator lengthBetween(int minimum, int maximum)
+	@Override
+	protected Integer getValue(IValidatable<String> validatable)
 	{
-		return new LengthBetweenValidator(minimum, maximum);
+		return validatable.getValue().length();
 	}
 
-	/**
-	 * Gets a <code>String</code> maximum validator for checking if a string length is smaller than
-	 * the given maximum value. If that is not the case, then an error message will be generated
-	 * with the key "StringValidator.maximum". The message keys that can be used are:
-	 * <p>
-	 * <ul>
-	 * <li>${maximum}: the maximum length</li>
-	 * <li>${length}: the length of the user input</li>
-	 * <li>${input}: the input the user gave</li>
-	 * <li>${name}: the name of the <code>Component</code> that failed</li>
-	 * <li>${label}: the label of the <code>Component</code> - either comes from
-	 * <code>FormComponent.labelModel</code> or resource key [form-id].[form-component-id] in that
-	 * order</li>
-	 * </ul>
-	 * 
-	 * @param maximum
-	 *            the maximum length of the string
-	 * 
-	 * @return the requested <code>StringValidator</code>
-	 */
-	public static StringValidator maximumLength(int maximum)
+	@Override
+	protected ValidationError decorate(ValidationError error, IValidatable<String> validatable)
 	{
-		return new MaximumLengthValidator(maximum);
+		error = super.decorate(error, validatable);
+		error.setVariable("length", validatable.getValue().length());
+		return error;
 	}
 
-	/**
-	 * Gets a <code>String</code> minimum validator for checking if a string length is greater than
-	 * the given minimum value. If that is not the case, then an error message will be generated
-	 * with the key "StringValidator.minimum". The message keys that can be used are:
-	 * <p>
-	 * <ul>
-	 * <li>${minimum}: the minimum length</li>
-	 * <li>${length}: the length of the user input</li>
-	 * <li>${input}: the input the user gave</li>
-	 * <li>${name}: the name of the <code>Component</code> that failed</li>
-	 * <li>${label}: the label of the <code>Component</code> - either comes from
-	 * <code>FormComponent.labelModel</code> or resource key [form-id].[form-component-id] in that
-	 * order</li>
-	 * </ul>
-	 * 
-	 * @param minimum
-	 *            the minimum length of the string
-	 * 
-	 * @return the requested <code>StringValidator</code>
-	 */
-	public static StringValidator minimumLength(int minimum)
+	@Override
+	public void onComponentTag(Component component, ComponentTag tag)
 	{
-		return new MinimumLengthValidator(minimum);
+		super.onComponentTag(component, tag);
+		if (getMaximum() != null && "input".equalsIgnoreCase(tag.getName()))
+		{
+			tag.put("maxlen", getMaximum());
+		}
 	}
-}
+}
\ No newline at end of file

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/UrlValidator.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/UrlValidator.java?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/UrlValidator.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/validation/validator/UrlValidator.java Thu Nov 17 01:02:40 2011
@@ -23,6 +23,8 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.apache.wicket.validation.IValidatable;
+import org.apache.wicket.validation.IValidator;
+import org.apache.wicket.validation.ValidationError;
 
 /**
  * Validator for checking URLs. The default schemes allowed are <code>http://</code>,
@@ -52,7 +54,7 @@ import org.apache.wicket.validation.IVal
  * @since 1.2.6
  * @see "http://www.ietf.org/rfc/rfc2396.txt"
  */
-public class UrlValidator extends AbstractValidator<String>
+public class UrlValidator implements IValidator<String>
 {
 	private static final long serialVersionUID = 1L;
 
@@ -217,20 +219,29 @@ public class UrlValidator extends Abstra
 		allowedSchemes.addAll(Arrays.asList(schemes));
 	}
 
-	/**
-	 * @see AbstractValidator#onValidate(IValidatable)
-	 */
+
 	@Override
-	protected void onValidate(IValidatable<String> validatable)
+	public void validate(IValidatable<String> validatable)
 	{
 		String url = validatable.getValue();
-		if (url != null && !isValid(url))
+		if (!isValid(url))
 		{
-			error(validatable);
+			validatable.error(decorate(new ValidationError(this), validatable));
 		}
 	}
 
 	/**
+	 * Allows subclasses to decorate reported errors
+	 * 
+	 * @param error
+	 * @return decorated error
+	 */
+	protected ValidationError decorate(ValidationError error, IValidatable<String> validatable)
+	{
+		return error;
+	}
+
+	/**
 	 * Checks if a field has a valid <code>URL</code>. This method is public because it is directly
 	 * used in tests.
 	 * 

Modified: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadError.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadError.java?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadError.java (original)
+++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadError.java Thu Nov 17 01:02:40 2011
@@ -71,7 +71,7 @@ public class FileUploadError extends Web
 			}
 		});
 
-		inputField.add(StringValidator.lengthBetween(3, 10));
+		inputField.add(new StringValidator(3, 10));
 		inputField.setRequired(true);
 		form.add(inputField);
 

Modified: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/validation/FormValidatorBehaviorTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/validation/FormValidatorBehaviorTest.java?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/validation/FormValidatorBehaviorTest.java (original)
+++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/validation/FormValidatorBehaviorTest.java Thu Nov 17 01:02:40 2011
@@ -100,7 +100,7 @@ public class FormValidatorBehaviorTest e
 		ft.setValue("name", "22");
 		ft.submit();
 		assertEquals(1, tester.getSession().getFeedbackMessages().size());
-		assertEquals("MIN", tester.getSession()
+		assertEquals("MINIMUM", tester.getSession()
 			.getFeedbackMessages()
 			.iterator()
 			.next()
@@ -199,7 +199,7 @@ public class FormValidatorBehaviorTest e
 			String value = field.getConvertedInput();
 			if (value.length() < len)
 			{
-				form.error("MIN");
+				form.error("MINIMUM");
 			}
 		}
 	}

Modified: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/model/HomePage.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/model/HomePage.java?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/model/HomePage.java (original)
+++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/model/HomePage.java Thu Nov 17 01:02:40 2011
@@ -60,7 +60,7 @@ public class HomePage extends WebPage
 
 			TextField<String> name = new TextField<String>("partyDetails.name");
 			name.setRequired(Boolean.TRUE);
-			name.add(new StringValidator.LengthBetweenValidator(1, 30));
+			name.add(new StringValidator(1, 30));
 
 			FormComponentFeedbackBorder nameBorder = new FormComponentFeedbackBorder("nameBorder");
 			add(nameBorder);

Modified: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/resource/loader/ClassStringResourceLoaderTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/resource/loader/ClassStringResourceLoaderTest.java?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/resource/loader/ClassStringResourceLoaderTest.java (original)
+++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/resource/loader/ClassStringResourceLoaderTest.java Thu Nov 17 01:02:40 2011
@@ -19,7 +19,7 @@ package org.apache.wicket.resource.loade
 import org.apache.wicket.Component;
 import org.apache.wicket.WicketTestCase;
 import org.apache.wicket.validation.IValidatable;
-import org.apache.wicket.validation.validator.AbstractValidator;
+import org.apache.wicket.validation.IValidator;
 import org.junit.Test;
 
 /**
@@ -44,18 +44,14 @@ public class ClassStringResourceLoaderTe
 	/**
 	 * 
 	 */
-	public static class MyValidator extends AbstractValidator<String>
+	public static class MyValidator implements IValidator<String>
 	{
 		private static final long serialVersionUID = 1L;
 
-		/**
-		 * 
-		 * @see org.apache.wicket.validation.validator.AbstractValidator#onValidate(org.apache.wicket.validation.IValidatable)
-		 */
 		@Override
-		protected void onValidate(IValidatable<String> v)
+		public void validate(IValidatable<String> v)
 		{
-			error(v);
+
 		}
 	}
 }

Modified: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/MockAjaxFormPage.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/MockAjaxFormPage.java?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/MockAjaxFormPage.java (original)
+++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/MockAjaxFormPage.java Thu Nov 17 01:02:40 2011
@@ -78,7 +78,7 @@ public class MockAjaxFormPage extends We
 		form.add(submit);
 		final TextField<String> text = new TextField<String>("text");
 		text.setRequired(true);
-		text.add(StringValidator.minimumLength(4));
+		text.add(new StringValidator(4, null));
 		text.add(new AjaxFormValidatingBehavior(form, "onkeyup")
 		{
 			private static final long serialVersionUID = 1L;

Modified: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/validation/ValidationErrorTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/validation/ValidationErrorTest.java?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/validation/ValidationErrorTest.java (original)
+++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/validation/ValidationErrorTest.java Thu Nov 17 01:02:40 2011
@@ -37,22 +37,36 @@ public class ValidationErrorTest
 		e.addKey(new TestValidator());
 		assertEquals("TestValidator", e.getKeys().get(0));
 
+		e = new ValidationError(new TestValidator());
+		assertEquals("TestValidator", e.getKeys().get(0));
+
 		e = new ValidationError();
 		e.addKey(new TestValidator(), "foo");
 		assertEquals("TestValidator.foo", e.getKeys().get(0));
 
+		e = new ValidationError(new TestValidator(), "foo");
+		assertEquals("TestValidator.foo", e.getKeys().get(0));
+
 		e = new ValidationError();
 		e.addKey(new TestValidator(), null);
 		assertEquals("TestValidator", e.getKeys().get(0));
 
+		e = new ValidationError(new TestValidator(), null);
+		assertEquals("TestValidator", e.getKeys().get(0));
+
 		e = new ValidationError();
 		e.addKey(new TestValidator(), " ");
 		assertEquals("TestValidator", e.getKeys().get(0));
 
+		e = new ValidationError(new TestValidator(), " ");
+		assertEquals("TestValidator", e.getKeys().get(0));
+
 		e = new ValidationError();
 		e.addKey(new TestValidator(), " foo ");
 		assertEquals("TestValidator.foo", e.getKeys().get(0));
 
+		e = new ValidationError(new TestValidator(), " foo ");
+		assertEquals("TestValidator.foo", e.getKeys().get(0));
 
 	}
 

Modified: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/validation/ValidatorBehaviorTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/validation/ValidatorBehaviorTest.java?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/validation/ValidatorBehaviorTest.java (original)
+++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/validation/ValidatorBehaviorTest.java Thu Nov 17 01:02:40 2011
@@ -98,7 +98,7 @@ public class ValidatorBehaviorTest exten
 		ft.setValue("name", "22");
 		ft.submit();
 		assertEquals(1, tester.getSession().getFeedbackMessages().size());
-		assertEquals("MIN", tester.getSession()
+		assertEquals("MINIMUM", tester.getSession()
 			.getFeedbackMessages()
 			.iterator()
 			.next()
@@ -165,7 +165,7 @@ public class ValidatorBehaviorTest exten
 			if (value.length() < len)
 			{
 				ValidationError error = new ValidationError();
-				error.setMessage("MIN");
+				error.setMessage("MINIMUM");
 				validatable.error(error);
 			}
 

Modified: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/validation/validator/CreditCardValidatorTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/validation/validator/CreditCardValidatorTest.java?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/validation/validator/CreditCardValidatorTest.java (original)
+++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/validation/validator/CreditCardValidatorTest.java Thu Nov 17 01:02:40 2011
@@ -38,27 +38,27 @@ public class CreditCardValidatorTest ext
 		// null value
 		CreditCardValidator test = new CreditCardValidator();
 		IValidatable<String> validatable = new Validatable<String>(null);
-		test.onValidate(validatable);
+		test.validate(validatable);
 		assertEquals(false, validatable.isValid());
 
 		// too short
 		validatable = new Validatable<String>("9845");
-		test.onValidate(validatable);
+		test.validate(validatable);
 		assertEquals(false, validatable.isValid());
 
 		// too long
 		validatable = new Validatable<String>("1234678910111213141516");
-		test.onValidate(validatable);
+		test.validate(validatable);
 		assertEquals(false, validatable.isValid());
 
 		// contains a char
 		validatable = new Validatable<String>("3782822X6310005");
-		test.onValidate(validatable);
+		test.validate(validatable);
 		assertEquals(false, validatable.isValid());
 
 		// invalid number
 		validatable = new Validatable<String>("840898920205250");
-		test.onValidate(validatable);
+		test.validate(validatable);
 		assertEquals(false, validatable.isValid());
 	}
 
@@ -72,78 +72,78 @@ public class CreditCardValidatorTest ext
 		// American Express
 		CreditCardValidator test = new CreditCardValidator();
 		IValidatable<String> validatable = new Validatable<String>("378282246310005");
-		test.onValidate(validatable);
+		test.validate(validatable);
 		assertEquals(true, validatable.isValid());
 
 		// American Express
 		validatable = new Validatable<String>("371449635398431");
-		test.onValidate(validatable);
+		test.validate(validatable);
 		assertEquals(true, validatable.isValid());
 
 		// American Express Corporate
 		validatable = new Validatable<String>("378734493671000");
-		test.onValidate(validatable);
+		test.validate(validatable);
 		assertEquals(true, validatable.isValid());
 
 		// American Express Corporate with dashes and spaces (should be filtered
 		// and are therefor legal)
 		validatable = new Validatable<String>("378 - 7344-9367 1000");
-		test.onValidate(validatable);
+		test.validate(validatable);
 		assertEquals(true, validatable.isValid());
 
 		// Diners Club
 		validatable = new Validatable<String>("30569309025904");
-		test.onValidate(validatable);
+		test.validate(validatable);
 		assertEquals(true, validatable.isValid());
 
 		// Discover
 		validatable = new Validatable<String>("6011111111111117");
-		test.onValidate(validatable);
+		test.validate(validatable);
 		assertEquals(true, validatable.isValid());
 
 		// Discover
 		validatable = new Validatable<String>("6011000990139424");
-		test.onValidate(validatable);
+		test.validate(validatable);
 		assertEquals(true, validatable.isValid());
 
 		// JCB
 		validatable = new Validatable<String>("3530111333300000");
-		test.onValidate(validatable);
+		test.validate(validatable);
 		assertEquals(true, validatable.isValid());
 
 		// JCB
 		validatable = new Validatable<String>("3566002020360505");
-		test.onValidate(validatable);
+		test.validate(validatable);
 		assertEquals(true, validatable.isValid());
 
 		// Mastercard
 		validatable = new Validatable<String>("5555555555554444");
-		test.onValidate(validatable);
+		test.validate(validatable);
 		assertEquals(true, validatable.isValid());
 
 		// Mastercard
 		validatable = new Validatable<String>("5105105105105100");
-		test.onValidate(validatable);
+		test.validate(validatable);
 		assertEquals(true, validatable.isValid());
 
 		// Visa
 		validatable = new Validatable<String>("4111111111111111");
-		test.onValidate(validatable);
+		test.validate(validatable);
 		assertEquals(true, validatable.isValid());
 
 		// Visa
 		validatable = new Validatable<String>("4012888888881881");
-		test.onValidate(validatable);
+		test.validate(validatable);
 		assertEquals(true, validatable.isValid());
 
 		// Visa
 		validatable = new Validatable<String>("4222222222222");
-		test.onValidate(validatable);
+		test.validate(validatable);
 		assertEquals(true, validatable.isValid());
 
 		// Switch / Solo
 		validatable = new Validatable<String>("6331101999990016");
-		test.onValidate(validatable);
+		test.validate(validatable);
 		assertEquals(true, validatable.isValid());
 	}
 

Modified: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/validation/validator/RangeValidatorTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/validation/validator/RangeValidatorTest.java?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/validation/validator/RangeValidatorTest.java (original)
+++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/validation/validator/RangeValidatorTest.java Thu Nov 17 01:02:40 2011
@@ -16,27 +16,30 @@
  */
 package org.apache.wicket.validation.validator;
 
-import junit.framework.TestCase;
+import static org.junit.Assert.assertEquals;
 
 import org.apache.wicket.validation.IValidator;
 import org.apache.wicket.validation.Validatable;
+import org.apache.wicket.validation.ValidationError;
+import org.junit.Test;
 
 /**
  * Tests range validator
  * 
  * @author igor.vaynberg
  */
-public class RangeValidatorTest extends TestCase
+public class RangeValidatorTest
 {
 
 	/**
 	 * @throws Exception
 	 */
-	public void testDoubleRange() throws Exception
+	@Test
+	public void doubleRange() throws Exception
 	{
 		IValidator<Double> validator = new RangeValidator<Double>(1.1, 1.8);
 
-		Validatable<Double> validatable = new Validatable<Double>((double) 1);
+		Validatable<Double> validatable = new Validatable<Double>((double)1);
 		validator.validate(validatable);
 		assertEquals(1, validatable.getErrors().size());
 
@@ -52,7 +55,7 @@ public class RangeValidatorTest extends 
 		validator.validate(validatable);
 		assertEquals(0, validatable.getErrors().size());
 
-		validatable = new Validatable<Double>((double) 2);
+		validatable = new Validatable<Double>((double)2);
 		validator.validate(validatable);
 		assertEquals(1, validatable.getErrors().size());
 	}
@@ -61,7 +64,8 @@ public class RangeValidatorTest extends 
 	/**
 	 * @throws Exception
 	 */
-	public void testIntegerRange() throws Exception
+	@Test
+	public void integerRange() throws Exception
 	{
 		IValidator<Integer> validator = new RangeValidator<Integer>(1, 8);
 
@@ -84,5 +88,37 @@ public class RangeValidatorTest extends 
 		validatable = new Validatable<Integer>(9);
 		validator.validate(validatable);
 		assertEquals(1, validatable.getErrors().size());
+
+	}
+
+	@Test
+	public void resourceKeys()
+	{
+		Validatable<Integer> validatable = new Validatable<Integer>(10);
+
+		IValidator<Integer> validator = new RangeValidator<Integer>(15, null);
+		validator.validate(validatable);
+		assertEquals("RangeValidator.minimum", getError(validatable).getKeys().get(0));
+
+		validatable = new Validatable<Integer>(10);
+		validator = new RangeValidator<Integer>(null, 5);
+		validator.validate(validatable);
+		assertEquals("RangeValidator.maximum", getError(validatable).getKeys().get(0));
+
+		validatable = new Validatable<Integer>(10);
+		validator = new RangeValidator<Integer>(1, 2);
+		validator.validate(validatable);
+		assertEquals("RangeValidator.range", getError(validatable).getKeys().get(0));
+
+		validatable = new Validatable<Integer>(10);
+		validator = new RangeValidator<Integer>(1, 1);
+		validator.validate(validatable);
+		assertEquals("RangeValidator.exact", getError(validatable).getKeys().get(0));
+
+	}
+
+	private ValidationError getError(Validatable validatable)
+	{
+		return (ValidationError)validatable.getErrors().get(0);
 	}
 }

Modified: wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/FormPage.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/FormPage.java?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/FormPage.java (original)
+++ wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/FormPage.java Thu Nov 17 01:02:40 2011
@@ -51,7 +51,7 @@ public class FormPage extends BasePage
 		add(feedback);
 
 		// add form with markup id setter so it can be updated via ajax
-		Bean bean=new Bean();
+		Bean bean = new Bean();
 		Form<Bean> form = new Form<Bean>("form", new CompoundPropertyModel<Bean>(bean));
 		add(form);
 		form.setOutputMarkupId(true);
@@ -61,7 +61,7 @@ public class FormPage extends BasePage
 		// add form components to the form as usual
 
 		fc = new RequiredTextField<String>("name");
-		fc.add(StringValidator.minimumLength(4));
+		fc.add(new StringValidator(4, null));
 		fc.setLabel(new ResourceModel("label.name"));
 
 		form.add(fc);

Modified: wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/library/EditBook.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/library/EditBook.java?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/library/EditBook.java (original)
+++ wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/library/EditBook.java Thu Nov 17 01:02:40 2011
@@ -106,7 +106,7 @@ public final class EditBook extends Auth
 			// that edits the book's title
 			final TextField<String> title = new TextField<String>("title");
 			title.setRequired(true);
-			title.add(StringValidator.maximumLength(30));
+			title.add(new StringValidator(null, 30));
 
 			final MarkupContainer titleFeedback = new FormComponentFeedbackBorder("titleFeedback");
 			add(titleFeedback);

Modified: wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage.java?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage.java (original)
+++ wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage.java Thu Nov 17 01:02:40 2011
@@ -23,7 +23,7 @@ import org.apache.wicket.markup.html.for
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 import org.apache.wicket.markup.html.panel.FeedbackPanel;
 import org.apache.wicket.model.PropertyModel;
-import org.apache.wicket.validation.validator.MaximumValidator;
+import org.apache.wicket.validation.validator.RangeValidator;
 
 /**
  * Another page of the stateless example.
@@ -49,7 +49,7 @@ public class StatelessPage extends Wicke
 		add(new BookmarkablePageLink<Void>("indexLink", Index.class));
 		final TextField<Integer> field = new TextField<Integer>("textfield",
 			new PropertyModel<Integer>(this, "number"));
-		field.add(new MaximumValidator<Integer>(20));
+		field.add(new RangeValidator<Integer>(null, 20));
 		field.setRequired(true);
 
 		StatelessForm<?> statelessForm = new StatelessForm<Void>("statelessform")

Modified: wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage1.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage1.java?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage1.java (original)
+++ wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage1.java Thu Nov 17 01:02:40 2011
@@ -23,7 +23,7 @@ import org.apache.wicket.markup.html.for
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 import org.apache.wicket.markup.html.panel.FeedbackPanel;
 import org.apache.wicket.model.PropertyModel;
-import org.apache.wicket.validation.validator.MaximumValidator;
+import org.apache.wicket.validation.validator.RangeValidator;
 
 /**
  * Another page of the stateless example.
@@ -49,7 +49,7 @@ public class StatelessPage1 extends Wick
 		add(new BookmarkablePageLink<Void>("indexLink", Index.class));
 		final TextField<Integer> field = new TextField<Integer>("textfield",
 			new PropertyModel<Integer>(this, "number"));
-		field.add(new MaximumValidator<Integer>(20));
+		field.add(new RangeValidator<Integer>(null, 20));
 		field.setRequired(true);
 
 		StatelessForm<?> statelessForm = new StatelessForm("statelessform")

Modified: wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage2.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage2.java?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage2.java (original)
+++ wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage2.java Thu Nov 17 01:02:40 2011
@@ -23,7 +23,7 @@ import org.apache.wicket.markup.html.for
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 import org.apache.wicket.markup.html.panel.FeedbackPanel;
 import org.apache.wicket.model.PropertyModel;
-import org.apache.wicket.validation.validator.MaximumValidator;
+import org.apache.wicket.validation.validator.RangeValidator;
 
 /**
  * Another page of the stateless example.
@@ -49,7 +49,7 @@ public class StatelessPage2 extends Wick
 		add(new BookmarkablePageLink<Void>("indexLink", Index.class));
 		final TextField<Integer> field = new TextField<Integer>("textfield",
 			new PropertyModel<Integer>(this, "number"));
-		field.add(new MaximumValidator<Integer>(20));
+		field.add(new RangeValidator<Integer>(0, 20));
 		field.setRequired(true);
 
 		StatelessForm<?> statelessForm = new StatelessForm("statelessform")

Modified: wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage3.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage3.java?rev=1202963&r1=1202962&r2=1202963&view=diff
==============================================================================
--- wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage3.java (original)
+++ wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage3.java Thu Nov 17 01:02:40 2011
@@ -23,7 +23,7 @@ import org.apache.wicket.markup.html.for
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 import org.apache.wicket.markup.html.panel.FeedbackPanel;
 import org.apache.wicket.model.PropertyModel;
-import org.apache.wicket.validation.validator.MaximumValidator;
+import org.apache.wicket.validation.validator.RangeValidator;
 
 /**
  * Another page of the stateless example.
@@ -64,7 +64,7 @@ public class StatelessPage3 extends Wick
 		add(new BookmarkablePageLink<Void>("indexLink", Index.class));
 		final TextField<Integer> field = new TextField<Integer>("textfield",
 			new PropertyModel<Integer>(this, "number"));
-		field.add(new MaximumValidator<Integer>(20));
+		field.add(new RangeValidator<Integer>(0, 20));
 		field.setRequired(true);
 
 		StatelessForm<?> statelessForm = new StatelessForm("statelessform")