FileDocCategorySizeDatePackage
Field.javaAPI DocExample23793Thu Aug 12 08:47:18 BST 2004org.apache.commons.validator

Field

public class Field extends Object implements Serializable, Cloneable
This contains the list of pluggable validators to run on a field and any message information and variables to perform the validations and generate error messages. Instances of this class are configured with a <field> xml element. The use of FastHashMap is deprecated and will be replaced in a future release.
see
org.apache.commons.validator.Form

Fields Summary
private static final String
DEFAULT_ARG
This is the value that will be used as a key if the Arg name field has no value.
public static final String
TOKEN_INDEXED
This indicates an indexed property is being referenced.
protected static final String
TOKEN_START
protected static final String
TOKEN_END
protected static final String
TOKEN_VAR
protected String
property
protected String
indexedProperty
protected String
indexedListProperty
protected String
key
protected String
depends
A comma separated list of validator's this field depends on.
protected int
page
protected int
fieldOrder
private List
dependencyList
Internal representation of this.depends String as a List. This List gets updated whenever setDepends() gets called. This List is synchronized so a call to setDepends() (which clears the List) won't interfere with a call to isDependency().
protected org.apache.commons.collections.FastHashMap
hVars
protected org.apache.commons.collections.FastHashMap
hMsgs
protected Map[]
args
Holds Maps of arguments. args[0] returns the Map for the first replacement argument. Start with a 0 length array so that it will only grow to the size of the highest argument position.
Constructors Summary
Methods Summary
public voidaddArg(Arg arg)
Add an Arg to the replacement argument list.

since
Validator 1.1

        // TODO this first if check can go away after arg0, etc. are removed from dtd
        if (arg == null || arg.getKey() == null || arg.getKey().length() == 0) {
            return;
        }

        this.ensureArgsCapacity(arg);

        Map argMap = this.args[arg.getPosition()];
        if (argMap == null) {
            argMap = new HashMap();
            this.args[arg.getPosition()] = argMap;
        }

        if (arg.getName() == null) {
            argMap.put(DEFAULT_ARG, arg);
        } else {
            argMap.put(arg.getName(), arg);
        }

    
public voidaddMsg(Msg msg)
Add a Msg to the Field.

        hMsgs.put(msg.getName(), msg.getKey());
    
public voidaddVar(Var v)
Add a Var to the Field.

        this.hVars.put(v.getName(), v);
    
public voidaddVar(java.lang.String name, java.lang.String value, java.lang.String jsType)
Add a Var, based on the values passed in, to the Field.

param
name
param
value
param
jsType

        this.addVar(new Var(name, value, jsType));
    
public java.lang.Objectclone()
Creates and returns a copy of this object.

        Field field = null;
        try {
            field = (Field) super.clone();
        } catch(CloneNotSupportedException e) {
            throw new RuntimeException(e.toString());
        }

        field.args = new Map[this.args.length];
        for (int i = 0; i < this.args.length; i++) {
            if (this.args[i] == null) {
                continue;
            }

            Map argMap = new HashMap(this.args[i]);
            Iterator iter = argMap.keySet().iterator();
            while (iter.hasNext()) {
                String validatorName = (String) iter.next();
                Arg arg = (Arg) argMap.get(validatorName);
                argMap.put(validatorName, arg.clone());
            }
            field.args[i] = argMap;
        }

        field.hVars = ValidatorUtils.copyFastHashMap(hVars);
        field.hMsgs = ValidatorUtils.copyFastHashMap(hMsgs);

        return field;
    
private voidensureArgsCapacity(Arg arg)
Ensures that the args array can hold the given arg. Resizes the array as necessary.

param
arg Determine if the args array is long enough to store this arg's position.

        if (arg.getPosition() >= this.args.length) {
            Map[] newArgs = new Map[arg.getPosition() + 1];
            System.arraycopy(this.args, 0, newArgs, 0, this.args.length);
            this.args = newArgs;
        }
    
public voidgenerateKey()
Generate correct key value.

        if (this.isIndexed()) {
            this.key = this.indexedListProperty + TOKEN_INDEXED + "." + this.property;
        } else {
            this.key = this.property;
        }
    
public ArggetArg(int position)
Gets the default Arg object at the given position.

