cocoon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Glen Ezkovich <g...@hard-bop.com>
Subject Re: [cForms] Errors coming from service layer
Date Mon, 14 Mar 2005 17:19:40 GMT

On Mar 14, 2005, at 9:50 AM, Reinhard Poetz wrote:

> Sylvain Wallez wrote:
>> Reinhard Poetz wrote:
>>> Vilya Harvey wrote:
>>>
>>>> Reinhard Pötz wrote:
>>>>
>>>>>
>>>>> Imagine following scenario: You have a service layer that is 
>>>>> exposed as web services. cForms already does as much validation as 
>>>>> possible but some complex checks can only be performed by the 
>>>>> backend.
>>>>>
>>>>> If I call a webservice (via Axis client) this webservice can 
>>>>> return errors (how this is done hasn't been defined yet).
>>>>>
>>>>> Are there any best practices or experiences how to map errors 
>>>>> coming from the service or domain layer to cForms widgets? (The 
>>>>> error has to appear at widget level.)
>>>>
>>>>
>>>>
>>>>
>>>> In your flowscript, you can create your own ValidationError object 
>>>> and explicitly set that on the apppropriate widget.
>>>>
>>>> What we did was to define our own type of exception which included 
>>>> information about all validation errors that were found, then wrote 
>>>> a simple(-ish) flowscript function which handled looking up the 
>>>> relevant widgets, creating the error objects and setting them into 
>>>> the widgets.
>>>
>>>
>>>
>>> Thank you!
>>>
>>> This means that the service layer is aware of which widgets exist? 
>>> I'm not sure if I (and especially my customer) likes this 
>>> bi-directional dependency...
>> Nono! Your validation code has to catch the exception and translate 
>> it into a validation error. This means you can have "regular" 
>> validation errors (i.e. the backend could be reached but detected 
>> invalid data) and communication-level errors, e.g. "could not 
>> validate data, try again later".
>
>
> let's try to express this using some pseudo-code:
>
> var form = new Form(...);
> var businessObject = getBusinessObjectFromServiceLayer();
> form.load(businessObject);
> form.show(...);
>
> form.save(businessObject);
> var errorType;
> try {
>   saveBusinessObjectInBackend(businessObject);
> } catch(ex) {
>   errorType = ex.getErrorType();
> }
>
> if(errorType == "user.already.exists") {
>   form.lookupWidget("user").setValidationError("User already exists!");
> }
>
> form.show(...);
>
> Do you mean something like this? The problem with this is that the 
> service layer
> can return *a lot* of different error types and I would have to write 
> dozens of
> ifs ... :-(

Not necessarily. Because you may have multiple validation errors for 
each request, its likely the Exception will contain a Collection of 
these errors. Its simple enough to just iterate over the widgets and 
find the errors associated with it, or iterate over the errors and find 
the associated widgets. Either way you only need one if. :-) This of 
course assumes that every field is validated by the service and that 
the service doesn't just validate until an error is encountered. If it 
is just a single error then the same principle can be applied by 
getting the name of the field that had the error and looking up the 
widget.

Again both of these assume that the Exception contains the 
field/widget/element/etc name.


Glen Ezkovich
HardBop Consulting
glen at hard-bop.com



A Proverb for Paranoids:
"If they can get you asking the wrong questions, they don't have to 
worry about answers."
- Thomas Pynchon Gravity's Rainbow


Mime
View raw message