If the goal is to execute validations based on arbitrary preconditions (I missed the original req) the *easiest* thing to do might be to just extend/usurp the existing validation interceptor to do that precondition check.
d. On Mon, Nov 28, 2011 at 7:58 PM, Li Ying <liying.cn.2...@gmail.com> wrote: > Looks like you want some pre-condition check before the validation. > If and only if the pre-condition is true, the validation will be executed. > > I did the same thing several years ago. > > There are 2 solution I tried: > (A)Inherit all the struts2 bundled validators, add some pre-condition > check code, > if and only if the pre-condition is true, invoke the method of the > base class. The base class (struts2 bundled validators) will do the > left work. > > BTW, the pre-condition should be passed into the validators via > <param>, so the validators will not include any business logic and > they can be reused. > And since your pre-condition is a session attribute, I think you can > check it's value by OGNL expression. I am not very sure for this. If > you can not access session attribute via OGNL, maybe you need a > [getCountry] method in your action class, so the OGNL can retrieve the > value. > > You don't need reinvent the whole wheels, but extend the existed wheels. > > Source code like: > public class XXXValidatorEx extends XXXValidator { > private String condition; // here is the pre-condition in OGNL > > public getCondition(); // omitted > public setCondition(); // omitted > > private boolean evaluateCondition(){ > // omitted > // you can read the code of [ExpressionValidator] and > [FieldValidatorSupport], to learn how to evaluate an OGNL expression. > } > > public void validate(Object object) { > boolean result = this.evaluateCondition(); > if (result ) { > super.validate(object); > } > } > } > > There are about one dozen bundled validators, and the source code of > the inherited validators will be almost 100% same (only except the > class name and the base class name). > This will be a little ugly, but we have no choice, because Java don't > support multi-inherit or interface-delegation. > My choice was, generating all these source codes via FreeMarker, so I > need maintenance only one template file, but not one dozen of class > source codes. > > > (B)The other solution is much lighter. > No need the enhance the validator class, but express your > pre-condition and your validation rule all by expression. > > like: > <validator type="expression"> > <param name="expression">(!pre-condition) or (check-rule)</param> > </validator> > > This will be easy to do, but hard to use, > because you must translate all the validation rules into some OGNL > expression > > > > Anyway, I think the final and most beautiful solution should be, > adding some [pre-condition checking] into the Struts2 bundled > validators themselves. > But this is out of our control, hope the developers of Struts2 can here > this. > > > > 2011/11/28 Jyothrilinga Rao <jyoth...@gmail.com>: > > Thanks Li Ying, > > I got some information from > > > http://today.java.net/pub/a/today/2006/01/19/webwork-validation.html?page=3#custom-validators > > but I do not want to reinvent the wheel (basically avoid coding my > > validation logic in java code). If I > > could have my <actionClass>-validation.xml structured as > > > > <validators> > > *<country name="USA"> > > * <!-- Field Validators for email field --> > > <field name="email"> > > <field-validator type="required" short-circuit="true"> > > <message>You must enter a value for email.</message> > > </field-validator> > > <field-validator type="email" short-circuit="true"> > > <message>Not a valid e-mail.</message> > > </field-validator> > > </field> > > <!-- Plain Validator 1 --> > > <validator type="expression"> > > <param name="expression">email.equals(email2)</param> > > <message>Email not the same as email2</message> > > </validator> > > *</country>* > > *<country name="AUSTRIA"> > > * <!-- Field Validators for email2 field --> > > <field name="email2"> > > <field-validator type="email"> > > <message>Not a valid e-mail2.</message> > > </field-validator> > > </field> > > <!-- Plain Validator 2 --> > > <validator type="expression" short-circuit="true"> > > <param name="expression">email.startsWith('mark')</param> > > <message>Email does not start with mark</message> > > </validator> > > *</country>* > > </validators> > > > > I am looking for something like a wrapper on existing bundled validators. > > Is it possible. > > > > Regards, > > JK. > > --------------------------------------------------------------------- > To unsubscribe, e-mail: user-unsubscr...@struts.apache.org > For additional commands, e-mail: user-h...@struts.apache.org > >