The problem with GenericValidator is that it has a single instance of
UrlValidator in a static variable, so you can't go changing its
configuration every time a url is validated in your webapp as it wouldn't be
thread safe. In fact if you want the option to configure it on a field by
field basis then you are going to need to create a new instance of the
UrlValidator each time - or have some clever mechanism that caches a
UrlValidator for each field -its a shame the ValidatorAction doesn't do
that.

Maybe modify FieldChecks.validateUrl() to check if any options/schemes have
been set (using <var>) - if they have then instantiate a new UrlValidator,
otherwise use the default GenericValidator.isUrl().

The other problem, which I usually forget is the javascript - if you allow
the server side to be configured then maybe the  javascript should also take
those options into account (although the date validation only works with the
datePatternStrict option in javascript unless its changed in 1.2).

Anyway my opinion is irrelevant as its the "powers that be" that you have to
convince to apply any patch you submit :-)

Niall


----- Original Message ----- 
From: "Adam Hardy" <[EMAIL PROTECTED]>
To: "Struts Users Mailing List" <[EMAIL PROTECTED]>
Sent: Thursday, April 01, 2004 3:24 PM
Subject: Re: UrlValidator() takes options - but how?


> Thanks for that Niall, you certainly know your stuff.
>
> I am thinking, if I change the UrlValidator in the source code, I could
> submit a patch to allow FieldChecks to set the <var> values from
> validation.xml.
>
> Currently, FieldChecks access UrlValidator via the GenericValidator:
>
> if (!GenericValidator.isBlankOrNull(value) &&
>      !GenericValidator.isUrl(value)) {
>
> Should I change this to:
>
>       !GenericValidator.isUrl(value, allow2Slashes, noFragments,
> allowAllSchems)) {
>
> and edit GenericValidator accordingly, to pass the options in to
> UrlValidator.
>
> Is that a good idea?
> Adam
>
>
> On 04/01/2004 02:58 PM Niall Pemberton wrote:
> > UrlValidator is not the class that is instantiated  by ValidatorAction
> > because it doesn't know anything about Struts resources - the Struts
> > FieldChecks.validateUrl() method calls commons GenericValidator which
> > instantiates the UrlValidator.
> >
> > Rather than using the struts FieldChecks.validateUrl(), create you own
> > version which instantiates the url validator and picks up <var> values
to
> > configure it. Something like:
> >
> >
> > <field property="someUrl" depends="myUrlValidator">
> >       <var><var-name>slashes</var-name>
> >                 <var-value>true</var-value>
> >       </var>
> >       <var><var-name>fragments</var-name>
> >                 <var-value>true</var-value>
> >       </var>
> > </field>
> >
> >    public static boolean validateUrl(Object bean,
> >                                         ValidatorAction va, Field field,
> >                                         ActionMessages errors,
> >                                         HttpServletRequest request) {
> >
> >         String value = null;
> >         if (isString(bean)) {
> >             value = (String) bean;
> >         } else {
> >             value = ValidatorUtils.getValueAsString(bean,
> > field.getProperty());
> >         }
> >         int options = 0;
> >
> >         if ("true".equals(field.getVarValue("slashes")))
> >              options += UrlValidator.ALLOW_2_SLASHES;
> >
> >         if ("true".equals(field.getVarValue("fragments")))
> >              options += UrlValidator.ALLOW_2_SLASHES;
> >
> >         UrlValidator urlValidator = new UrlValidator(options);
> >
> >         if (!GenericValidator.isBlankOrNull(value) &&
> > !urlValidator.isValid(value)) {
> >             errors.add(field.getKey(),
Resources.getActionMessage(request,
> > va, field));
> >             return false;
> >         } else {
> >             return true;
> >         }
> >     }
> >
> > ----- Original Message ----- 
> > From: "Adam Hardy" <[EMAIL PROTECTED]>
> > To: <[EMAIL PROTECTED]>
> > Sent: Thursday, April 01, 2004 12:17 PM
> > Subject: UrlValidator() takes options - but how?
> >
> >
> >
> >>In UrlValidator() in the validator package, one can set various options
> >>upon instantiation, such as ALLOW_2_SLASHES or NO_FRAGMENTS.
> >>
> >>However it appears from the code in
> >>ValidatorAction.getValidationClassInstance() that I can't actually set
> >>these at any point in the Validator framework so that they will be
> >>picked up when run under struts.
> >>
> >>I think I'm looking in the right place in the code.
> >>
> >>I was hoping that there would be some method for configuring this via
> >>validation.xml, but apparently not.
> >>
> >>Am I correct?
> >>
> >>Thanks
> >>Adam
> >>
> >>-- 
> >>struts 1.1 + tomcat 5.0.16 + java 1.4.2
> >>Linux 2.4.20 Debian
> >>
> >>
> >>---------------------------------------------------------------------
> >>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]
> >
> >
>
>
> -- 
> struts 1.2 + tomcat 5.0.19 + java 1.4.2
> Linux 2.4.20 Debian
>
>
> ---------------------------------------------------------------------
> 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