hi leo,

@window-id:

we have a window(-id) concept e.g. in trinidad, icefaces, cdi (at least a
conversation-id which should be specific to a window), codi,... . so we
again have incompatibilities (esp. in case of dialogs,...) which can't be
solved by just wrapping something. -> adding the concept to the spec. is a
good idea in any case.

>furthermore, a spi would allow to implement a myfaces-core2 specific add-on
for libs like codi.

-> still +1 for prototyping it + a spi for using it for e.g. a
codi/myfaces-core2 add-on.

regards,
gerhard

http://www.irian.at

Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German

Professional Support for Apache MyFaces



2011/5/11 Leonardo Uribe <lu4...@gmail.com>

> Hi
>
> Working on this stuff I have found a problem with our current
> ResponseStateManager implementation. The spec javadoc says this:
>
> "... ResponseStateManager is the helper class to StateManager that
> knows the specific rendering technology being used to generate the
> response. It is a singleton abstract class, vended by the RenderKit.
> This class knows the mechanics of saving state, whether it be in
> hidden fields, session, or some combination of the two. ..."
>
> For this particular problem, that means if we need a windowId using
> url/hidden fields/cookies or whatever, the standard solution could
> include a wrapper or alternative implementation of
> ResponseStateManager, setup using a RenderKitWrapper (since JSF 2.0).
> If that so, there is no need for any SPI interface, because the spec
> has already seen that.
>
> In practice, frameworks like trinidad for example just override
> ViewHandler/StateManager/ResponseStateManager, so we have never seen
> anything wrong per years in our implementation ... until now that we
> want to try a wrapper for this class.
>
> Note on the spec javadoc this subtle phrase: "... This class knows the
> mechanics of saving state ..." What that suppose to mean? It means
> that the responsibilities of ResponseStateManager are:
>
> 1. Deal with RenderKit specific state saving mechanism (use hidden
> fields, javascript, ....). (Ok, that's pretty obvious but the next one
> is not.)
>
> 2. Deal with client/server side state saving details, including
> storing/retrieving/caching operations.
>
> I deducted the second one doing the cleanup of the code. To isolate
> the storing/retrieving/caching code I created a class called
> StateCache, but after a closer examination, I saw that each time
> StateCache is called, ResponseStateManager was called too to consume
> or provide params to this class. So it has more sense to put that code
> where it really belongs, inside our ResponseStateManager
> implementation. Just for curiosity I checked if Mojarra, is doing this
> and it is, so there is no doubt.
>
> So, what does StateManager really do? this class deals with
> save/restore the component tree and delegates the remaining stuff to
> ResponseStateManager. The same is for
> javax.faces.view.StateManagementStrategy, but in this case, this class
> is more coupled with the VDL implementation.
>
> Now, for the case we are discussing, any solution for this one should
> provide its own implementation/wrapper for ResponseStateManager and
> some other classes (maybe override ExternalContext and ViewHandler to
> append windowId query param or anything you can imagine). It is
> obvious that frameworks overriding the default ResponseStateManager
> will require a custom variant, but I think is the way to go.
>
> From the spec point of view, I think we can create additional
> interfaces to deal with operations like caching and state encryption,
> but for now there are implementation details for each
> ResponseStateManager implementation.
>
> So, the plan for now is fix MyFaces ResponseStateManager
> implementation (I'll commit it soon) and add the param to limit the
> views stored with sucessive postbacks as a "partial workaround". To
> solve the window problem it is possible we need a "combined solution".
>
> Comments and suggestions are welcome.
>
> Leonardo
>
> 2011/5/11 Gerhard Petracek <gerhard.petra...@gmail.com>:
> > hi werner,
> > it's the other way round - a jsf impl is able to do way more in a
> portable
> > way (as soon as it is in the spec) than codi.
> > what we should prototype (imo):
> >  - window-id
> >  - request token
> >
> > regards,
> > gerhard
> > http://www.irian.at
> >
> > Your JSF powerhouse -
> > JSF Consulting, Development and
> > Courses in English and German
> >
> > Professional Support for Apache MyFaces
> >
> >
> >
> > 2011/5/11 Werner Punz <werner.p...@gmail.com>
> >>
> >> Hi why not introduce a url param as view window/tag token and
> >> then basically hook the map history in the session onto this token if
> >> given.
> >> We could use codi window id for that token. If present we can handle
> >> multiple maps per session if not then we run within the old scheme.
> >> Outside of codi you simply have to duplicate the window param id one way
> >> or the other.
> >>
> >> Unless we have a different way to identify different maps depending on
> >> their window.
> >> The viewstate history param then would map to number of views per window
> >> and if no window id is given we basically run in the old scheme just
> with
> >> one indirection more in accessing the viewroot from the session point of
> >> view.
> >> I dont think any of those changes would break the spec.
> >>
> >>
> >> Werner
> >>
> >>
> >> Am 11.05.11 04:49, schrieb Leonardo Uribe:
> >>>
> >>> Hi
> >>>
> >>> There is an old, known problem related to server side state saving,
> >>> that becomes more evident in JSF 2.0 and its ajax support.
> >>>
> >>> For more information about it, you can see:
> >>>
> >>> https://issues.apache.org/jira/browse/MYFACES-3117
> >>> Current server state saving implementation prevents multi-window usage
> >>> https://issues.apache.org/jira/browse/MYFACES-1791
> >>> state management and multiple frames
> >>>
> >>> The objective of this mail is get some information from MyFaces
> >>> community, given the difficulty involved in solve this problem.
> >>>
> >>> In few words: "... There is a problem in JSF when more than one window
> >>> are opened in an application. There are only a maximum number of
> >>> NUMBER_OF_VIEWS_IN_SESSION view states saved at one moment (when
> >>> server side state saving is enabled). If 2 windows are opened and you
> >>> navigate on one of them for NUMBER_OF_VIEWS_IN_SESSION times, you will
> >>> lose the other window's state. ..."
> >>>
> >>> MyFaces algorithm for cache sessions is just a Map with a limited size
> >>> that just save every view and remove the least recently used one.
> >>>
> >>> The limit is configured using this web config param:
> >>>
> >>> org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION
> >>>
> >>> That defines the number of views per session allowable by an specific
> >>> user.
> >>>
> >>> To solve this issue, we must consider two valid use cases:
> >>>
> >>> 1. Back Button: The user press browser's back button and then do a
> >>> submit. In practice, there are some cases where press browser's back
> >>> button is valid, but others where a back button should not be allowed.
> >>> 2. Double Submit: The user press twice the submit button.
> >>>
> >>> Many efforts has been done in this area, for example see the this post
> >>> from Mario Ivankovits:
> >>>
> >>>
> >>>
> http://myfaces.apache.org/orchestra/myfaces-orchestra-core/multiwindow.html
> >>>
> >>> and in the latest times, there is some code interesting code in MyFaces
> >>> Codi.
> >>>
> >>> A real solution for this one should be handled at level spec, but that
> >>> does not means we can't do anything from myfaces side.
> >>>
> >>> I'm thinking on make our caching strategy more smarter when it decides
> >>> which view should be removed from the map, creating a new param that
> >>> limits the number of views that can be stored from sequential POST
> >>> requests. This will limit the amount of browser back button clicks
> >>> without get an expired exception, but on the other side it will
> >>> preserve the views available for other windows doing other POST
> >>> requests. Note this will not work on applications that uses
> >>> POST-Redirect-GET pattern.
> >>>
> >>> Suggestions are welcome.
> >>>
> >>> Leonardo Uribe
> >>>
> >>
> >>
> >
> >
>

Reply via email to