I have come up with a solution, and I'd like to share it with the community.
Any comments are welcomed.
This code is located inside one of my Action classes (or a super Action), where
partial validation is needed:
static Map validations;
/**
* @param mapping
* @param request
* @param form This is the form that is associated with the current action,
* and contains the fields to be validated. You should down-cast this
to your * form before using it in the method
* @param fields Array of Strings that contains the names of the fields to
be * validated.
private ActionErrors validateFields(ActionMapping mapping,
HttpServletRequest request, ActionForm form, String[] fields,
boolean replaceRequiredIf) throws IllegalAccessException,
InvocationTargetException, NoSuchMethodException {
Field field;
Iterator dependencies;
String dependency;
Validator validator = null;
ValidatorAction action;
ActionErrors errors = new ActionErrors();
if (validations == null)
validations = new HashMap();
ValidatorResources resources = Resources.getValidatorResources(
getServlet().getServletContext(), request);
Map fieldMap = resources
.get(getLocale(request), mapping.getAttribute()).getFieldMap();
for (int i = 0; i < fields.length; i++) {
field = (Field) fieldMap.get(fields[i]);
for (dependencies = IteratorUtils.getIterator(field
.getDependencies()); dependencies.hasNext();) {
dependency = (String) dependencies.next();
if (!"required".equals(dependency)
&& !"requiredif".equals(dependency)
&& StringUtils.isBlank(ValidatorUtil.getValueAsString(
form, fields[i])))
continue;
else {
action = resources.getValidatorAction(dependency);
if ("requiredif".equals(dependency)) {
if (replaceRequiredIf)
dependency = "required";
else {
dependency = "requiredIf";
if (validator == null)
validator = Resources.initValidator(mapping
.getAttribute(), form, getServlet()
.getServletContext(), request, errors,
0);
applyValidator(new Class[] { Object.class,
ValidatorAction.class, Field.class,
ActionErrors.class, Validator.class,
HttpServletRequest.class }, new Object[] {
form, action, field, errors, validator,
request }, dependency);
continue;
}
} else if ("minlength".equals(dependency))
dependency = "minLength";
else if ("maxlength".equals(dependency))
dependency = "maxLength";
applyValidator(
new Class[] { Object.class, ValidatorAction.class,
Field.class, ActionErrors.class,
HttpServletRequest.class },
new Object[] { form, action, field, errors, request
},
dependency);
}
}
}
return errors;
}
private void applyValidator(Class[] types, Object[] params,
String dependency) throws NoSuchMethodException,
IllegalAccessException, InvocationTargetException {
Method validator = (Method) validations.get(dependency);
if (validator == null) {
validator = FieldChecks.class.getMethod("validate"
+ StringUtils.capitalize(dependency), types);
validations.put(dependency.toLowerCase(), validator);
}
validator.invoke(null, params);
}
Yasser Al Masri <[EMAIL PROTECTED]> wrote: Hi,
I have configured my form which contains 70 elements for validation using
validation.xml file, and in many cases I needed to reuse the same exact
definitions of the 's available within my for validation of subsets of that
form, e.g., I need to enable the user to fill in fields x, y, and z and submit
the form to retrieve some information, so only fields x, y, and z has to be
validated and not the whole 70 fields in the form, and in the same time, I need
to utilize the rules I defined in validation.xml in the "depends" clause.
I have seen some utilizing the ValidatorResources, and Resources classes to do
this, but I couldn't get an efficient working example. Does anybody have a code
snippet to show me how to achieve this.
Your help is greatly appreciated.
---------------------------------
What are the most popular cars? Find out at Yahoo! Autos
---------------------------------
Relax. Yahoo! Mail virus scanning helps detect nasty viruses!