You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by "Michael Freedman (JIRA)" <de...@myfaces.apache.org> on 2011/06/10 20:17:58 UTC

[jira] [Commented] (PORTLETBRIDGE-214) BridgeImpl incorrectly cleans up after exceptions; retains contexts

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

Michael Freedman commented on PORTLETBRIDGE-214:
------------------------------------------------

Okay -- looked at the code.  I understand what you have said but don't understand how we got in this situation as a redirect during a resource request is a noop (in a portlet/bridge environment).  Is there any chance you can set a breakpoint in the bridge's FacesContext.release() and send me the stack so I can understand/work backwards in terms of why the context has been prematurely released ... Note:  if you look at the corresponding doFacesRequest code for render requests -- you will see it does reacquire the FacesContext in the exception clause as it does expect a render redirect to occur.

I.e. the issue here seems to be an "unexpected" premature release of the facesContext in a resource request.  Can you help me dig/determine why this is happening?

> BridgeImpl incorrectly cleans up after exceptions; retains contexts
> -------------------------------------------------------------------
>
>                 Key: PORTLETBRIDGE-214
>                 URL: https://issues.apache.org/jira/browse/PORTLETBRIDGE-214
>             Project: MyFaces Portlet Bridge
>          Issue Type: Bug
>          Components: Impl
>    Affects Versions: 2.0.0
>            Reporter: Scott Oaks
>            Assignee: Michael Freedman
>         Attachments: stack.txt
>
>
> The exception handling of BridgeImpl.doFacesRequest() is incorrect, which leads to contexts not being released after an exception.
> When an exception is thrown to the doFacesRequest() method, it ends up in this code:
> try {
>     ...
> } catch (Exception e) {
>    ...
>    context.getExternalContext().log("Exception thrown in doFacesRequest:resource", e);   // line 1168
>   ...
> } finally {
>   ...
>   context.release();
>   ...
> }
> The first problem is that whatever error is getting thrown to us is lost because line 1168 is generated a NullPointerException from context.getExternalContext().log(). So that NPE gets thrown from the exception block and the original, actual root-cause, exception is lost.
> The reason that this code fails is that context.getExternalContext() returns null -- the processing has been redirected, and this context has already been released in redirectRender(). Which leads to the much more serious issue -- the new context established by redirectRender() is never released in the exception handling: the context.release() call in the finally block of doFacesRequest() is the original, already released context. 

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