]
Michael Heinen commented on RF-12145:
-------------------------------------
The rendered-checks are no real alternative for us.
We have to reduce the size of the component tree via c-if at some spots in order to
improve performance by removing complex structures from the view.
The EL expressions of subcomponents with parents with attribute rendered=false are
unfortunately evaluated again and again.
Our app is grown over 7 years with hundreds of thousands lines of code. We migrated it
from RF 3.3.3 to RF 4.2 and found this regression.
I have attached a workaround with a phase listener and a patched
ExtendedPartialViewContextImpl
Yo don't have to copy and paste my sources into another project. The attached project
zOnc42WithLibs.war is a complete web app (without the richfaces jars due to the upload
size limitation) with one single(!) xhtml file and two(!) java classes. What do you
expect? Only one java class?
I helped you a lot by creating a small sample application, attaching a workaround and
testing your fix against the milestone therefore I can't understand your comment at
all.
RF4.2: Render and Oncomplete attributes not evaluated after
invokeApplication if command is not rendered anymore
----------------------------------------------------------------------------------------------------------------
Key: RF-12145
URL:
https://issues.jboss.org/browse/RF-12145
Project: RichFaces
Issue Type: Bug
Security Level: Public(Everyone can see)
Components: component-a4j-core, core
Affects Versions: 4.2.0.Final
Environment: MyFaces 2.1.6 / Mojarra 2.1.7
Tomcat 6.0.35 / 7.0.26
Reporter: Michael Heinen
Assignee: Lukáš Fryč
Fix For: 4.3.0.M3
Attachments: onc333.war, onc42.war, RF-12145.zip, zOnc333WithLibs.war,
zOnc42New.war, zOnc42WithLibs.war
Original Estimate: 3 hours
Remaining Estimate: 3 hours
Sample use case:
The last page of a wizard contains a commandButton with an EL expressions in the
oncomplete attribute and in the render attribute.
This button renders an outer component in order to close the wizard. The button itself is
not rendered anymore after clicking it.
As a consequence the EL expressions of the oncomplete attribute and of the render
attribute is not evaluated after the invocation of an actionListener.
This worked well with richfaces 3.3.3, therefore it's a critical regression.
I'll attach a sample webApp for richfaces 4.2 and for riochfaces 3.3.3
Note that the render attribute of f:ajax is evaluated correctly.
These attributes of the clicked command must be evaluated in phase render response in all
cases.
----
{code:title="OncController.java"}
package com;
import java.util.Map;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
@ManagedBean(name = "OncController")
@SessionScoped
public class OncController
{
private boolean innerShown = true;
private int calls = 0;
public OncController()
{
}
public boolean isInnerShown()
{
return innerShown;
}
public void setInnerShown(boolean aInnerShown)
{
innerShown = aInnerShown;
}
public void clear(final ActionEvent ae)
{
innerShown=true;
calls=0;
}
public void doIt(final ActionEvent ae)
{
final Map<String, Object> requestMap =
FacesContext.getCurrentInstance().getExternalContext()
.getRequestMap();
requestMap.put("key1", "alert('after
actionListener');");
requestMap.put("key2", "group2");
calls++;
}
public String getOncomplete()
{
final Map<String, Object> requestMap =
FacesContext.getCurrentInstance().getExternalContext()
.getRequestMap();
final String value = (String) requestMap.get("key1");
if (value != null)
{
return value;
}
else
{
return "alert('before actionListener');";
}
}
public String getRenderIdsRichfaces()
{
final Map<String, Object> requestMap =
FacesContext.getCurrentInstance().getExternalContext()
.getRequestMap();
final String value = (String) requestMap.get("key2");
if (value != null)
{
return ","+value;
}
return"";
}
public String getRenderIdsFAjax()
{
final Map<String, Object> requestMap =
FacesContext.getCurrentInstance().getExternalContext()
.getRequestMap();
final String value = (String) requestMap.get("key2");
if (value != null)
{
return " " + value;
}
return"";
}
public int getCalls()
{
return calls;
}
}
{code}
{code:title="oncomplete.xhtml"}
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<ui:composition>
<h:head><title>Oncomplete test</title></h:head>
<h:body>
<a4j:log mode="popup"/>
<h:form id="myForm">
Post button rendered:<h:selectBooleanCheckbox id="innerBool"
value="#{OncController.innerShown}"/>
<br/>
<h:panelGroup id="outer">
<c:if test="#{OncController.innerShown}">
<a4j:commandButton value="RichFaces Post"
actionListener="#{OncController.doIt}"
render="outer,details#{OncController.renderIdsRichfaces}"
oncomplete="#{OncController.oncomplete}"/>
<h:commandButton value="fAJAX Post"
actionListener="#{OncController.doIt}">
<f:ajax render="outer details#{OncController.renderIdsFAjax}"
execute="@form"/>
</h:commandButton>
</c:if>
</h:panelGroup>
<br/><br/>
<h:panelGroup id="details">
oncomplete: <h:outputText value="#{OncController.oncomplete}"/>
</h:panelGroup>
<br/><br/>
<h:panelGroup id="group2">
calls: <h:outputText value="#{OncController.calls}"/>
</h:panelGroup>
<br/><br/>
<a4j:commandButton value="Clear"
actionListener="#{OncController.clear}"
render="myForm" />
</h:form>
</h:body>
</ui:composition>
</html>
{code}
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: