[ 
https://issues.apache.org/jira/browse/MYFACES-3199?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13102765#comment-13102765
 ] 

Leonardo Uribe commented on MYFACES-3199:
-----------------------------------------

With the analysis done on MYFACES-3301, it becomes clear how to solve this 
problem. 

The first part we need to do is make clear the "context" behind the sentence:

"... If that fails for any reason, throw an AbortProcessingException, including 
the cause of the failure. ..." 

After thinking a lot about it, we should not interpret it literally. Instead, 
the conclusion is the part is an advice for the developer implementing a 
listener in the method expressions that could be wrapped by this class. In 
other words, it is responsibility of the developer to throw 
AbortProcessingException if it "fails for any reason". That has a lot more 
sense than throw an APE for each exception without questions.

With the previous problem understood, how can we solve the inconsistent 
behavior for problem 1 and 2? Just do what was already agreed but with a change:

1) execute one listener in try catch block and catch (Exception e)
2) if
2a) exception is instance of APE _or any of the causes of the exception are an 
APE, don't_ publish ExceptionQueuedEvent and terminate processing for current 
event _(is this as such in the spec that an APE has to be queued?)_
2b) for any other exception publish ExceptionQueuedEvent [REMOVE THE FOLLOWING 
FRAGMENT --- and continue broadcast processing ---]
3) handle queued exception in exception handler
3a) default exception handler : ignore AbortProcessingException
3b) custom exception handler: can handle all unexpected exception (for example 
remove them from queue)
4) all unhandled exception are rethrow and error page is displayed 

We can't continue broadcast processing if other exception is thrown, because 
that requires a change in the spec, so we are stuck in this part. 

Anyway, the previous algorithm is consistent, it has sense and comply with the 
spec. 



> Handling AbortProcessingException is unconsistent
> -------------------------------------------------
>
>                 Key: MYFACES-3199
>                 URL: https://issues.apache.org/jira/browse/MYFACES-3199
>             Project: MyFaces Core
>          Issue Type: Sub-task
>          Components: General
>         Environment: myface core trunk
>            Reporter: Martin Kočí
>
> UIViewRoot:
>  try  {
>     source.broadcast(event);
>  }
>             catch (AbortProcessingException e)
>             {
>                 ExceptionQueuedEventContext exceptionContext 
>                         = new ExceptionQueuedEventContext(context, e, source, 
> context.getCurrentPhaseId());
>                 context.getApplication().publishEvent(context, 
> ExceptionQueuedEvent.class, exceptionContext);
>                 
>                 // Abortion
>                 return false;
> }
> Problem 1: 
> <h:inputText  valueChangeListener="#{bean.processValueChange}">
> MethodExpressionValueChangeListener wraps all exceptions to 
> AbortProcessingException and therefore exception is queued
> Problem 2: 
>             <h:inputText  >
>                 <f:valueChangeListener binding="#{bean}" />
>             </h:inputText>
> ValueChangeListenerHandler does not wrap exception to 
> AbortProcessingException and therefore  exception is not queued in this block 
> (but it is queued from phase executor but without component info)
> Problem 3: JSF spec 2.1 : 
> "Clarification made: throwing an AbortProcessingException tells an 
> implementation that no further broadcast of the
> current event occurs. Does not affect future events." 
> But I think that code in UIViewRoot makes opposite:  // Abortion  return 
> false;

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira


Reply via email to