001// Licensed under the Apache License, Version 2.0 (the "License");
002// you may not use this file except in compliance with the License.
003// You may obtain a copy of the License at
004//
005// http://www.apache.org/licenses/LICENSE-2.0
006//
007// Unless required by applicable law or agreed to in writing, software
008// distributed under the License is distributed on an "AS IS" BASIS,
009// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
010// See the License for the specific language governing permissions and
011// limitations under the License.
012
013package org.apache.tapestry5.services;
014
015import org.apache.tapestry5.Field;
016import org.apache.tapestry5.FieldValidator;
017import org.apache.tapestry5.Validator;
018import org.apache.tapestry5.corelib.components.BeanEditForm;
019import org.apache.tapestry5.ioc.Messages;
020import org.apache.tapestry5.ioc.annotations.UsesMappedConfiguration;
021
022import java.util.Locale;
023
024/**
025 * Used to create {@link org.apache.tapestry5.FieldValidator}s for a particular {@link org.apache.tapestry5.Field}
026 * component.
027 */
028@UsesMappedConfiguration(Validator.class)
029public interface FieldValidatorSource
030{
031    /**
032     * Creates the validator. The error message associated with the field validator usually comes from the
033     * global message catalog (using the validator's {@link Validator#getMessageKey() message key}). However,
034     * if the container component of the field defines a message key <code><i>id</i>-<i>validator</i></code> (where id is the simple
035     * id of the field component, and validator is the validatorType), then that message is used instead. This allows
036     * you to override the message for a particular validation of a particular field.
037     * 
038     * @param field
039     *            the field for which a validator is to be created
040     * @param validatorType
041     *            used to select the {@link org.apache.tapestry5.Validator} that forms the core of the
042     *            {@link org.apache.tapestry5.FieldValidator}
043     * @param constraintValue
044     *            a value used to configure the validator, or null if the validator is not configurarable
045     * @return the field validator for the field
046     */
047    FieldValidator createValidator(Field field, String validatorType, String constraintValue);
048
049    /**
050     * Full featured version of {@link #createValidator(Field, String, String)} used in situations where the container
051     * of the field is not necessarily the place to look for override messages, and the id of the field is not the key
052     * to use when checking. The {@link BeanEditForm} is an example of this.
053     * 
054     * @param field
055     *            the field for which a validator is to be created
056     * @param validatorType
057     *            used to select the {@link org.apache.tapestry5.Validator} that forms the core of the
058     *            {@link org.apache.tapestry5.FieldValidator}
059     * @param constraintValue
060     *            a value used to configure the validator, or null if the validator is not configurable
061     * @param overrideId
062     *            the base id used when searching for validator message overrides (this would normally be
063     *            the field component's simple id)
064     * @param overrideMessages
065     *            the message catalog to search for override messages (this would normally be the catalog
066     *            for the container of the field component)
067     * @param locale
068     *            ignored, starting in 5.3 (it is allowed to pass null). Locale was needed in release 5.2 and earlier.
069     * @return the field validator for the field
070     */
071    FieldValidator createValidator(Field field, String validatorType, String constraintValue, String overrideId,
072            Messages overrideMessages, Locale locale);
073
074    /**
075     * Creates a set of validators. The specification is a string used to identify and configure the individual
076     * validators. The specification is a comma-separated list of terms. Each term is a validator type name and an
077     * optional constraint value (separated by an equals sign).
078     * 
079     * @param field
080     * @param specification
081     * @return a composite field validator
082     */
083    FieldValidator createValidators(Field field, String specification);
084}