return
The default Arg or null if not found.
since
Validator 1.1

        return this.getArg(DEFAULT_ARG, position);
    
public ArggetArg(java.lang.String key, int position)
Gets the Arg object at the given position. If the key finds a null value then the default value will be retrieved.

param
key The name the Arg is stored under. If not found, the default Arg for the given position (if any) will be retrieved.
param
position The Arg number to find.
return
The Arg with the given name and position or null if not found.
since
Validator 1.1

        if ((position >= this.args.length) || (this.args[position] == null)) {
            return null;
        }

        Arg arg = (Arg) args[position].get(key);

        // Didn't find default arg so exit, otherwise we would get into 
        // infinite recursion
        if ((arg == null) && key.equals(DEFAULT_ARG)) {
            return null;
        }

        return (arg == null) ? this.getArg(position) : arg;
    
public Arg[]getArgs(java.lang.String key)
Retrieves the Args for the given validator name.

param
key The validator's args to retrieve.
return
An Arg[] sorted by the Args' positions (i.e. the Arg at index 0 has a position of 0).
since
Validator 1.1.1

        Arg[] args = new Arg[this.args.length];
        
        for (int i = 0; i < this.args.length; i++) {
          args[i] = this.getArg(key, i);    
        }
        
        return args;
    
public java.util.ListgetDependencyList()
Gets an unmodifiable List of the dependencies in the same order they were defined in parameter passed to the setDepends() method.

        return Collections.unmodifiableList(this.dependencyList);
    
public java.lang.StringgetDepends()
Gets the validation rules for this field as a comma separated list.

        return this.depends;
    
public intgetFieldOrder()
Gets the position of the Field in the validation list.

        return this.fieldOrder;
    
public java.lang.StringgetIndexedListProperty()
Gets the indexed property name of the field. This is the method name that will return an array or a Collection used to retrieve the list and then loop through the list performing the specified validations.

        return this.indexedListProperty;
    
java.lang.Object[]getIndexedProperty(java.lang.Object bean)
Returns an indexed property from the object we're validating.

param
bean The bean to extract the indexed values from.
throws
ValidatorException If there's an error looking up the property or, the property found is not indexed.

        Object indexedProperty = null;

        try {
            indexedProperty =
                PropertyUtils.getProperty(bean, this.getIndexedListProperty());

        } catch(IllegalAccessException e) {
            throw new ValidatorException(e.getMessage());
        } catch(InvocationTargetException e) {
            throw new ValidatorException(e.getMessage());
        } catch(NoSuchMethodException e) {
            throw new ValidatorException(e.getMessage());
        }

        if (indexedProperty instanceof Collection) {
            return ((Collection) indexedProperty).toArray();

        } else if (indexedProperty.getClass().isArray()) {
            return (Object[]) indexedProperty;

        } else {
            throw new ValidatorException(this.getKey() + " is not indexed");
        }

    
public java.lang.StringgetIndexedProperty()
Gets the indexed property name of the field. This is the method name that can take an int as a parameter for indexed property value retrieval.

        return this.indexedProperty;
    
public java.lang.StringgetKey()
Gets a unique key based on the property and indexedProperty fields.

        if (this.key == null) {
            this.generateKey();
        }

        return this.key;
    
public java.lang.StringgetMsg(java.lang.String key)
Retrieve a message value.

        return (String) hMsgs.get(key);
    
public intgetPage()
Gets the page value that the Field is associated with for validation.


                     
       
        return this.page;
    
public java.lang.StringgetProperty()
Gets the property name of the field.

        return this.property;
    
public VargetVar(java.lang.String mainKey)
Retrieve a variable.

param
mainKey

        return (Var) hVars.get(mainKey);
    
public java.lang.StringgetVarValue(java.lang.String mainKey)
Retrieve a variable's value.

param
mainKey

        String value = null;

        Object o = hVars.get(mainKey);
        if (o != null && o instanceof Var) {
            Var v = (Var) o;
            value = v.getValue();
        }

        return value;
    
public java.util.MapgetVars()
The Field's variables are returned as an unmodifiable Map.

        return Collections.unmodifiableMap(hVars);
    
private voidhandleMissingAction(java.lang.String name)
Called when a validator name is used in a depends clause but there is no know ValidatorAction configured for that name.

