[
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