Java Mailing List Archive

http://www.junlu.com/

Home » Home (12/2007) » Struts 2 »

Re: type validwhen validation

Niall Pemberton

2007-02-09

Replies:

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)

©2008 junlu.com - Jax Systems, LLC, U.S.A.