param
name The name of the validator in the depends list.
throws
ValidatorException

        throw new ValidatorException(
            "No ValidatorAction named "
                + name
                + " found for field "
                + this.getProperty());
    
public booleanisDependency(java.lang.String validatorName)
Checks if the validator is listed as a dependency.

        return this.dependencyList.contains(validatorName);
    
public booleanisIndexed()
If there is a value specified for the indexedProperty field then true will be returned. Otherwise it will be false.

        return ((indexedListProperty != null && indexedListProperty.length() > 0));
    
voidprocess(java.util.Map globalConstants, java.util.Map constants)
Replace constants with values in fields and process the depends field to create the dependency Map.

        this.hMsgs.setFast(false);
        this.hVars.setFast(true);

        this.generateKey();

        // Process FormSet Constants
        for (Iterator i = constants.keySet().iterator(); i.hasNext();) {
            String key = (String) i.next();
            String key2 = TOKEN_START + key + TOKEN_END;
            String replaceValue = (String) constants.get(key);

            property = ValidatorUtils.replace(property, key2, replaceValue);

            processVars(key2, replaceValue);

            this.processMessageComponents(key2, replaceValue);
        }

        // Process Global Constants
        for (Iterator i = globalConstants.keySet().iterator(); i.hasNext();) {
            String key = (String) i.next();
            String key2 = TOKEN_START + key + TOKEN_END;
            String replaceValue = (String) globalConstants.get(key);

            property = ValidatorUtils.replace(property, key2, replaceValue);

            processVars(key2, replaceValue);

            this.processMessageComponents(key2, replaceValue);
        }

        // Process Var Constant Replacement
        for (Iterator i = hVars.keySet().iterator(); i.hasNext();) {
            String key = (String) i.next();
            String key2 = TOKEN_START + TOKEN_VAR + key + TOKEN_END;
            Var var = this.getVar(key);
            String replaceValue = var.getValue();

            this.processMessageComponents(key2, replaceValue);
        }

        hMsgs.setFast(true);
    
private voidprocessArg(java.lang.String key, java.lang.String replaceValue)
Replace the arg Collection key value with the key/value pairs passed in.

        for (int i = 0; i < this.args.length; i++) {

            Map argMap = this.args[i];
            if (argMap == null) {
                continue;
            }

            Iterator iter = argMap.values().iterator();
            while (iter.hasNext()) {
                Arg arg = (Arg) iter.next();

                if (arg != null) {
                    arg.setKey(
                            ValidatorUtils.replace(arg.getKey(), key, replaceValue));
                }
            }
        }
    
private voidprocessMessageComponents(java.lang.String key, java.lang.String replaceValue)
Replace the args key value with the key/value pairs passed in.

        String varKey = TOKEN_START + TOKEN_VAR;
        // Process Messages
        if (key != null && !key.startsWith(varKey)) {
            for (Iterator i = hMsgs.keySet().iterator(); i.hasNext();) {
                String msgKey = (String) i.next();
                String value = this.getMsg(msgKey);

                hMsgs.put(msgKey, ValidatorUtils.replace(value, key, replaceValue));
            }
        }

        this.processArg(key, replaceValue);
    
private voidprocessVars(java.lang.String key, java.lang.String replaceValue)
Replace the vars value with the key/value pairs passed in.

        Iterator i = this.hVars.keySet().iterator();
        while (i.hasNext()) {
            String varKey = (String) i.next();
            Var var = this.getVar(varKey);

            var.setValue(ValidatorUtils.replace(var.getValue(), key, replaceValue));
        }

    
private booleanrunDependentValidators(ValidatorAction va, ValidatorResults results, java.util.Map actions, java.util.Map params, int pos)
Calls all of the validators that this validator depends on. TODO ValidatorAction should know how to run its own dependencies.

param
va Run dependent validators for this action.
param
results
param
actions
param
pos
return
true if all of the dependent validations passed.
throws
ValidatorException


        List dependentValidators = va.getDependencyList();

        if (dependentValidators.isEmpty()) {
            return true;
        }

        Iterator iter = dependentValidators.iterator();
        while (iter.hasNext()) {
            String depend = (String) iter.next();

            ValidatorAction action = (ValidatorAction) actions.get(depend);
            if (action == null) {
                this.handleMissingAction(depend);
            }

            if (!this.validateForRule(action, results, actions, params, pos)) {
                return false;
            }
        }

        return true;
    
