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

Gerhard Petracek commented on EXTCDI-316:
-----------------------------------------

please don't mix the view-scope (@ViewScoped) and the codi scopes (per window): 
@WindowScoped, @ConversationScoped, @ViewAccessScoped.
the bridge for the view-scope just transforms a jsf-bean to a cdi bean and via 
a PreDestroyViewMapEvent listener codi gets notified by the jsf-implementation 
to destroy the corresponding cdi-beans. however, afair esp. mojarra used to 
have issues with those events in the beginning - so i wouldn't use it before 
ee7 (which supports that out-of-the-box and has to handle it internally).

#closeWindowContext is just a helper to do a full cleanup including the 
component-tree. in deltaspike we don't have that any longer to keep it simpler.

@timeout:
yes and no - if the user-session gets closed (due to a timeout or manually) all 
those codi-scoped beans get dropped as well.
however, there is e.g. also a window-timeout which is shorter than the 
session-timeout (usually - see 
WindowContextConfig#getWindowContextTimeoutInMinutes). in deltaspike we dropped 
that as well - there you only have the session-timeout which destroys the 
windows as well.

yes @WindowScoped (and WindowContext) can get to a "session per browser-tab" 
easily. >that< is the use-case for it/them. therefore you have 
@ConversationScoped and @ViewAccessScoped which are more fine-grained. using 
@WindowScoped isn't that usual compared to the other two scopes (which are also 
stored in the current window and therefore support the window-id implicitly - 
see e.g. 
https://cwiki.apache.org/confluence/display/EXTCDI/JSF+Usage#JSFUsage-Scopes). 
@WindowScoped helps e.g. if you like to store the nav.history per window or the 
menu-state independent of the component-tree. WindowContext is just the storage 
per window you (as user) usually don't need to touch manually. (you just need 
it to handle your use-case with iframes.)

you could introduce a new url-parameter and add it on the client-side once you 
replace the iframe-content there. something like oldWindowIdToDrop -> just 
destroy the window on the server-side via a phase-listener (or in your own 
WindowHandler) once you detect your custom url-parameter.

> Close window context view leakge - JSF 2.1 Multiple Iframes per page
> --------------------------------------------------------------------
>
>                 Key: EXTCDI-316
>                 URL: https://issues.apache.org/jira/browse/EXTCDI-316
>             Project: MyFaces CODI
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 1.0.3
>         Environment: Oracle GlassFish Server 3.1.2.5 (build 2), jdk1.6.0_45
>            Reporter: Nuno G. de M
>   Original Estimate: 72h
>  Remaining Estimate: 72h
>
> Hi, and thank you for your support.
> First, I would just like to stat that I am unsure if the "issue" detected in 
> our application is a real issue within CODI, or if it is we that are misusing 
> the framework. Therefore, I would be happy to get your input on the issue I 
> am about to detail.
> ISSUE SUMMARY:
> - we have a ui architecture comprised by several Iframes within a main page, 
> where each iframe has its own CODI window context. After several clicks 
> replacing the content that of a targetIfram by new content, we were having 
> CODI view context leakage as well as JSF view state leakage.
> ISSUE DETAILS:
> For historical as well performance reasons reasons, we have a UI that is 
> composed into several IFrames within a parent portal iframe. This decomposing 
> of the view into sub-views means the JSF context to serialize-deserialize per 
> iframe/.xhtml present in the UI is smaller. As opposed to a single big-ui 
> view state.
> An overview of the core iframes invovled would be:
> (1) window.top - Contains the Header and a left-side navigation menu
> (2) window.top.contentIfram - Iframe Contains your typical page conent 
> (.xhtml)
> (3) window.top.footer - iframe containing a dynamic footer (its own .xhtml)
> (4) wintow.top.applet - Iframe that includes an applet
> (5) window.top.special - an  auxiliary .xhtml that complements the applet data
> (6) window.top.clean - iframe that contains an .xhtml to do CODI window 
> context and JSF sever state cleanup (created to deal with the issue being 
> explained here)
> The BUG in view navigation is the following:
> Each time the user interacts with the UI, e.g by clicing on an menu command 
> button, or on a applet view element, prompting for a new .xhtml view to be 
> loaded and replace the old .xhtml loaded on a target iframe we leak both a 
> JSF and CODI window context.
> Our steps are the following:
> (1) we change the src of the iframe to point to the new view to be loaded
> e.g iframe.src = 'urlTonewPageToBeLoaded.xhtml?requestViewParameters'
> In this request we do not inclode the old windowId of the iframe being 
> replaced. Meaning codi will have to create a new view ID for this new page 
> load.
> (2) We also trigger an ajax request to server to have the old codi window 
> context being closed.
> Intially here did:
> (2.1)WindowContext wContext =  
> windowContextManager.getWindowContext('windowIdToClose);
> wContext.close()
> It turns out that as we did these two steps we had two leakages.
> After about 64 clicks on the applet, if we interatcted with views that the 
> applet had been loading we would have no issues. If we clicked on  some of 
> the older views that had been loaded after the login and not interacted with 
> since then (e.g. the footer) we would have a view timeout exception.
> This happened because with each new iframe.src='newView', CODI was not 
> cleaning up its window context map, namely the following line:
>   this.windowContextMap.remove(editableWindowContext.getId());
> is not executed during a WindowContext.close().
> So despite our class to close the window context, the map would continue to 
> hold the view just closed. After 64 clicks the view uffer of CODI would be 
> totally populated, and each new click was destroying the one of the least 
> recently used views. This could be the main menu, this could be the page 
> content or this could be the footer.
> To address this issue, we had to start injecting the 
> EditableWindowContextManager, and use its close API.
> So the procedure for closing a CODI window context avoiding CODI view leakge 
> turned into a :
>  Map<String, EditableWindowContext> existingContextIds = 
> getExistingContextIds();
> windowContextManager.closeWindowContext(windowIdOfContextToClose);
> Finally, there was still one last view leakge to address.
> Even when we use the 
> windowContextManager.closeWindowContext(windowIdOfContextToClose), the JSF 
> view state associate to this view still exists in the JSF view map.
> JSF-core (e.g majorra) seems to have a limit of 15 views within this LRU 
> logical map.
> So once we stopped leaking views in CODI, we still had to tackle the leakage 
> in JSF. Meaning, when we close a CODI window context, we need to the 
> javax.views.state string to access the JSF map of logical views and remove 
> them. 
>  Object sessionObj = externalContext.getSession(false);
>         synchronized (sessionObj) {
> Map logicalMap = (Map) externalContext.getSessionMap().get(LOGICAL_VIEW_MAP);
> Map actualMap = (Map) logicalMap.get(idInLogicalMap);
>                         actualMap.clear();
>                         // remove the leaked view from the LRU map of logical 
> views
>                         logicalMap.remove(idInLogicalMap);
> }
> ------
> Naturally, an application should normally not have to dig deep into framework 
> code. One of the two is for sure true:
> - either we are misusing CODI to manage our views
> - or CODI  has an issue
> Thanks in advance for any input on this issue.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to