You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by "Leonardo Uribe (Updated) (JIRA)" <de...@myfaces.apache.org> on 2011/11/22 01:41:39 UTC
[jira] [Updated] (MYFACES-3404) Add windowId to server side state
saving algorithm
[ https://issues.apache.org/jira/browse/MYFACES-3404?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Leonardo Uribe updated MYFACES-3404:
------------------------------------
Status: Patch Available (was: Open)
> Add windowId to server side state saving algorithm
> --------------------------------------------------
>
> Key: MYFACES-3404
> URL: https://issues.apache.org/jira/browse/MYFACES-3404
> Project: MyFaces Core
> Issue Type: New Feature
> Reporter: Leonardo Uribe
> Assignee: Leonardo Uribe
> Attachments: MYFACES-3404-1.patch
>
>
> From dev list:
> Hi
> MS>> The ClientSideWindowHandler solution in CODI looks good so far, but there
> MS>> is still a lot to do.
> MS>> And like every technology, it has it's pros and cons...
> MS>> What do you think about making the windowId provider pluggable in MyFaces
> MS>> core first?
> I have been thinking about every possible option we have for implement this and
> the conclusion was the best way is make something like the hack done in CODI or
> a "variant" of it, like the one described on:
> http://wiki.apache.org/myfaces/Drafts/WindowId
> (Mixed approach of the first prototype)
> From the point of view of MyFaces Core, any solution should be bound to the
> renderkit in some way. So, windowId concept has sense to include it on the spec
> but its implementation should be done according to the renderkit. If the
> renderkit handles html, do the hack proposed but if is xml, do other thing
> and so on. It sounds like something to do outside MyFaces Core. Basically the
> problem is how to create an interface about something that could require
> changes over the renderkit/viewhandler?.
> Maybe we can minimize the problem, and provide an interface like this:
> public interface WindowIdRenderKitAware
> {
> public String getCurrentWindowId(FacesContext facesContext);
> }
> But let the details about how to "plug" all pieces inside CODI. MyFaces Core
> just offer the "integration point", and the default algorithm just do what is
> doing right now. Who should implement this interface? the renderkit, even if
> in the implementation the value can be stored inside FacesContext attribute
> map or request map. There exists a RenderKitWrapper interface, so it is
> easy to create a wrapper for default HTML_BASIC renderkit or any other and
> then scan through the wrappers and the first one implementing the interface
> will be the choosen.
> MS>> The REAL problem with JSF and multiple tabs is that once you open 2 tabs
> MS>> and click in 1 of them often enough, then you will destroy the state of
> MS>> the view in the other tab as well somewhen. Usually after 20 requests
> MS>> (default).
> There are two points where this logic could be useful inside MyFaces Core :
> 1. Server side state
> 2. Flash scope
> But in practice the only really relevant is 1. To implement 2. it is necessary
> a "requestId". MyFaces FlashImpl uses a counter and store its value inside
> a cookie. To fix this scope properly, the best is create a ExternalContext
> wrapper and provide and alternate Flash object, but that sounds like something
> that can be done outside MyFaces Core. If you are using CDI scopes, it sounds
> reasonable to provide an alternate Flash scope in CODI.
> If we can just modify the logic inside server side state to include "windowId"
> concept, it will be enough.
> MS>> To come over this, we need to store the n last views not only per session,
> MS>> but also per browser tab (==windowId).
> MS>> Of course, there can be lots of fancy stuff done to detect closed tabs,
> MS>> etc. But all this is much more stable if we really have the opportunity
> MS>> to distinguish between tabs. We can e.g. also introduce a configuration
> MS>> for maximum allowed tabs, to reduce memory blasting.
> Really since all state is stored in session, if the session is invalidated all
> tabs are removed from memory. Basically we already have params for max number
> of sessions and max number of logical sessions (which in fact can be seen
> as "tabs"). So what we have right now is ok, we just need to include windowId
> concept into the logic and that's it.
> MS>> All this is actually completely independent of how the windowId get's
> MS>> created and checked imo.
> Yes, that's right.
> MS>> I now tend to do the following (just atm creating a better playground
> MS>> example in CODI + hack on the ClientSideWindowHandler):
> MS>>
> MS>> a.) the cookie thingy is pretty bääh. it just doesn't work if a
> user clicks
> MS>> quickly through a list and opens lots of 'detail pages' on different tabs
> MS>> within 2 seconds.
> MS>>
> MS>> b.) it's currently a 'one or the other' thingy, and I now thought about
> MS>> combining the lazyWindowIdDropp.js and the current windowhandler.js
> MS>>
> MS>> My current research goes into the direction of
> MS>>
> MS>> 1.) always adding the windowId to each and every link and transport the
> MS>> windowId only via this parameter.
> MS>>
> MS>> 2.) For HTML5-browsers (detected via UserAgent) I render the
> MS>> windowhandler.html intermediate page which does all the fancy stuff of
> MS>> dynamically applying the old DOM on the intermediate page, etc. For other
> MS>> clients we rely on the lazyWindowId script.
> Ok, sounds promising. So, I'll focus on how to fix the logic for myfaces
> core server side state saving
> (org.apache.myfaces.renderkit.ServerSideStateCacheImpl), with the alternative
> proposed in this mail (WindowIdRenderKitAware interface, and then use a
> RenderKit wrapper).
> The idea is doing this simple steps:
> <faces-config xmlns="http://java.sun.com/xml/ns/javaee"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
> version="2.0">
> <render-kit>
> <render-kit-id>HTML_BASIC</render-kit-id>
> <render-kit-class>org.apache.myfaces.renderkit.windowid.WindowIdRenderKitWrapper</render-kit-class>
> </render-kit>
> </faces-config>
> And writing a wrapper like this:
> public class WindowIdRenderKitWrapper extends RenderKitWrapper implements WindowIdRenderKitAware
> {
>
> private RenderKit delegate;
> public WindowIdRenderKitWrapper(RenderKit delegate)
> {
> super();
> this.delegate = delegate;
> }
> @Override
> public RenderKit getWrapped()
> {
> return delegate;
> }
> public String getCurrentWindowId(FacesContext facesContext)
> {
> return facesContext.getExternalContext().getRequestParameterMap().get("windowId");
> }
> }
> Allow server side state saving to get a windowId identifier to "chain" the views inside a window and use that logic to discard old views and prevent view expired exceptions.
--
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