From: Max M. <Max...@ma...> - 2002-08-05 06:42:55
|
Hi all, Finally got some free time to sit down and re-write/improve ERXValidationException. To re-cap the major problems that the current implementation suffered from are a) using a bunch of deprecated api, b) ERX without ERD2W made the validation exceptions for the most part useless (this whole ** KEY MARKER *** bit) c) convoluted setting of parameters and flow from validation exception generated to validation message display d) messy KVC implementation and e) no way to have pre-conditions for templates. In phase one of the re-work I have solved a- d, in phase 2 I am going to straighten out e) which is a fairly challenging endeavor. So the new ERXValidationException does not use any deprecated api, which means among other things that the deprecated warnings for ERX only take up a single page ;) For ERXValidationExceptions I have removed the dependency on ERXValidation, so it is not involved when an ERXValidationException occurs (this was used from within ERD2W pages). I have re-worked the KVC implementation so it behaves just like the default implementation, meaning no longer will the context object be able to secretly resolve keys (this is a good thing as you will see). I added a few methods to make ERX validation template parsing much nicer without having a d2wContext (displayNameForProperty and displayNameForEntity), both of which use the classDescription off of the object of the validation exception method displayNameForKey to convert keys like firstName to First Name. These methods also will use the current localizer to localize the display name or if a targetLanguage is set then the displayNames will be localized into that language. So now these templates work when only using ERX: NullPropertyException = "Please provide a <b>@displayNameForProperty@</b>."; InvalidNumberException = "The value is an invalid number."; MandatoryToOneRelationshipException = "A <b>@displayNameForEntity@</b> must have a <b>@displayNameForProperty@</b>."; MandatoryRelationshipException = "A <b>@displayNameForEntity@</b> must have a least one <b>@displayNameForEntity@</b>."; ObjectRemovalException = "Cannot delete this <b>@displayNameForEntity@</b>. You should first delete the item in its <b>@displayNameForProperty@</b>"; ObjectsRemovalException = "Cannot delete this <b>@displayNameForEntity@</b>. You should first delete the items in its <b>@displayNameForProperty@</b>."; Which means that the ERD2W templates have been updated to add the context key, for example: NullPropertyException = "Please provide @context.indefiniteArticleForProperty@ <b>@context.displayNameForProperty@</b>."; I have been testing the new code with the Wrox example and it appears to be working correctly. The only gotta is that now custom method validation exceptions thrown that need access to either the bad value or the current propertyKey off of the validation exception need to use a four argument method for creating custom exceptions: public String validateFoo(String foo) { if (foo != null && foo.equals("Bar")) throw ERXValidationFactory.defaultFactory().createCustomException(this, "foo", foo, "FooCanNotBeBarException"); return foo; } The reason for this is that now setObject and setPropertyKey are no longer supported on an ERXValidationExcption (deprecated api that I tend to agree with). Please have a look (I'll finish up the JavaDoc this week) and see if you find any errors that I might have missed. Also if you can test out the validation handling in some of your apps using the this revamped exception and verify that it works in all cases as it should that would be great (after JavaDoc comes the junit test cases ;). Regards, Max |