On 2/9/07, Nathan Coast <[EMAIL PROTECTED]> wrote:
Hi Niall,

thanks again for the quick response.

I've been looking at the struts and validator source and have a couple
of ideas for a solution to my problem.

1) just create an appropriate validator and execute it.  Simpler but
doesn't 'feel' as good.

IntegerValidator validator = IntegerValidator.getInstance();

       Integer fooInteger = validator.validate(fooString, "#,##0.00",
Locale.GERMAN);
       if (fooInteger == null) {
           // error...not a valid Integer
           return;
       }

2) get the existing validator for the form and add the appropriate
validator, so all of the form validations are executed i.e. from the
config and additional validations.

Validator validator = Resources.initValidator(validationKey,
                       this,
                       application, request,
                       errors, page);
*pseudocode*
validator.add(fooBarValidator,..,...,..)
validator.validate();

this feels better as the existing framework is responsible for executing
all validations, assembling cumulative errors and creating localised
messages.  I'm just not sure it's possible to add validations.

I think I may have to clone form validators so that adding validations
to the validator doesn't affect subsequent validations on forms with the
same name.

As you say option 1 is simple and I guess it depends whether this is a
"one off" or you need to re-use it in more than one place?

Assuming the later - you would need to clone since changing the
configuration for a set of form validation rules will affect them all.
You would also need to set up any custom messages (<msg> and <arg>
elements) unless a generic message (no label) would do for all. IMO it
would be more straight forward to write a custom validator that
delegates to the others

public static Object validateConditional (
       Object bean,
       ValidatorAction va,
       Field field,
       ActionMessages errors,
       Validator validator,
       HttpServletRequest request) {

   if (??? Short ???) {
       return FieldChecks.validateShort(bean, va, field, errors,
validator, request);
   } else if (??? Integer???) {
       return FieldChecks.validateInteger(bean, va, field, errors,
validator, request);
   } else if (??? Double???) {
       return FieldChecks.validateDouble(bean, va, field, errors,
validator, request);
   } else if (??? Date???) {
       return FieldChecks.validateDate(bean, va, field, errors,
validator, request);
   } else if ...
   }

}

That way you could configure messages/arguments in you validation.xml as usual:

   <field property="foo" depends="conditional">
       <msg name="short"   key="foo.short.error">
       <msg name="integer" key="foo.integer.error">
       <msg name="double" key="foo.double.error">
       <msg name="date" key="foo.date.error">
       <arg0 key="Foo Label" resource="false">
       
<var><var-name>datePattern<var-name><var-value>dd/MM/yyyy<var-value></var>
   </field>

Need to remember to configure your "conditional" validator:

<validator name="conditional"
                  classname="myPackage.MyValidations"
                  method="validateConditional"
                  methodParams="java.lang.Object,
                      org.apache.commons.validator.ValidatorAction,
                      org.apache.commons.validator.Field,
                      org.apache.struts.action.ActionMessages,
                      org.apache.commons.validator.Validator,
                      javax.servlet.http.HttpServletRequest"
                  depends=""
                  msg="default,msg"/>

Not something I've done though, so just shooting from the hip.

Niall

any chance you can point me in the right direction before I waste 2 days
trying something impossible :)

cheers
Nathan


Niall Pemberton wrote:
> On 2/9/07, Nathan Coast <[EMAIL PROTECTED]> wrote:
>> thanks Niall,
>>
>> I've had a look at the examples and I'm not sure they demonstrate what I
>> need.  The examples all seem to be simple boolean expressions e.g.
>>
>>        <field property="address1" depends="validwhen">
>>          <arg key="validWhenForm.address1" />
>>          <var>
>>            <var-name>test</var-name>
>>            <var-value>( (*this* != null) or
>>                       ( (address2 == null) and
>>                       ( (city == null) and
>>                         (zip == null) )))</var-value>
>>          </var>
>>        </field>
>>
>> I have a select (fieldB) that determines the type of fieldA. So the
>> validation to operate on fieldA depends on the value of fieldB.
>>
>>        <field property="fieldA" depends="validwhen,required">
>>          <arg key="form.fieldA" />
>>          <var>
>>            <var-name>test</var-name>
>>            <var-value>
>>       ((fieldB == 'java.lang.Integer') && validateInteger(fieldA))
>>    || ((fieldB == 'java.lang.Float') && validateFloat(fieldA))
>>    || ((fieldB == 'java.util.Date') && validateDate(fieldA))
>> etc....
>>          </var>
>>        </field>
>
> The above looks like JavaScript - because validwhen is server side
> only. Either way validwhen doesn't cater for doing different types of
> validation (e.g. integer, float etc) depending on a value.
>
>> is this possible?  I'm thinking not, so a custom validation method is
>> probably what I need.
>
> Looks like it
>
> Niall
>
>> cheers
>> Nathan
>>
>>
>> Niall Pemberton wrote:
>> > On 2/9/07, Nathan Coast <[EMAIL PROTECTED]> wrote:
>> >> Hi,
>> >>
>> >> I have two fields in a form.  I believe the validwhen rule executes a
>> >> specific rule (e.g. required) on field a based upon the value of field
>> >> b.  The situation I have is that I need to execute different
>> validations
>> >> on field a determined by the value of field b.
>> >
>> > Yes - theres a validwhen example page in the struts-examples webapp in
>> > the binary distro (see the validation module).
>> >
>> >> Is this possible client side with the latest validator framework
>> >> (1.3.1)? or will I have to implement this functionality in the
>> validate
>> >> method of the form (server side)?
>> >
>> > validwhen is server side only.
>> >
>> > Its also a custom Struts validator - not part of Commons Validator so
>> > in that respect the version of Commons Validator is not relevant.
>> >
>> > Niall
>> >
>> >> cheers
>> >> Nathan
>> >>
>> >>
>> >> ---------------------------------------------------------------------
>> >> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> >> For additional commands, e-mail: [EMAIL PROTECTED]
>> >>
>> >>
>> >
>> > ---------------------------------------------------------------------
>> > To unsubscribe, e-mail: [EMAIL PROTECTED]
>> > For additional commands, e-mail: [EMAIL PROTECTED]
>> >
>> >
>> >
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> For additional commands, e-mail: [EMAIL PROTECTED]
>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>
>


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



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

Reply via email to