How does this look (see attachement)?
Eelco
------------------------------------------------------------------------
/*
* $Id: AbstractValidator.java,v 1.27 2005/04/03 16:29:53
jonathanlocke Exp $
* $Revision: 1.27 $ $Date: 2005/04/03 16:29:53 $
* *
==============================================================================
* Licensed 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 wicket.markup.html.form.validation;
import java.util.HashMap;
import java.util.Map;
import wicket.Localizer;
import wicket.markup.html.form.FormComponent;
import wicket.model.IModel;
import wicket.model.Model;
import wicket.util.lang.Classes;
/**
* Base class for form component validators. This class is
thread-safe and therefore it is
* safe to share validators across sessions/threads.
* <p>
* Error messages can be registered on a component by calling one of
the error(FormComponent ...)
* overloads. The error message will be retrieved using the Localizer
for the form
* component. Normally, this localizer will find the error message in
a string resource
* bundle (properties file) associated with the page in which this
validator is contained.
* The key that is used to get the message can be set explicity by
calling setResourceKey.
* If that key is not explicitly set, it default to the pattern:
* <code>[form-name].[component-name].[validator-class]</code>.
* For example:
* <p>
* MyForm.name.RequiredValidator=A name is required.
* <p>
* Error message string resources can contain optional ognl variable
interpolations from
* the component, such as:
* <p>
* editBook.name.LengthValidator='${input}' is too short a name.
* <p>
* Available variables for interpolation are:
* <ul>
* <li>${input} - The user's input</li>
* <li>${name} - The name of the component</li>
* </ul>
* but specific validator subclasses may add more values.
* </p>
* @author Jonathan Locke
* @author Eelco Hillenius
*/
public abstract class AbstractValidator implements IValidator
{
/**
* Any set resource key. When it is not set, the validator uses
it's default
* message key.
*/
private String resourceKey;
/**
* Sets an error on the component being validated using the map
returned by
* messageModel() for variable interpolations.
* <p>
* See class comments for details about how error messages are
loaded and formatted.
* @param formComponent form component
*/
public void error(FormComponent formComponent)
{
error(formComponent, messageModel(formComponent));
}
/**
* Returns a formatted validation error message for a given
component. The error
* message is retrieved from a message bundle associated with the
page in which this
* validator is contained using the given resource key. The
resourceModel is used for
* variable interpolation.
* @param formComponent form component
* @param resourceKey The resource key to use
* @param resourceModel The model for variable interpolation
*/
public void error(FormComponent formComponent, final String
resourceKey,
final IModel resourceModel)
{
// Return formatted error message
Localizer localizer = formComponent.getLocalizer();
String message = localizer.getString(resourceKey,
formComponent, resourceModel);
formComponent.error(message);
}
/**
* Sets an error on the component being validated using the given
map for variable
* interpolations.
* @param formComponent form component
* @param resourceKey The resource key to use
* @param map The model for variable interpolation
*/
public void error(FormComponent formComponent, final String
resourceKey, final Map map)
{
error(formComponent, resourceKey, Model.valueOf(map));
}
/**
* Sets an error on the component being validated using the given
map for variable
* interpolations.
* @param formComponent form component
* @param map The model for variable interpolation
*/
public void error(FormComponent formComponent, final Map map)
{
error(formComponent, getResourceKey(formComponent),
Model.valueOf(map));
}
/**
* Explicitly set the resource key that should be used.
* WARNING: as resourceKey() is overrable, setting this parameter
does not guarantee
* that extending validators honor using it.
* @param resourceKey the resource key
*/
public final void setResourceKey(String resourceKey)
{
this.resourceKey = resourceKey;
}
/**
* Returns the explicitly set resource key or null when it was
not set explicitly.
* @return the explicitly set resource key or null
*/
protected final String getResourceKey()
{
return resourceKey;
}
/**
* Gets the resource key based on the form component.
* If the resource key is set explicitly with setResourceKey,
that is used.
* Otherwise it will default to the form:
* <code>[form-name].[component-name].[validator-class]</code>
* @param formComponent form component
* @return the resource key based on the form component
*/
protected String getResourceKey(FormComponent formComponent)
{
// in case the key was set explicitly
if (resourceKey != null)
{
return resourceKey; // return that
}
// otherwise use a default pattern of form
// <form-id>.<component-name>.<validator-class>
return formComponent.getForm().getId() + "." +
formComponent.getId() + "."
+ Classes.name(getClass());
}
/**
* Gets the default variables for interpolation. These are:
* <ul>
* <li>${input}: the user's input</li>
* <li>${name}: the name of the component</li>
* </ul>
* @param formComponent form component
* @return a map with the variables for interpolation
*/
protected Map messageModel(FormComponent formComponent)
{
final Map resourceModel = new HashMap(4);
resourceModel.put("input", formComponent.getInput());
resourceModel.put("name", formComponent.getId());
return resourceModel;
}
}