One thing though. I'm strongly thinking about making
protected String getResourceKey(FormComponent formComponent)
final. This means you can't provide it algoritmicly, but you can call one of
the error methods with the key you want, or you can even implement IValidator
directly.
The reason why I want this, is that otherwise you can set the resourceKey, but
as any subclass can override the method, there is no way it is guaranteed it is
actually used.
Agreed?
Eelco
Eelco Hillenius wrote:
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;
}
}
-------------------------------------------------------
SF.Net email is sponsored by: Discover Easy Linux Migration Strategies
from IBM. Find simple to follow Roadmaps, straightforward articles,
informative Webcasts and more! Get everything you need to get up to
speed, fast. http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click
_______________________________________________
Wicket-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/wicket-user