public voidsetDepends(java.lang.String depends)
Sets the validation rules for this field as a comma separated list.

param
depends A comma separated list of validator names.

        this.depends = depends;

        this.dependencyList.clear();

        StringTokenizer st = new StringTokenizer(depends, ",");
        while (st.hasMoreTokens()) {
            String depend = st.nextToken().trim();

            if (depend != null && depend.length() > 0) {
                this.dependencyList.add(depend);
            }
        }
    
public voidsetFieldOrder(int fieldOrder)
Sets the position of the Field in the validation list.

        this.fieldOrder = fieldOrder;
    
public voidsetIndexedListProperty(java.lang.String indexedListProperty)
Sets the indexed property name of the field.

        this.indexedListProperty = indexedListProperty;
    
public voidsetIndexedProperty(java.lang.String indexedProperty)
Sets the indexed property name of the field.

        this.indexedProperty = indexedProperty;
    
public voidsetKey(java.lang.String key)
Sets a unique key for the field. This can be used to change the key temporarily to have a unique key for an indexed field.

param
key

        this.key = key;
    
public voidsetPage(int page)
Sets the page value that the Field is associated with for validation.

        this.page = page;
    
public voidsetProperty(java.lang.String property)
Sets the property name of the field.

        this.property = property;
    
public java.lang.StringtoString()
Returns a string representation of the object.

        StringBuffer results = new StringBuffer();

        results.append("\t\tkey = " + key + "\n");
        results.append("\t\tproperty = " + property + "\n");
        results.append("\t\tindexedProperty = " + indexedProperty + "\n");
        results.append("\t\tindexedListProperty = " + indexedListProperty + "\n");
        results.append("\t\tdepends = " + depends + "\n");
        results.append("\t\tpage = " + page + "\n");
        results.append("\t\tfieldOrder = " + fieldOrder + "\n");

        if (hVars != null) {
            results.append("\t\tVars:\n");
            for (Iterator i = hVars.keySet().iterator(); i.hasNext();) {
                Object key = i.next();
                results.append("\t\t\t");
                results.append(key);
                results.append("=");
                results.append(hVars.get(key));
                results.append("\n");
            }
        }

        return results.toString();
    
ValidatorResultsvalidate(java.util.Map params, java.util.Map actions)
Run the configured validations on this field. Run all validations in the depends clause over each item in turn, returning when the first one fails.

param
params A Map of parameter class names to parameter values to pass into validation methods.
param
actions A Map of validator names to ValidatorAction objects.
return
A ValidatorResults object containing validation messages for this field.

        
        if (this.getDepends() == null) {
            return new ValidatorResults();
        }

        ValidatorResults allResults = new ValidatorResults();

        Object bean = params.get(Validator.BEAN_PARAM);
        int numberOfFieldsToValidate =
            this.isIndexed() ? this.getIndexedProperty(bean).length : 1;

        for (int fieldNumber = 0; fieldNumber < numberOfFieldsToValidate; fieldNumber++) {
            
            Iterator dependencies = this.dependencyList.iterator();
            while (dependencies.hasNext()) {
                String depend = (String) dependencies.next();

                ValidatorAction action = (ValidatorAction) actions.get(depend);
                if (action == null) {
                    this.handleMissingAction(depend);
                }

                ValidatorResults results = new ValidatorResults();
                boolean good =
                    validateForRule(action, results, actions, params, fieldNumber);

                allResults.merge(results);

                if (!good && numberOfFieldsToValidate <= 1) {
                    return allResults;
                }
            }
        }
        
        return allResults;
    
private booleanvalidateForRule(ValidatorAction va, ValidatorResults results, java.util.Map actions, java.util.Map params, int pos)
Executes the given ValidatorAction and all ValidatorActions that it depends on.

return
true if the validation succeeded.


        ValidatorResult result = results.getValidatorResult(this.getKey());
        if (result != null && result.containsAction(va.getName())) {
            return result.isValid(va.getName());
        }

        if (!this.runDependentValidators(va, results, actions, params, pos)) {
            return false;
        }

        return va.executeValidationMethod(this, params, results, pos);