0 Replies Latest reply on Dec 29, 2006 4:21 PM by Ly Le

    ajax4jsf commandLink and s:conversationPropagation

    Ly Le Newbie

      Hello everyone,

      I am having trouble to get s:conversationPropagation working with an a4j:commandLink. I have a master/detail scenerio where a click on row of my master page will open a new window with detail information. This new window is opened through javascript and loaded with data through a page action. I also start a conversation with explicit id when the new window is opened. In this new window, I have various a4j:commandLink, which calls the same conversation-scope bean to query and re-render the page (of course thru ajax). However, I notice that whenever the link is clicked, a new conversation is created and my previous data is not propagated over. Do you know what happens?

      Here is my xhtml snippet of the detail screen:


      <ul class="buttons-toggle">
       <li class="left">
       <a4j:commandLink action="#{detailsearch.applyScale1}" styleClass="#{detailsearch.scale1ButtonStyle}" value="1x" reRender="scaleWrapper" limitToList="true"
       onclick="selectMe(this);" oncomplete="setBarHeight();">
       <s:conversationPropagation type="join"/>
       </a4j:commandLink>
       </li>
       <li>
       <a4j:commandLink action="#{detailsearch.applyScale2}" styleClass="#{detailsearch.scale2ButtonStyle}" value="2x" reRender="scaleWrapper" limitToList="true"
       onclick="selectMe(this);" oncomplete="setBarHeight();">
       <s:conversationPropagation type="join"/>
       </a4j:commandLink>
       </li>
       <li class="right">
       <a4j:commandLink action="#{detailsearch.applyScale3}" styleClass="#{detailsearch.scale3ButtonStyle}" value="3x" reRender="scaleWrapper" limitToList="true"
       onclick="selectMe(this);" oncomplete="setBarHeight();">
       <s:conversationPropagation type="join"/>
       </a4j:commandLink>
       </li>
       </ul>


      Here is my pages.xml:
      <page view-id="/account/details.xhtml" action="#{detailsearch.findSessions(selectedAlertSession)}" >
      
       </page>

      Here is my action bean:
      @Name("detailsearch")
      @Scope(ScopeType.CONVERSATION)
      @GALoggedIn
      public class GAAccountDetailsAction {
      
       @In
       private Session gadb;
       @In
       private GAHostAppInfo hostApp;
       @In
       private FacesMessages facesMessages;
       @Logger
       private Log log;
       @DataModel
       private List<GASession> sessionList;
       @DataModelSelection
       private GASession dmSession;
      
       @In(required=false) @Out(required=false)
       private GASession selectedSession;
      
       private long totalSessions;
       private int scale;
       private GASession sessionTmpl;
       private List<GAUISessionProp> sessionPropList;
       private String maxOrMin;
      @Begin(id="#{selectedAlertSession.id}",join=true)
      public String findSessions(GASession selectedAlertSession) {
       log.debug("in findSessions(): selectedSession==null?" + (selectedSession==null));
       try {
       if (selectedSession == null) {
       init();
       if (selectedAlertSession != null) {
       selectedSession = selectedAlertSession;
       totalSessions = countSessions();
       getSessions();
       } else {
       facesMessages.addFromResourceBundle(Constants.NO_ACCOUNT_SELECTED);
       return "error";
       }
       }
       return "details";
       } catch (Throwable t) {
       log.error("Exception in findSessions()", t);
       facesMessages.addFromResourceBundle(Constants.APPLICATION_ERROR);
       return "error";
       }
       }
      
      public void applyScale1() {
       try {
       log.debug("in applyScale1()");
       this.scale = 1;
       getSessions();
       } catch (Throwable t) {
       log.error("Error while applying scale", t);
       facesMessages.addFromResourceBundle(Constants.APPLICATION_ERROR);
       }
       }


      I also notice that after the applyScale1() method is called, the findSessions() is called again due to page action. My question is since it is an ajax request, shouldn't the page action be invoked? I thought page action is only invoked when the page is rendered, does this imply every interaction to the server from that page will cause JSF to render the page and hence, page action is invoked?

      Why s:conversationPropagation with type="join" doesn't join the previous conversation?

      Is there any better way to do achieve this if my current approach is not working?

      Thanks.