cocoon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Sylvain Wallez <sylv...@apache.org>
Subject Re: [cForms] Errors coming from service layer
Date Mon, 14 Mar 2005 17:56:51 GMT
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 ... :-(


You should enclose this in a while loop :

var success = false;
while (!success) {
  form.showForm();
  form.save(obj);
  try {
    saveBusinessObjectInBackend(obj);
    success = true;
  } catch(ex) {
    ...
  }
}

Now about the particular exception handling, you can also define a 
higher level system to propagate errors with a data structure that 
associates an error code with a widget name and an error message.

If the validation is separated from the saveInBackend operation, don't 
forget that you can define a <fd:validation> on the form object itself.

Sylvain

-- 
Sylvain Wallez                        Anyware Technologies
http://apache.org/~sylvain            http://anyware-tech.com
Apache Software Foundation Member     Research & Technology Director


Mime
View raw message