On 2/9/07, Nathan Coast <nathan@(protected):
> 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 <nathan@(protected):
> >> 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 <nathan@(protected):
> >> >> 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: user-unsubscribe@(protected)
> >> >> For additional commands, e-mail: user-help@(protected)
> >> >>
> >> >>
> >> >
> >> > ---------------------------------------------------------------------
> >> > To unsubscribe, e-mail: user-unsubscribe@(protected)
> >> > For additional commands, e-mail: user-help@(protected)
> >> >
> >> >
> >> >
> >>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: user-unsubscribe@(protected)
> >> For additional commands, e-mail: user-help@(protected)
> >>
> >>
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: user-unsubscribe@(protected)
> > For additional commands, e-mail: user-help@(protected)
> >
> >
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@(protected)
> For additional commands, e-mail: user-help@(protected)
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@(protected)
For additional commands, e-mail: user-help@(protected)