[ 
https://issues.apache.org/jira/browse/PLUTO-770?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Neil Griffin updated PLUTO-770:
-------------------------------
    Description: 
The {{PortletSessionScopedBeanMap.remove()}} method contains the following code:

{code:java|title=PortletSessionScopedBeanMap.java}
if (bi != null) {
    beans.remove(bean);
    bi.crco.release();
    bean.destroy((T)bi.instance, (CreationalContext<T>)bi.crco);
}
{code}

The problem is that the {{beans}} variable is a {{java.util.Map}} whose keys 
are of type {{String}} (the windowId of the portlet) and not of type 
{{javax.enterprise.inject.spi.Bean}}. Therefore the call to 
{{beans.remove(bean)}} is incorrect and does not actually remove the bean from 
the underlying map.

The fix would be to pass the windowId instead:

{code:java|title=PortletSessionScopedBeanMap.java}
if (bi != null) {
    beans.remove(id);
    bi.crco.release();
    bean.destroy((T)bi.instance, (CreationalContext<T>)bi.crco);
}
{code}

The reason why this was not discovered earlier is because the 
{{PortletSessionScopedBeanMap.remove()}} method was only called by the 
{{valueUnbound(HttpSessionBindingEvent evt)}} method which includes a call to 
{{beans.clear()}} after iterating through all the beans.


  was:
The {{PortletSessionScopedBeanMap.remove()}} method contains the following code:

{code:java|title=PortletSessionScopedBeanMap.java}
if (bi != null) {
    beans.remove(bean);
    bi.crco.release();
    bean.destroy((T)bi.instance, (CreationalContext<T>)bi.crco);
}
{code}

The problem is that the {{beans}} variable is a {{java.util.Map}} whose keys 
are of type {{String}} (the windowId of the portlet) and not of type 
{{javax.enterprise.inject.spi.Bean}}. Therefore the call to 
{{beans.remove(bean)}} is incorrect and does not actually remove the bean from 
the underlying map.

The fix would be to pass the windowId instead:

{code:java|title=PortletSessionScopedBeanMap.java}
if (bi != null) {
    beans.remove(id);
    bi.crco.release();
    bean.destroy((T)bi.instance, (CreationalContext<T>)bi.crco);
}
{code}



> PortletSessionScopedBeanMap.remove() does not remove bean instances from the 
> underlying map
> -------------------------------------------------------------------------------------------
>
>                 Key: PLUTO-770
>                 URL: https://issues.apache.org/jira/browse/PLUTO-770
>             Project: Pluto
>          Issue Type: Task
>          Components: portlet container
>    Affects Versions: 3.0.0, 3.0.1
>            Reporter: Neil Griffin
>            Assignee: Neil Griffin
>            Priority: Major
>             Fix For: 3.0.2
>
>
> The {{PortletSessionScopedBeanMap.remove()}} method contains the following 
> code:
> {code:java|title=PortletSessionScopedBeanMap.java}
> if (bi != null) {
>     beans.remove(bean);
>     bi.crco.release();
>     bean.destroy((T)bi.instance, (CreationalContext<T>)bi.crco);
> }
> {code}
> The problem is that the {{beans}} variable is a {{java.util.Map}} whose keys 
> are of type {{String}} (the windowId of the portlet) and not of type 
> {{javax.enterprise.inject.spi.Bean}}. Therefore the call to 
> {{beans.remove(bean)}} is incorrect and does not actually remove the bean 
> from the underlying map.
> The fix would be to pass the windowId instead:
> {code:java|title=PortletSessionScopedBeanMap.java}
> if (bi != null) {
>     beans.remove(id);
>     bi.crco.release();
>     bean.destroy((T)bi.instance, (CreationalContext<T>)bi.crco);
> }
> {code}
> The reason why this was not discovered earlier is because the 
> {{PortletSessionScopedBeanMap.remove()}} method was only called by the 
> {{valueUnbound(HttpSessionBindingEvent evt)}} method which includes a call to 
> {{beans.clear()}} after iterating through all the beans.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to