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

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

Ok, now I get it. 

MK>> Problem1 : UIViewRoot._broadcastAll queues APE into ExceptionQueuedEvent 
and 
MK>> check for "any of the causes of the exception are an APE" is missing in 
code

The check is done in the wrappers. See 
javax.faces.event.MethodExpressionActionListener, 
javax.faces.event.MethodExpressionValueChangeListener. I think an additional 
check on UIViewRoot is not necessary.

MK>> ad Problem 2) queuing the source component is required to solve the mail 
goal 
MK>> of MYFACES-3053: "any time there is an error in *any* part of the 
MK>> lifecycle, the user should see not just a cryptic stack trace, but also the
MK>>  **component** - including file and line number - that triggered the 
problem" 

The patch has some side effects. UIViewRoot._process(FacesContext context, 
PhaseId phaseId, PhaseProcessor processor) as a try {} catch block for 
RuntimeExceptions, to execute afterPhase listeners and then rethrow the 
exception. Later, on LifecycleImpl the exception is catched and finally 
published as an EventQueuedException.

In few words, the change proposed here is just publish EventQueuedException for 
non APE exceptions in UIViewRoot._broadcastAll too, but preserve the effect of 
stop broadcasting when a non APE exception is received. 

If you provide a patch removing the check for nested APE, and if no objections 
I'll review it and commit it.

                
> 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čí
>            Assignee: Leonardo Uribe
>             Fix For: 2.0.9, 2.1.3
>
>         Attachments: UIViewRoot.patch
>
>
> 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.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira


Reply via email to