[ https://issues.apache.org/jira/browse/MYFACES-3451?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Leonardo Uribe updated MYFACES-3451: ------------------------------------ Status: Patch Available (was: Open) > [core] Improve PSS algorithm when a dynamic view (use of c:if or ui:include > src=#{...}) is used > ----------------------------------------------------------------------------------------------- > > Key: MYFACES-3451 > URL: https://issues.apache.org/jira/browse/MYFACES-3451 > Project: MyFaces Core > Issue Type: Improvement > Components: JSR-314 > Reporter: Leonardo Uribe > Assignee: Leonardo Uribe > Attachments: MYFACES-3451-1.patch > > > Implement change according to mail sent about it to dev list under the name: > [core] Improve PSS algorithm when a dynamic view (use of c:if or ui:include > src=#{...}) is used > In the last months I have been working on a solution to improve Partial State > Saving (PSS) performance in cases where the view is updated dynamically by > effect of a facelet tags like: > - <c:if ...> > - <c:when> > - <ui:include src="#{...}"> > - <ui:decorate template="#{...}"> > In simple words, any use of the previous tags in a page causes all components > inside them to be saved and restored fully. The side effect is the overall > state gets bigger. With the introduction of PSS in JSF 2.0, instead save an > array of properties, a key/value pairs are used, so usually this effect is > difficult to notice, but it is relevant specially when <ui:include > src="#{...}"> is used to update content dynamically. It is quite simple to > find examples with a search engine on the internet. > I'll explain in detail what's going on. > Let's see what happen when c:if is used: > <c:if test="#{condition}"> > <h:outputText value="Some text"/> > </c:if> > The first time the view is rendered, if the condition is false, the component > is not added, but later in a postback if the condition changes from false to > true, the component is added. Here the algorithm have two options: > 1. Ignore it. > 2. Mark the component or branch to be restored fully. > Most of the time ignore (1) is ok, but in some complex cases the state synch > is lost, because test="#{condition}" is evaluated every time the view is > restored, with different results. The users usually have reported this as > "state get lost" or ClassCastException problems. To deal with such cases, a > special mode was added in MyFaces to implement (2) with a web config param > called org.apache.myfaces.REFRESH_TRANSIENT_BUILD_ON_PSS. > But what happen if the algorithm save c:if "condition" the first time the > view is rendered? With that, PSS algorithm will always restore the initial > view as expected. Recently in 2.0.10 / 2.1.4, this improvement (MYFACES-3329) > was added so it is no longer necessary to enable the web config param. Great! > But note this does not solve the "state gets bigger" problem. > Now consider what happen if c:if "condition" is saved every time it change > (before render response). If the condition is false and changes to true, the > initial state will now be restored including the > component, so if it is called markInitialState() over the component, and then > the delta is saved, the state size will be smaller and finally it will be > saved more efficently, because the initial state is the one who gets bigger, > instead the part that is saved as delta. > This solution can be applied to <c:if ...>, <c:when>, <ui:include > src="#{...}"> and <ui:decorate template="#{...}">, which is enough because > <c:forEach> can be replaced with <h:dataTable rowStatePreserved=true ...> or > a similar component like the ones available in Tomahawk or any other variant. > It is interesting to note the solution also fix the problem when <h:dataTable > rowStatePreserved=true ...> is used inside a dynamic part. > Fortunately, the spec doesn't say anything about how markInitialState() is > called, and let it as an implementation detail. Also, > javax.faces.IS_BUILDING_INITIAL_STATE description is so general that even > with the change there is no need to change the javadoc. After considering all > history behind PSS algorithm, it seems reasonable to activate > markInitialState() call and set javax.faces.IS_BUILDING_INITIAL_STATE to true > when a dynamic update in a component tree is done by a facelet tag, and > deactivate it as soon as the code process the content. > At the end, applications using the previous tags will have a really huge > improvement into its state. But anyway, since it is a "extension" of the > initial intention of the flag, I consider desirable to mention it. It is > difficult to measure the impact, because it depends of the view structure > itself, but it sounds like a very promising change. > Suggestions, opinions and what you do want to say about this proposed change > is welcome. If no objections, I'll commit the proposed change soon. -- 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