[richfaces-issues] [JBoss JIRA] (RF-12145) RF4.2: Render and Oncomplete attributes not evaluated after invokeApplication if command is not rendered anymore

Jan Papousek (JIRA) jira-events at lists.jboss.org
Wed Apr 25 10:49:18 EDT 2012


     [ https://issues.jboss.org/browse/RF-12145?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Jan Papousek updated RF-12145:
------------------------------

           Description: 
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}

  was:
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.

    Steps to Reproduce: 
# download [sample WAR file|https://issues.jboss.org/secure/attachment/12353641/zOnc42WithLibs.war] and add Richfaces libs to it
# start Apache Tomcat 6/7 and deploy the WAR file
# open http://localhost:8080/zOnc42WithLibs/faces/oncomplete.xhtml
# click on the "RichFaces Post" button
#* alert window "after action listener" is shown (correct)
# click on the "Clear" button
# disable "Post button rendered" checkbox
# click on the "RichFaces Post" button
#* alert window "before action listener" is shown (wrong)
           Environment: 
MyFaces 2.1.6 / Mojarra 2.1.7
Tomcat 6.0.35 / 7.0.26

  was:
MyFaces 2.1.6
Tomcat 6.0.35


    
> 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) 
>    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: Jan Papousek
>            Priority: Critical
>         Attachments: onc333.war, onc42.war, zOnc333WithLibs.war, zOnc42New.war, zOnc42WithLibs.war
>
>
> 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: https://issues.jboss.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the richfaces-issues mailing list