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

Neil Griffin commented on MYFACES-3675:
---------------------------------------

Here is a patched ManagedBeanDestroyer.isManagedBean(String) method:
{code}
    public boolean isManagedBean(String name)
    {
        boolean managed = false;
        
        if (_runtimeConfig.getManagedBean(name) == null)
        {
            
            // Section PLT.18.3 of the Portlet 2.0 Specification titled
            // "Binding Attributes into a Session" requires that
            // PortletSession attribute names be namespaced/prefixed with
            // the "javax.portlet.p.<ID>?" pattern. In order to determine
            // if the specified name is a SessionScoped managed-bean, it
            // is necessary to first strip the pattern from it.
            if ((name != null) && name.startsWith("javax.portlet.p."))
            {
                int pos = name.indexOf("?");
                if (pos > 0)
                {
                    String attributeName = name.substring(pos+1);
                    managed = (_runtimeConfig.getManagedBean(attributeName) != 
null);
                }
            }
        }
        else
        {
            managed = true;
        }
        return managed;
    }
{code}
                
> Session scoped beans are not cleaned up when PortletSession expires or is 
> invalidated
> -------------------------------------------------------------------------------------
>
>                 Key: MYFACES-3675
>                 URL: https://issues.apache.org/jira/browse/MYFACES-3675
>             Project: MyFaces Core
>          Issue Type: Bug
>          Components: General
>    Affects Versions: 2.1.10
>         Environment: Portlets
>            Reporter: Neil Griffin
>
> When running in the context of a request, MyFaces calls 
> FacesContext.getCurrentInstance().getExternalContext.getSessionMap() in order 
> to get/set session attributes. This provides the portlet bridge with the 
> ability to get/set attributes using the PortletSession, which is a layer of 
> abstraction on top of the HttpSession. But when a session expires, the 
> org.apache.myfaces.config.ManagedBeanDestroyer.isManagedBean(String) method 
> does not check the attribute name for a portlet environment. This causes a 
> memory leak when running in a portlet environment, because the portlet bridge 
> is not consulted. Specifically, @SessionScoped managed-beans are not cleaned 
> up.
> The good news is that Section PLT.18.3 of the Portlet 2.0 Specification 
> titled "Binding Attributes into a Session" requires that PortletSession 
> attribute names be namespaced/prefixed with the "javax.portlet.p.<ID>?" 
> pattern when they are stored in the underlying HttpSession. This would enable 
> MyFaces to find the session attributes, so that cleanup can take place 
> correctly during session expiration/invalidation.
> Here is the parallel issue in Mojarra:
> http://java.net/jira/browse/JAVASERVERFACES-2691

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to