Here are the diff files for validator_1_0.dtd, org.apache.commons.validator.FormSet and org.apache.commons.validator.Form. I have also done the tests. Should I include them as plain text or attach them? The test would be a validation.xml file and the TestCase.

I didn't follow exactly the Tiles pattern as it would imply quite a few more changes. I believe solving inheritance is naturally part of the process method anyway.
I don't know if it would be interesting to reference the parent form. For this purpose I didn't find it useful, but it might be useful in the future.
It would probably be wise not to use process(Map, Map) at all in case it may get deprecated (just guessing).


A couple of issues:

1. Should it throw an exception:
throw new ValidatorException("Error while resolving form definition inheritance: child '"
+ getName()
+ "' can't find its ancestor '"
+ getExtends()
+ "'. Please check your validation definition file.");
if its parent form is not found? The thing is that it should go all the way up to ValidatorResources.initialize...
2. It would probably be interesting to have a notation similar to the one in the attribte depends (comma delimited), making it possible to extend from multiple forms. What do you think?


______________________
DIFF validator_1_0.dtd
82,84d81
< The "extends" attribute makes it possible to extend the set of rules of this
< form with those of the "extends" one. It is also possible to override any
< of the parent's rules.
87,88c84
< <!ATTLIST form name CDATA #REQUIRED
< extends CDATA #IMPLIED >
---
> <!ATTLIST form name CDATA #REQUIRED>




_________________________________________
DIFF org.apache.commons.validator.FormSet
221c221,225
<                 f.process(globalConstants, hConstants);
---
>                 if (f.isExtending()) {
>                       f.process(globalConstants, hConstants, hForms);
>                 } else {
>                       f.process(globalConstants, hConstants);
>                 }



______________________________________
DIFF org.apache.commons.validator.Form
89a90,100
> /**
> * The name/key of the form which this form extends from.
> */
> protected String inherit = null;
>
> /**
> * Whether or not the this <code>Form</code> was processed
> * for replacing variables in strings with their values.
> */
> private boolean bProcessed = false;
>
153a165
> bProcessed = true;
155a168,203
> /**
> * Processes all of the <code>Form</code>'s <code>Field</code>s.
> */
> public void process(Map globalConstants, Map constants, FastHashMap forms) {
>
> if (isProcessed()) {
> return;
> }
> int n = 0; //we want the fields from its parent first
> if (isExtending()) {
> Form parent = (Form) forms.get(inherit);
> if (parent != null) {
> if (!parent.isProcessed()) {
> //we want to go all the way up the tree
> parent.process(constants, globalConstants, forms);
> }
> for (Iterator i = parent.getFields().iterator(); i.hasNext();) {
> Field f = (Field) i.next();
> //we want to be able to override any fields we like
> if (hFields.get(f.getKey()) == null) {
> lFields.add(n, f);
> hFields.put(f.getKey(), f);
> n++;
> }
> }
> }
> }
> hFields.setFast(true);
> //no need to reprocess parent's fields, we iterate from 'n'
> for (Iterator i = lFields.listIterator(n); i.hasNext();) {
> Field f = (Field) i.next();
> f.process(globalConstants, constants);
> }
> bProcessed = true;
> }
>
173a222,230
>
>
> /**
> * Whether or not the this <code>Form</code> was processed
> * for replacing variables in strings with their values.
> */
> public boolean isProcessed() {
> return bProcessed;
> }
174a232,251
> /**
> * Gets the name/key of the parent set of validation rules.
> */
> public String getExtends() {
> return inherit;
> }
>
> /**
> * Sets the name/key of the parent set of validation rules.
> */
> public void setExtends(String string) {
> inherit = string;
> }
>
> /**
> * Get extends flag.
> */
> public boolean isExtending() {
> return inherit!=null;
> }



--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to