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]