Class ValidatorAction

  • All Implemented Interfaces:
    java.io.Serializable

    public class ValidatorAction
    extends java.lang.Object
    implements java.io.Serializable
    Contains the information to dynamically create and run a validation method. This is the class representation of a pluggable validator that can be defined in an xml file with the <validator> element. Note: The validation method is assumed to be thread safe.
    Version:
    $Revision: 1713331 $
    See Also:
    Serialized Form
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private java.lang.String classname
      The full class name of the class containing the validation method associated with this action.
      private java.util.List<java.lang.String> dependencyList
      An internal List representation of the other ValidatorActions this one depends on (if any).
      private java.lang.String depends
      The other ValidatorActions that this one depends on.
      private java.lang.Object instance
      If the java method matching the correct signature isn't static, the instance is stored in the action.
      private java.lang.String javascript
      An optional field to containing a JavaScript representation of the java method assocated with this action.
      private java.lang.String jsFunction
      An optional field to contain the class path to be used to retrieve the JavaScript function.
      private java.lang.String jsFunctionName
      An optional field to contain the name to be used if JavaScript is generated.
      private org.apache.commons.logging.Log log
      Logger.
      private java.lang.String method
      The full method name of the validation to be performed.
      private java.util.List<java.lang.String> methodParameterList
      An internal List representation of all the validation method's parameters defined in the methodParams String.
      private java.lang.String methodParams
      The method signature of the validation method.
      private java.lang.String msg
      The default error message associated with this action.
      private java.lang.String name
      The name of the validation.
      private java.lang.Class<?>[] parameterClasses
      The Class objects for each entry in methodParameterList.
      private static long serialVersionUID  
      private java.lang.Class<?> validationClass
      The Class object loaded from the classname.
      private java.lang.reflect.Method validationMethod
      The Method object loaded from the method name.
    • Constructor Summary

      Constructors 
      Constructor Description
      ValidatorAction()  
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      (package private) boolean executeValidationMethod​(Field field, java.util.Map<java.lang.String,​java.lang.Object> params, ValidatorResults results, int pos)
      Dynamically runs the validation method for this validator and returns true if the data is valid.
      private java.lang.String formatJavascriptFileName()  
      private java.lang.String generateJsFunction()
      Used to generate the javascript name when it is not specified.
      private java.lang.ClassLoader getClassLoader​(java.util.Map<java.lang.String,​java.lang.Object> params)
      Returns the ClassLoader set in the Validator contained in the parameter Map.
      java.lang.String getClassname()
      Gets the class of the validator action.
      java.util.List<java.lang.String> getDependencyList()
      Returns the dependent validator names as an unmodifiable List.
      java.lang.String getDepends()
      Gets the dependencies of the validator action as a comma separated list of validator names.
      java.lang.String getJavascript()
      Gets the Javascript equivalent of the java class and method associated with this action.
      java.lang.String getJsFunctionName()
      Gets the Javascript function name.
      private org.apache.commons.logging.Log getLog()
      Accessor method for Log instance.
      java.lang.String getMethod()
      Gets the name of method being called for the validator action.
      java.lang.String getMethodParams()
      Gets the method parameters for the method.
      java.lang.String getMsg()
      Gets the message associated with the validator action.
      java.lang.String getName()
      Gets the name of the validator action.
      private java.lang.Object[] getParameterValues​(java.util.Map<java.lang.String,​? super java.lang.Object> params)
      Converts a List of parameter class names into their values contained in the parameters Map.
      private java.lang.Object getValidationClassInstance()
      Return an instance of the validation class or null if the validation method is static so does not require an instance to be executed.
      private void handleIndexedField​(Field field, int pos, java.lang.Object[] paramValues)
      Modifies the paramValue array with indexed fields.
      protected void init()
      Initialize based on set.
      boolean isDependency​(java.lang.String validatorName)
      Checks whether or not the value passed in is in the depends field.
      private boolean isValid​(java.lang.Object result)
      If the result object is a Boolean, it will return its value.
      private boolean javascriptAlreadyLoaded()  
      protected void loadJavascriptFunction()
      Load the javascript function specified by the given path.
      private void loadParameterClasses​(java.lang.ClassLoader loader)
      Converts a List of parameter class names into their Class objects.
      private void loadValidationClass​(java.lang.ClassLoader loader)
      Load the Class object for the configured validation class name.
      private void loadValidationMethod()
      Load the Method object for the configured validation method name.
      private boolean onlyReturnErrors​(java.util.Map<java.lang.String,​java.lang.Object> params)
      Returns the onlyReturnErrors setting in the Validator contained in the parameter Map.
      private java.lang.String readJavascriptFile​(java.lang.String javascriptFileName)
      Read a javascript function from a file.
      void setClassname​(java.lang.String classname)
      Sets the class of the validator action.
      void setDepends​(java.lang.String depends)
      Sets the dependencies of the validator action.
      void setJavascript​(java.lang.String javascript)
      Sets the Javascript equivalent of the java class and method associated with this action.
      void setJsFunction​(java.lang.String jsFunction)
      Sets the fully qualified class path of the Javascript function.
      void setJsFunctionName​(java.lang.String jsFunctionName)
      Sets the Javascript function name.
      void setMethod​(java.lang.String method)
      Sets the name of method being called for the validator action.
      void setMethodParams​(java.lang.String methodParams)
      Sets the method parameters for the method.
      void setMsg​(java.lang.String msg)
      Sets the message associated with the validator action.
      void setName​(java.lang.String name)
      Sets the name of the validator action.
      java.lang.String toString()
      Returns a string representation of the object.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
    • Field Detail

      • log

        private transient org.apache.commons.logging.Log log
        Logger.
      • name

        private java.lang.String name
        The name of the validation.
      • classname

        private java.lang.String classname
        The full class name of the class containing the validation method associated with this action.
      • validationClass

        private java.lang.Class<?> validationClass
        The Class object loaded from the classname.
      • method

        private java.lang.String method
        The full method name of the validation to be performed. The method must be thread safe.
      • validationMethod

        private java.lang.reflect.Method validationMethod
        The Method object loaded from the method name.
      • methodParams

        private java.lang.String methodParams

        The method signature of the validation method. This should be a comma delimited list of the full class names of each parameter in the correct order that the method takes.

        Note: java.lang.Object is reserved for the JavaBean that is being validated. The ValidatorAction and Field that are associated with a field's validation will automatically be populated if they are specified in the method signature.

      • parameterClasses

        private java.lang.Class<?>[] parameterClasses
        The Class objects for each entry in methodParameterList.
      • depends

        private java.lang.String depends
        The other ValidatorActions that this one depends on. If any errors occur in an action that this one depends on, this action will not be processsed.
      • msg

        private java.lang.String msg
        The default error message associated with this action.
      • jsFunctionName

        private java.lang.String jsFunctionName
        An optional field to contain the name to be used if JavaScript is generated.
      • jsFunction

        private java.lang.String jsFunction
        An optional field to contain the class path to be used to retrieve the JavaScript function.
      • javascript

        private java.lang.String javascript
        An optional field to containing a JavaScript representation of the java method assocated with this action.
      • instance

        private java.lang.Object instance
        If the java method matching the correct signature isn't static, the instance is stored in the action. This assumes the method is thread safe.
      • dependencyList

        private final java.util.List<java.lang.String> dependencyList
        An internal List representation of the other ValidatorActions this one depends on (if any). This List gets updated whenever setDepends() gets called. This is synchronized so a call to setDepends() (which clears the List) won't interfere with a call to isDependency().
      • methodParameterList

        private final java.util.List<java.lang.String> methodParameterList
        An internal List representation of all the validation method's parameters defined in the methodParams String.
    • Constructor Detail

      • ValidatorAction

        public ValidatorAction()
    • Method Detail

      • getName

        public java.lang.String getName()
        Gets the name of the validator action.
        Returns:
        Validator Action name.
      • setName

        public void setName​(java.lang.String name)
        Sets the name of the validator action.
        Parameters:
        name - Validator Action name.
      • getClassname

        public java.lang.String getClassname()
        Gets the class of the validator action.
        Returns:
        Class name of the validator Action.
      • setClassname

        public void setClassname​(java.lang.String classname)
        Sets the class of the validator action.
        Parameters:
        classname - Class name of the validator Action.
      • getMethod

        public java.lang.String getMethod()
        Gets the name of method being called for the validator action.
        Returns:
        The method name.
      • setMethod

        public void setMethod​(java.lang.String method)
        Sets the name of method being called for the validator action.
        Parameters:
        method - The method name.
      • getMethodParams

        public java.lang.String getMethodParams()
        Gets the method parameters for the method.
        Returns:
        Method's parameters.
      • setMethodParams

        public void setMethodParams​(java.lang.String methodParams)
        Sets the method parameters for the method.
        Parameters:
        methodParams - A comma separated list of parameters.
      • getDepends

        public java.lang.String getDepends()
        Gets the dependencies of the validator action as a comma separated list of validator names.
        Returns:
        The validator action's dependencies.
      • setDepends

        public void setDepends​(java.lang.String depends)
        Sets the dependencies of the validator action.
        Parameters:
        depends - A comma separated list of validator names.
      • getMsg

        public java.lang.String getMsg()
        Gets the message associated with the validator action.
        Returns:
        The message for the validator action.
      • setMsg

        public void setMsg​(java.lang.String msg)
        Sets the message associated with the validator action.
        Parameters:
        msg - The message for the validator action.
      • getJsFunctionName

        public java.lang.String getJsFunctionName()
        Gets the Javascript function name. This is optional and can be used instead of validator action name for the name of the Javascript function/object.
        Returns:
        The Javascript function name.
      • setJsFunctionName

        public void setJsFunctionName​(java.lang.String jsFunctionName)
        Sets the Javascript function name. This is optional and can be used instead of validator action name for the name of the Javascript function/object.
        Parameters:
        jsFunctionName - The Javascript function name.
      • setJsFunction

        public void setJsFunction​(java.lang.String jsFunction)
        Sets the fully qualified class path of the Javascript function.

        This is optional and can be used instead of the setJavascript(). Attempting to call both setJsFunction and setJavascript will result in an IllegalStateException being thrown.

        If neither setJsFunction or setJavascript is set then validator will attempt to load the default javascript definition.

         Examples
           If in the validator.xml :
         #1:
              <validator name="tire"
                    jsFunction="com.yourcompany.project.tireFuncion">
             Validator will attempt to load com.yourcompany.project.validateTireFunction.js from
             its class path.
         #2:
            <validator name="tire">
              Validator will use the name attribute to try and load
                 org.apache.commons.validator.javascript.validateTire.js
              which is the default javascript definition.
         
        Parameters:
        jsFunction - The Javascript function's fully qualified class path.
      • getJavascript

        public java.lang.String getJavascript()
        Gets the Javascript equivalent of the java class and method associated with this action.
        Returns:
        The Javascript validation.
      • setJavascript

        public void setJavascript​(java.lang.String javascript)
        Sets the Javascript equivalent of the java class and method associated with this action.
        Parameters:
        javascript - The Javascript validation.
      • init

        protected void init()
        Initialize based on set.
      • loadJavascriptFunction

        protected void loadJavascriptFunction()
        Load the javascript function specified by the given path. For this implementation, the jsFunction property should contain a fully qualified package and script name, separated by periods, to be loaded from the class loader that created this instance. TODO if the path begins with a '/' the path will be intepreted as absolute, and remain unchanged. If this fails then it will attempt to treat the path as a file path. It is assumed the script ends with a '.js'.
      • readJavascriptFile

        private java.lang.String readJavascriptFile​(java.lang.String javascriptFileName)
        Read a javascript function from a file.
        Parameters:
        javascriptFileName - The file containing the javascript.
        Returns:
        The javascript function or null if it could not be loaded.
      • formatJavascriptFileName

        private java.lang.String formatJavascriptFileName()
        Returns:
        A filename suitable for passing to a ClassLoader.getResourceAsStream() method.
      • javascriptAlreadyLoaded

        private boolean javascriptAlreadyLoaded()
        Returns:
        true if the javascript for this action has already been loaded.
      • generateJsFunction

        private java.lang.String generateJsFunction()
        Used to generate the javascript name when it is not specified.
      • isDependency

        public boolean isDependency​(java.lang.String validatorName)
        Checks whether or not the value passed in is in the depends field.
        Parameters:
        validatorName - Name of the dependency to check.
        Returns:
        Whether the named validator is a dependant.
      • getDependencyList

        public java.util.List<java.lang.String> getDependencyList()
        Returns the dependent validator names as an unmodifiable List.
        Returns:
        List of the validator action's depedents.
      • toString

        public java.lang.String toString()
        Returns a string representation of the object.
        Overrides:
        toString in class java.lang.Object
        Returns:
        a string representation.
      • executeValidationMethod

        boolean executeValidationMethod​(Field field,
                                        java.util.Map<java.lang.String,​java.lang.Object> params,
                                        ValidatorResults results,
                                        int pos)
                                 throws ValidatorException
        Dynamically runs the validation method for this validator and returns true if the data is valid.
        Parameters:
        field -
        params - A Map of class names to parameter values.
        results -
        pos - The index of the list property to validate if it's indexed.
        Throws:
        ValidatorException
      • loadValidationClass

        private void loadValidationClass​(java.lang.ClassLoader loader)
                                  throws ValidatorException
        Load the Class object for the configured validation class name.
        Parameters:
        loader - The ClassLoader used to load the Class object.
        Throws:
        ValidatorException
      • loadParameterClasses

        private void loadParameterClasses​(java.lang.ClassLoader loader)
                                   throws ValidatorException
        Converts a List of parameter class names into their Class objects. Stores the output in parameterClasses. This array is in the same order as the given List and is suitable for passing to the validation method.
        Throws:
        ValidatorException - if a class cannot be loaded.
      • getParameterValues

        private java.lang.Object[] getParameterValues​(java.util.Map<java.lang.String,​? super java.lang.Object> params)
        Converts a List of parameter class names into their values contained in the parameters Map.
        Parameters:
        params - A Map of class names to parameter values.
        Returns:
        An array containing the value object for each parameter. This array is in the same order as the given List and is suitable for passing to the validation method.
      • getValidationClassInstance

        private java.lang.Object getValidationClassInstance()
                                                     throws ValidatorException
        Return an instance of the validation class or null if the validation method is static so does not require an instance to be executed.
        Throws:
        ValidatorException
      • handleIndexedField

        private void handleIndexedField​(Field field,
                                        int pos,
                                        java.lang.Object[] paramValues)
                                 throws ValidatorException
        Modifies the paramValue array with indexed fields.
        Parameters:
        field -
        pos -
        paramValues -
        Throws:
        ValidatorException
      • isValid

        private boolean isValid​(java.lang.Object result)
        If the result object is a Boolean, it will return its value. If not it will return false if the object is null and true if it isn't.
      • getClassLoader

        private java.lang.ClassLoader getClassLoader​(java.util.Map<java.lang.String,​java.lang.Object> params)
        Returns the ClassLoader set in the Validator contained in the parameter Map.
      • onlyReturnErrors

        private boolean onlyReturnErrors​(java.util.Map<java.lang.String,​java.lang.Object> params)
        Returns the onlyReturnErrors setting in the Validator contained in the parameter Map.
      • getLog

        private org.apache.commons.logging.Log getLog()
        Accessor method for Log instance. The Log instance variable is transient and accessing it through this method ensures it is re-initialized when this instance is de-serialized.
        Returns:
        The Log instance.