hi,

I'm trying to use the (not Struts) Commons Validator for a standalone application uploading a data file to a database, which needs to validate the data coming in.

Each field may have a number of Validators run on it, and I want to run all of them, rather than 'short circuiting' when one fails, or setting up dependency chains.

The problem I'm having is that I can't get all the Validators to run. When I get the ValidatorResult for a field, e.g. result.containsAction("validatorName") returns false even for validations I know have run.


My Code:

I'm basing my code on the sample chapter of Manning's 'Jakarta Commons' online bookshelf, featured on www.theserverside.com

The 'star' Validator here isn't useful - it's here to demonstrate the point.

simplevalidation.xml:

<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.2.0//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_2_0.dtd";>
<form-validation>


 <global>
    <validator
      name="required"
      classname="org.youthnet.ben.ValidatorWrapper"
      method="doRequired"
      methodParams="java.lang.Object, org.apache.commons.validator.Field"
      msg=""/>
   <validator
      name="maxlength"
      classname="org.youthnet.ben.ValidatorWrapper"
      method="doMaxlength"
      methodParams="java.lang.Object, org.apache.commons.validator.Field"
      msg=""/>
    <validator
      name="star"
      classname="org.youthnet.ben.ValidatorWrapper"
      method="doContainsStar"
      methodParams="java.lang.Object, org.apache.commons.validator.Field"
      msg=""/>
  </global>

  <formset>
    <form name="simpleform">
      <field property="title" depends="required,maxlength,star">
        <var>
          <var-name>mlength</var-name>
          <var-value>20</var-value>
        </var>
      </field>
    </form>
  </formset>

</form-validation>

~~~~

ValidatorWrapper.java:


package org.youthnet.ben;

import org.apache.commons.validator.Field;
import org.apache.commons.validator.GenericValidator;
import org.apache.commons.validator.util.ValidatorUtils;


public class ValidatorWrapper {

public static Boolean doRequired(Object bean, Field field)
{
System.out.println("in required");
String value = ValidatorUtils.getValueAsString(bean, field.getProperty());
return Boolean.valueOf(!GenericValidator.isBlankOrNull(value));
}


public static Boolean doMaxlength(Object bean, Field field)
{
System.out.println("in maxlength");
Integer maxLength = Integer.decode(field.getVarValue("mlength"));
String value = ValidatorUtils.getValueAsString(bean, field.getProperty());
return Boolean.valueOf(GenericValidator.maxLength(value, maxLength.intValue()));
}


public static Boolean doContainsStar(Object bean, Field field)
{
System.out.println("in star");
String val = ValidatorUtils.getValueAsString(bean, field.getProperty());
boolean returnVal = (val.indexOf('*') == -1) ? false : true;
return Boolean.valueOf(!returnVal);
}
}



~~~

ValidatorSimple.java:


package org.youthnet.ben;

import java.io.FileInputStream;
import org.apache.commons.validator.Validator;
import org.apache.commons.validator.ValidatorResources;
import org.apache.commons.validator.ValidatorResult;
import org.apache.commons.validator.ValidatorResults;

public class ValidatorSimple {

    public static void main(String[] args) throws Exception
    {
        // load targeted rules
        ValidatorResources resources = new ValidatorResources(
                new FileInputStream("validatorsimple.xml"));

        // accept user data
        Object userData = simulateUserData();

        // create new Validator instance
        Validator validator = new Validator(resources, "simpleform");
        validator.setParameter(Validator.BEAN_PARAM, userData);

        // perform validation
        ValidatorResults results = validator.validate();

// return results for the field
ValidatorResult result1 = results.getValidatorResult("title");
System.out.println("Contains required: "+result1.containsAction("required"));
System.out.println("required passed: "+result1.isValid("required"));
System.out.println("Contains maxlength: "+result1.containsAction("maxlength"));
System.out.println("maxlength passed: "+result1.isValid("maxlength"));
System.out.println("Contains star: "+result1.containsAction("star"));
System.out.println("star passed: "+result1.isValid("star"));
}


    private static Object simulateUserData()
    {
        VacancyBean vac = new VacancyBean();
        vac.setTitle("Test Vacancy");
        return vac;
    }

}

~~

VacancyBean.java just contains one String field, title, with a getter & setter.

~~

running ValidatorSimple gives the following output:

in required
in maxlength
in star
Contains required: false
required passed: false
Contains maxlength: false
maxlength passed: false
Contains star: true
star passed: false


so, all three Validators run, but only the last one is held in the results, using ValidatorResult.containsAction(String name)
I would expect it to contain all three actions, with 'required' and 'maxlength' true, and 'star' false.



I have been able to get more than one hAction in the the ValidatorResult for the key 'title' by using dependencies, e.g. if I add the attribute
depends="required,maxlength"
in the global declaration for the Validator, then all three validations are held in the ValidatorResult.


But if any validations fail, the others are short circuited.

The behaviour I want is the the validations are not dependent on each other, and I can get results for any combinations of Validations on a field.


Can anyone help? Thanks in advance.


_________________________

Ben Avery
Software Developer
Youthnet UK

email: [EMAIL PROTECTED]
phone: 020 7288 7333
snail: 2-3 Upper Street
       London N1 0PQ
_________________________

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to