cocoon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Reinhard Poetz <reinh...@apache.org>
Subject Re: [cForms] Errors coming from service layer
Date Wed, 16 Mar 2005 07:16:15 GMT
Sylvain Wallez wrote:
> 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.

thank you guys!


-- 
Reinhard Pötz           Independant Consultant, Trainer & (IT)-Coach 

{Software Engineering, Open Source, Web Applications, Apache Cocoon}

                                        web(log): http://www.poetz.cc
--------------------------------------------------------------------

Mime
View raw message