1 2 3 Previous Next 32 Replies Latest reply on Jan 11, 2013 7:39 AM by Horst Martinelli

    Help with back button

    Arbi Sookazian Master

      I have a Seam 2.0 app and am currently trying to solve the back button problem.  The back button seems to work very well with the online demo of Seam booking app: http://demo.flamingo.exadel.com/booking/home.seam.


      Case in point:


      main.xhtml


      This is very similar to my main page (ManageEquipment.xhtml) in that there is initially only a search inputtext and submit button.  User enters a serial number and clicks submit.  A dataTable is rendered on same page.


      So same use case as part of the booking example (main.xhtml).  in the booking example you run a search and click view hotel link.  Now if you click browser back button, you see the screen as it was rendered right before you navigated away from it to hotel.xhtml.


      When I click on my link to navigate away from main.xhtml and then click back button in browser, the dataTable is not rendered any more.  Essentially all the data is gone and user is forced to completely start over the use case by entered serial number and clicking submit button.


      I commented out the @End annotations in my backing SFSB for the main.xhtml.  It still behaves this improper way when user clicks back button on browser.


      How can I solve this problem?  When I looked at the pages.xml in the booking code, I didn't see anything special.


      /*****************************************************************************************************/


      Just noticed this:


      http://localhost:8080/BETS/ManageEquipment.seam (this is my main.xhtml equivalent)
      http://localhost:8080/BETS/CreateRepairCase.seam?cid=19


      http://demo.flamingo.exadel.com/booking/main.seam?cid=47308


      does the lack of cid param in the URL for ManageEquipment.seam have anything to do with this behavior?

        • 1. Re: Help with back button
          Arbi Sookazian Master

          sorry, CreateRepairCase.seam is the page the user navigates to after clicking a link in the dataTable in ManageEquipment.seam.

          • 2. Re: Help with back button
            Arbi Sookazian Master

            Here is a difference:


            booking main.xhtml (inside h:dataTable tags):


            <h:column id="column5">
                           <f:facet id="ActionFacet" name="header">Action</f:facet>
                           <s:link id="viewHotel" value="View Hotel" action="#{hotelBooking.selectHotel(hot)}"/>
                      </h:column>



            ManageEquipment.xhtml (inside rich:dataTable tags):


            <rich:column>
                                                        <f:facet name="header"><h:outputText value=""/></f:facet>
                                                         <a4j:commandLink value="Create" 
                                                                              action="#{manageEquipment.setCreateMode}"
                                                                              rendered="#{workOrder.equipmentRepairId == null}"/>
                                                         <a4j:commandLink value="Edit" 
                                                                              action="#{manageEquipment.processRepairHistorySelection}"
                                                                              rendered="#{workOrder.equipmentRepairId ne null}"/>
                                                    </rich:column>     

            • 3. Re: Help with back button
              Arbi Sookazian Master

              OK so I did a quick POC to break things down a bit and simplify the problem if possible.


              .xhtml (first one):


              <h:form>
                         <rich:dataTable id="courseList" 
                                         var="course"
                                       value="#{testBackButtonAction.searchResults}" 
                                       rendered="#{not empty testBackButtonAction.searchResults}"> 
                                <h:column>
                                    <f:facet name="header"><h:outputText value="Course ID"/></f:facet>               
                                    <s:link view="/TestBackButton2.xhtml"  value="#{course}"/>
                                </h:column>  
                      </rich:dataTable>  
                      
                      <h:inputText value="#{testBackButtonAction.userInputCourseId}" id="searchBox"/>
                      <h:commandButton  id="searchBtn" value="search" action="#{testBackButtonAction.search}" reRender="courseList"/>
                      <a4j:commandLink id="goNext" value="goNext" action="#{testBackButtonAction.goNext}"/>     
                   </h:form>   



              .xhtml (2nd one):


              <h:form>
                         <a4j:commandLink id="btnBack" 
                                                  value="go back" 
                                                  action="#{courseList.goBack}"/>
                   </h:form>



              backing SFSB:


              @Name("testBackButtonAction")
              @Stateful
              public class TestBackButtonAction implements TestBackButtonLocal {
              
                   @Logger
                   private Log log;
                   
                   private List<Integer> searchResults;
                   
                   private Integer userInputCourseId;
                   
                   private Integer courseId;
              
                   public String goNext() {
                        
                        return "/TestBackButton2.xhtml";
                   }
              
                   
                   //@Begin(join = true)
                   public void search() {
                        log.info("courseList.search() called. input courseId for search is: "+this.userInputCourseId);
                      //put your search logic here and populate the searchResults
                        this.searchByCourseId(this.userInputCourseId);          
                   }
              
              
                   public List<Integer> getSearchResults() {
                        return searchResults;
                   }
                   
                   public void searchByCourseId(Integer userInputCourseId) {
                        searchResults = new ArrayList<Integer>();
                        searchResults.add(userInputCourseId);
                   }
                   
                   
                   
                   @Remove @Destroy
                   public void destroy() {     }
              
              
                   public Integer getUserInputCourseId() {
                        return userInputCourseId;
                   }
              
              
                   public void setUserInputCourseId(Integer userInputCourseId) {
                        this.userInputCourseId = userInputCourseId;
                   }
              
              }



              Back button on browser from xhtml 2 works fine with or w/o the @Begin.  So that means with temp conv or with LRC the dataTable is still rendered and data is intact when I go back to first page via back button on browser (or via commandLink).

              • 4. Re: Help with back button
                Arbi Sookazian Master

                Why


                is


                this


                the


                only


                forum


                that


                does


                not


                have


                an


                edit


                button?


                I meant this:


                <h:form>
                           <a4j:commandLink id="btnBack" 
                                                    value="go back" 
                                                    action="#{testBackButtonAction.goBack}"/>
                     </h:form>

                • 5. Re: Help with back button
                  Arbi Sookazian Master

                  ok so when the @Begin(join=true) is removed, the back links on the 2nd xhtml don't work (they do but the dataTable is not visible/rendered anymore).  But the browser back button in IE7 does work fine (table/data still there).


                  hmmmmmm....


                  Does the @Factory and @DataModel combo have something to do with this problem I'm having?

                  • 6. Re: Help with back button
                    Arbi Sookazian Master

                    both SFSBs (the POC and my project) have this code:


                    @Remove @Destroy
                         public void destroy() {
                              log.info("in destroy");
                         }



                    @Remove So this gets called when the ejb container deems that the SFSB needs to be passivated and/or removed (invalidated) by the client.


                    @org.jboss.seam.annotations.Destroy
                    
                    Alternative to javax.annotations.PreDestroy for use in a pre Java EE 5 environment. Designates a destroy method that is called when a context ends and the component is being disposed.



                    I added a breakpoint in the debugger at the log.info line above and that line is getting hit multiple times even though there is @Begin annotated method that is being exec'd.  It gets hit immediately after I click the browser back button in my use case (not the POC).  Why?


                    Confused as to why this is happening...

                    • 7. Re: Help with back button
                      Arbi Sookazian Master

                      I commented out the @Destroy and there was no effect in terms of UI experience (i.e. the dataTable is not rendered after back button click).


                      I noticed in the debugger that the breakpoint was getting hit still with only the @Remove on the destroy() method.  Why does the container keep  destroying this Seam SFSB component?  Is it normal for the @Remove destroy() to be called so many times during use case execution with @Begin annotation on business method in SFSB?


                      Does the @Remove method get called consistently after you access a business method and there is no LRC running?

                      • 8. Re: Help with back button
                        Arbi Sookazian Master

                        This is all the output to the console immediately after I click the back button on the 2nd page of my app:


                        16:32:27,651 INFO  [ProfilingInterceptor] *** Entering method: getHeader
                        16:32:27,651 INFO  [ProfilingInterceptor] *** Method class org.jboss.ejb3.interceptor.InvocationContextImpl.public java.lang.String com.cox.bets.session.ManageEquipmentAction.getHeader() executed in 0ms ***
                        16:32:27,667 INFO  [ProfilingInterceptor] *** Entering method: getSerialNumber
                        16:32:27,667 INFO  [ProfilingInterceptor] *** Method class org.jboss.ejb3.interceptor.InvocationContextImpl.public java.lang.String com.cox.bets.session.ManageEquipmentAction.getSerialNumber() executed in 0ms ***
                        16:32:27,698 INFO  [ProfilingInterceptor] *** Entering method: getShowCreateNew
                        16:32:27,698 INFO  [ProfilingInterceptor] *** Method class org.jboss.ejb3.interceptor.InvocationContextImpl.public java.lang.Boolean com.cox.bets.session.ManageEquipmentAction.getShowCreateNew() executed in 0ms ***
                        16:32:27,714 INFO  [ProfilingInterceptor] *** Entering method: getShowCreateNew
                        16:32:27,714 INFO  [ProfilingInterceptor] *** Method class org.jboss.ejb3.interceptor.InvocationContextImpl.public java.lang.Boolean com.cox.bets.session.ManageEquipmentAction.getShowCreateNew() executed in 0ms ***
                        16:32:27,792 INFO  [ProfilingInterceptor] *** Entering method: getShowCreateNew
                        16:32:27,792 INFO  [ProfilingInterceptor] *** Method class org.jboss.ejb3.interceptor.InvocationContextImpl.public java.lang.Boolean com.cox.bets.session.ManageEquipmentAction.getShowCreateNew() executed in 0ms ***
                        16:32:27,808 INFO  [ProfilingInterceptor] *** Entering method: getShowCreateNew
                        16:32:27,808 INFO  [ProfilingInterceptor] *** Method class org.jboss.ejb3.interceptor.InvocationContextImpl.public java.lang.Boolean com.cox.bets.session.ManageEquipmentAction.getShowCreateNew() executed in 0ms ***
                        16:32:27,870 INFO  [ProfilingInterceptor] *** Entering method: destroy



                        this is the destroy() method for the same SFSB:


                             @Remove
                             public void destroy () {
                                  log.info("in destroy()");
                             }



                        so why is the destroy() method being called when I click the back button in my browser?  what triggers the ejb container to call it??


                        very strange.  There is no @End annotation in my SFSB and here is the pages.xml:


                        <?xml version="1.0" encoding="UTF-8"?>
                        <pages xmlns="http://jboss.com/products/seam/pages"
                               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                               xsi:schemaLocation="http://jboss.com/products/seam/pages http://jboss.com/products/seam/pages-2.0.xsd"
                        
                               no-conversation-view-id="/home.xhtml"
                               login-view-id="/login.xhtml">
                               
                            <!-- Force users to be authenticated -->
                                
                            <page view-id="*" >
                                  <action execute="#{identity.login}" if="#{not identity.loggedIn}"/>
                                  <navigation>
                                       <rule if="#{not identity.loggedIn}">
                                             <redirect view-id="/error.xhtml">
                                                  <message>Your Cox network login credentials could not be detected.</message>
                                             </redirect>
                                     </rule>
                                  </navigation>
                            </page>
                                  
                            <!-- according to CBauer, "Entries for the conversation list and conversation switcher are only created if the pages have descriptions. 
                                                             So put some descriptions in your conversational pages in pages.xml." 
                                                             see this thread: http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4049848#4049848 -->
                                    
                            <page view-id="/ManageEquipment.xhtml">
                                 <description>Manage Equipment</description>
                                 <navigation from-action="#{manageEquipment.processRepairHistorySelection}">
                                      <redirect view-id="/RepairCaseDetails.xhtml"/>                          
                                </navigation>
                            </page>
                            
                            <page view-id="/BulkCreateRepairCase.xhtml">
                                 <description>Bulk Create Repair Case</description>
                                 <navigation from-action="#{bulkCreateRepairCase.processRepairHistorySelection}">
                                      <redirect view-id="/RepairCaseDetails.xhtml"/>                          
                                </navigation>
                            </page>
                            
                            <page view-id="/ApplicationMetaData.xhtml">    
                                   <action execute="#{applicationMetaData.getDatabaseDetails}"/>
                            </page>
                        
                            <exception class="org.jboss.seam.framework.EntityNotFoundException">
                                <redirect view-id="/error.xhtml">
                                    <message>Not found</message>
                                </redirect>
                            </exception>
                            
                            <exception class="javax.persistence.EntityNotFoundException">
                                <redirect view-id="/error.xhtml">
                                    <message>Not found</message>
                                </redirect>
                            </exception>
                            
                            <exception class="javax.persistence.OptimisticLockException">
                                <end-conversation/>
                                <redirect view-id="/error.xhtml">
                                    <message>Another user changed the same data, please try again</message>
                                </redirect>
                            </exception>
                            
                            <exception class="org.jboss.seam.security.AuthorizationException">
                                <redirect view-id="/error.xhtml">
                                    <message>You don't have permission to do this</message>
                                </redirect>
                            </exception>
                            
                            <exception class="org.jboss.seam.security.NotLoggedInException">
                                <redirect view-id="/login.xhtml">
                                    <message>Please log in first</message>
                                </redirect>
                            </exception>
                            
                            <exception class="javax.faces.application.ViewExpiredException">
                                <redirect view-id="/error.xhtml">
                                    <message>Your session has timed out, please try again</message>
                                </redirect>
                            </exception>
                             
                            <exception>
                                <redirect view-id="/error.xhtml">
                                    <message>Unexpected error, please try again</message>
                                </redirect>
                            </exception>
                            
                        </pages>
                        

                        • 9. Re: Help with back button
                          Arbi Sookazian Master

                          More data (I guess I was wrong about ejb container calling @Remove method??)


                          from SiA:


                          The @Remove method is
                          called when the context containing the session bean reference is destroyed. Seam uses
                          this method to instruct the EJB container to destroy the session bean. If the @Remove
                          method is invoked directly, it leads to an immediate removal of the session bean reference,
                          unless a runtime or remote exception is thrown and the exception class is
                          marked with @ApplicationException (it’s not a system exception) or an exception is
                          thrown that isn’t a runtime or remote exception and the retainIfException attribute
                          on the @Remove annotation is set to true.
                          
                          NOTE Note that there is a distinct difference between the @Remove and @Pre-
                          Destroy annotations. The method marked with the @Remove annotation
                          is called when Seam removes the reference to the instance, and the method
                          marked with the @PreDestroy annotation is called when the EJB 3 container
                          destroys the instance itself.

                          • 10. Re: Help with back button
                            Arbi Sookazian Master

                            I converted the SFSB to a JavaBean and thus bypassing the @Remove destroy() method.


                            Same results after clicking back button.


                            Wow, what a pain and no wonder nobody uses Seam...

                            • 11. Re: Help with back button
                              Arbi Sookazian Master

                              As the French say - finalement!


                              I have discovered the root cause and applied a fix.


                              Root cause is the <a4j:commandButton> I have commented out below:


                              <h:form>
                                                               <h:panelGrid columns="3">
                                                                    <h:column>
                                                                         <b>Serial Number:</b> 
                                                                    </h:column>
                                                                    
                                                                    <h:column>
                                                                        <h:inputText id="serialNumberId" 
                                                                                    value="#{testManageEquipment.serialNumber}" 
                                                                                    size="32" 
                                                                                    maxlength="32" 
                                                                                    required="true">
                                                                         </h:inputText>
                                                                    </h:column>     
                                                                    <h:column>
                                                                         <!-- <a4j:commandButton id="searchButton"                                             
                                                                                             value="Search" 
                                                                                             action="#{testManageEquipment.searchSerialNumber}"   
                                                                                             reRender="form1">  
                                                                         </a4j:commandButton> -->           
                                                                         <h:commandButton id="searchButton"                                             
                                                                                             value="Search" 
                                                                                             action="#{testManageEquipment.searchSerialNumber}"   
                                                                                             reRender="form1">
                                                                         </h:commandButton>                            
                                                                    </h:column>
                                                               </h:panelGrid>     
                                                               <BR/>
                                                               <BR/>
                                                                 <BR/>
                                                                                                                                                
                                                                <a4j:commandLink id="goNext" value="goNext" action="#{testBackButtonAction.goNext}"/>                  
                                                          </h:form>
                                                          <BR/>
                                                          <BR/>
                                                          <BR/>
                                                              <h:form id="form1">     
                                                                   <h:panelGrid columns="2">
                                                                        <h:outputText value="MAC Address:"/>
                                                                      <h:outputText value="#{testManageEquipment.equipmentDetailBean.macAddress}"/>
                                                                      <h:outputText value="Desc:"/>
                                                                      <h:outputText value="#{testManageEquipment.equipmentDetailBean.description}"/>
                                                                 </h:panelGrid>                                             
                                                            </h:form>



                              It works fine with <h:commandButton> as a replacement for the search.  The destroy() method is not executed in that case!


                              What the hell is this?  Is this a known issue in JIRA, etc.?  I tried replacing <h:form> with <a4j:form> for the form that surrounds that commandButton and that didn't help.  Is this a general unknown rule in Seam not to use a4j:commandButton if you want to use browser back button?  Haven't read that anywhere.


                              The problem is that I actually need an AJAX req/resp cycle to occur b/c we are using a4j:status in coordination with a4j:modalPanel to display a please wait modalPanel to the user during the ajax req/resp cycle.


                              I tried this as a workaround (which is most likely counter-intuitive and bad practice but what else can I do?):


                              <h:commandButton id="searchButton"                                             
                                                                                                       value="Search">                                                          
                                                                                             <a4j:support event="onclick" action="#{manageEquipment.searchSerialNumber}"/>
                                                                                   </h:commandButton>



                              but the modalPanel displays too late after a page refresh.


                              Any suggestions?  Gets pretty weird on this board when you talk to yourself :)


                              thx.

                              • 12. Re: Help with back button
                                Arbi Sookazian Master

                                Ok, I decided to analyze the server.log contents immediately after clicking the back button in browser.


                                Here is a sample:


                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.core.Manager] Discarding conversation state: 55
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.contexts.FacesLifecycle] After render response, destroying contexts
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.util.Naming] JNDI InitialContext properties:{java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory, java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces}
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.contexts.Contexts] destroying business process context
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] instantiating Seam component: org.jboss.seam.core.events
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] initializing new instance of: org.jboss.seam.core.events
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] done initializing: org.jboss.seam.core.events
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] instantiating Seam component: org.jboss.seam.core.events
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] initializing new instance of: org.jboss.seam.core.events
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] done initializing: org.jboss.seam.core.events
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.core.Events] Processing event:org.jboss.seam.preDestroyContext.BUSINESS_PROCESS
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] instantiating Seam component: org.jboss.seam.core.events
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] initializing new instance of: org.jboss.seam.core.events
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] done initializing: org.jboss.seam.core.events
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] instantiating Seam component: org.jboss.seam.core.events
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] initializing new instance of: org.jboss.seam.core.events
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] done initializing: org.jboss.seam.core.events
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.core.Events] Processing event:org.jboss.seam.postDestroyContext.BUSINESS_PROCESS
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.contexts.Contexts] destroying conversation context
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] instantiating Seam component: org.jboss.seam.core.events
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] initializing new instance of: org.jboss.seam.core.events
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] done initializing: org.jboss.seam.core.events
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] instantiating Seam component: org.jboss.seam.core.events
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] initializing new instance of: org.jboss.seam.core.events
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] done initializing: org.jboss.seam.core.events
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.core.Events] Processing event:org.jboss.seam.preDestroyContext.CONVERSATION
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.contexts.Contexts] destroying: testManageEquipment
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] instantiating Seam component: org.jboss.seam.core.events
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] initializing new instance of: org.jboss.seam.core.events
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] done initializing: org.jboss.seam.core.events
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] instantiating Seam component: org.jboss.seam.core.events
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] initializing new instance of: org.jboss.seam.core.events
                                2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.Component] done initializing: org.jboss.seam.core.events
                                



                                So why is it destroying my SFSB conversation-scoped component?  There is no @End annotation in my SFSB anywhere.


                                Relevant fwk code:


                                org.jboss.seam.contexts.FacesLifecycle:


                                public static void endRequest(ExternalContext externalContext) 
                                   {
                                      log.debug("After render response, destroying contexts");
                                      try
                                      {
                                         Session session = Session.getInstance();
                                         boolean sessionInvalid = session!=null && session.isInvalid();
                                         
                                         Contexts.flushAndDestroyContexts();
                                
                                         if (sessionInvalid)
                                         {
                                            Lifecycle.clearThreadlocals();
                                            clearPhaseId();
                                            invalidateSession(externalContext);
                                            //actual session context will be destroyed from the listener
                                         }
                                      }
                                      finally
                                      {
                                         Lifecycle.clearThreadlocals();
                                         log.debug( "<<< End JSF request for " + getRequestPath(externalContext) );
                                      }
                                   }



                                org.jboss.seam.core.Manager:


                                /**
                                    * Touch the conversation stack, destroy ended conversations, 
                                    * and timeout inactive conversations.
                                    */
                                   public void endRequest(Map<String, Object> session)
                                   {
                                      if ( isLongRunningConversation() )
                                      {
                                         if ( log.isDebugEnabled() )
                                         {
                                            log.debug("Storing conversation state: " + getCurrentConversationId());
                                         }
                                         touchConversationStack( getCurrentConversationIdStack() );
                                      }
                                      else
                                      {
                                         if ( log.isDebugEnabled() )
                                         {
                                            log.debug("Discarding conversation state: " + getCurrentConversationId());
                                         }
                                         //now safe to remove the entry
                                         removeCurrentConversationAndDestroyNestedContexts(session);
                                      }
                                
                                      /*if ( !Init.instance().isClientSideConversations() ) 
                                      {*/
                                         // difficult question: is it really safe to do this here?
                                         // right now we do have to do it after committing the Seam
                                         // transaction because we can't close EMs inside a txn
                                         // (this might be a bug in HEM)
                                         Manager.instance().conversationTimeout(session);
                                      //}
                                   }



                                Why is this Seam core framework code being executed when I click the back button with a4j:commandButton in my h:form but it doesn't get executed with h:commandButton in my h:form?


                                I tried changing all h: references to a4j: (for buttons, forms, etc.) and that doesn't fix it.


                                Also, I have no BUSINESS_PROCESS scoped components in my app.  So why is that showing in the log snippet above?


                                Here is the dump for Seam component init:


                                16:31:46,683 INFO  [Initialization] Installing components...
                                16:31:46,792 INFO  [Component] Component: applicationMetaData, scope: SESSION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.ApplicationMetaDataAction, JNDI: BETS/ApplicationMetaDataAction/local
                                16:31:46,808 INFO  [Component] Component: applicationSetting, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.ApplicationSettingsAction, JNDI: BETS/ApplicationSettingsAction/local
                                16:31:46,824 INFO  [Component] Component: authenticator, scope: STATELESS, type: STATELESS_SESSION_BEAN, class: com.cox.bets.session.Authenticator, JNDI: BETS/Authenticator/local
                                16:31:46,824 INFO  [Component] Component: authorizer, scope: SESSION, type: JAVA_BEAN, class: com.cox.bets.session.TestAuthorizer
                                16:31:46,824 INFO  [Component] Component: bulkCreateRepairCase, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.BulkCreateRepairCaseAction, JNDI: BETS/BulkCreateRepairCaseAction/local
                                16:31:46,824 INFO  [Component] Component: bulkCreateRepairCaseSupport, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.BulkCreateRepairCaseSupportBean, JNDI: BETS/BulkCreateRepairCaseSupportBean/local
                                16:31:46,839 INFO  [Component] Component: bulkCreateWorkOrdersBean, scope: CONVERSATION, type: JAVA_BEAN, class: com.cox.bets.session.BulkCreateWorkOrdersBean
                                16:31:46,839 INFO  [Component] Component: bypassAuthenticator, scope: EVENT, type: JAVA_BEAN, class: com.cox.bets.session.BypassAuthenticator
                                16:31:46,839 INFO  [Component] Component: calculateUtils, scope: EVENT, type: JAVA_BEAN, class: com.cox.bets.utils.CalculateUtils
                                16:31:46,839 INFO  [Component] Component: codes, scope: CONVERSATION, type: JAVA_BEAN, class: com.cox.bets.session.Codes
                                16:31:46,839 INFO  [Component] Component: createRepairCase, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.CreateRepairCaseAction, JNDI: BETS/CreateRepairCaseAction/local
                                16:31:46,839 INFO  [Component] Component: entityManager, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.persistence.ManagedPersistenceContext
                                16:31:46,855 INFO  [Component] Component: entityManagerDSS, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.persistence.ManagedPersistenceContext
                                16:31:46,855 INFO  [Component] Component: equipmentDetailBean, scope: EVENT, type: JAVA_BEAN, class: com.cox.bets.session.EquipmentDetailBean
                                16:31:46,855 INFO  [Component] Component: equipmentHistoryDetailBean, scope: EVENT, type: JAVA_BEAN, class: com.cox.bets.session.EquipmentHistoryDetailBean
                                16:31:46,855 INFO  [Component] Component: equipmentHistoryMovementBean, scope: EVENT, type: JAVA_BEAN, class: com.cox.bets.session.EquipmentHistoryMovementBean
                                16:31:46,855 INFO  [Component] Component: equipmentRepair, scope: CONVERSATION, type: ENTITY_BEAN, class: com.cox.bets.entity.EquipmentRepair
                                16:31:46,855 INFO  [Component] Component: equipmentRepairCost, scope: CONVERSATION, type: ENTITY_BEAN, class: com.cox.bets.entity.EquipmentRepairCost
                                16:31:46,855 INFO  [Component] Component: hibernateUtils, scope: EVENT, type: JAVA_BEAN, class: com.cox.bets.utils.hibernate.HibernateUtils
                                16:31:46,855 INFO  [Component] Component: jdbcUtils, scope: EVENT, type: JAVA_BEAN, class: com.cox.bets.utils.JdbcUtils
                                16:31:46,855 INFO  [Component] Component: listManagement, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.ListManagementAction, JNDI: BETS/ListManagementAction/local
                                16:31:46,870 INFO  [Component] Component: macAddressConverter, scope: CONVERSATION, type: JAVA_BEAN, class: com.cox.bets.utils.converters.MacAddressConverter
                                16:31:46,870 INFO  [Component] Component: manageEquipment, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.ManageEquipmentAction, JNDI: BETS/ManageEquipmentAction/local
                                16:31:46,870 INFO  [Component] Component: monitorConversationTimeout, scope: STATELESS, type: STATELESS_SESSION_BEAN, class: com.cox.bets.session.MonitorConversationTimeoutBean, JNDI: BETS/MonitorConversationTimeoutBean/local
                                16:31:46,870 INFO  [Component] Component: newWorkOrdersBean, scope: CONVERSATION, type: JAVA_BEAN, class: com.cox.bets.session.NewWorkOrdersBean
                                16:31:46,870 INFO  [Component] Component: org.jboss.seam.async.dispatcher, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.async.ThreadPoolDispatcher
                                16:31:46,886 INFO  [Component] Component: org.jboss.seam.captcha.captcha, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.captcha.Captcha
                                16:31:46,886 INFO  [Component] Component: org.jboss.seam.captcha.captchaImage, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.captcha.CaptchaImage
                                16:31:46,886 INFO  [Component] Component: org.jboss.seam.core.ConversationIdGenerator, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.core.ConversationIdGenerator
                                16:31:46,886 INFO  [Component] Component: org.jboss.seam.core.contexts, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.core.Contexts
                                16:31:46,886 INFO  [Component] Component: org.jboss.seam.core.conversation, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.core.Conversation
                                16:31:46,886 INFO  [Component] Component: org.jboss.seam.core.conversationEntries, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.core.ConversationEntries
                                16:31:46,886 INFO  [Component] Component: org.jboss.seam.core.conversationListFactory, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.core.ConversationList
                                16:31:46,886 INFO  [Component] Component: org.jboss.seam.core.conversationPropagation, scope: EVENT, type: JAVA_BEAN, class: org.jboss.seam.core.ConversationPropagation
                                16:31:46,886 INFO  [Component] Component: org.jboss.seam.core.conversationStackFactory, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.core.ConversationStack
                                16:31:46,886 INFO  [Component] Component: org.jboss.seam.core.events, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.core.Events
                                16:31:46,886 INFO  [Component] Component: org.jboss.seam.core.expressions, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.faces.FacesExpressions
                                16:31:46,886 INFO  [Component] Component: org.jboss.seam.core.interpolator, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.core.Interpolator
                                16:31:46,886 INFO  [Component] Component: org.jboss.seam.core.locale, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.international.Locale
                                16:31:46,902 INFO  [Component] Component: org.jboss.seam.core.manager, scope: EVENT, type: JAVA_BEAN, class: org.jboss.seam.faces.FacesManager
                                16:31:46,902 INFO  [Component] Component: org.jboss.seam.core.resourceBundle, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.core.ResourceBundle
                                16:31:46,902 INFO  [Component] Component: org.jboss.seam.core.resourceLoader, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.faces.ResourceLoader
                                16:31:46,902 INFO  [Component] Component: org.jboss.seam.core.validators, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.core.Validators
                                16:31:46,902 INFO  [Component] Component: org.jboss.seam.debug.contexts, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.debug.Contexts
                                16:31:46,917 INFO  [Component] Component: org.jboss.seam.debug.hotDeployFilter, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.debug.hot.HotDeployFilter
                                16:31:46,917 INFO  [Component] Component: org.jboss.seam.debug.introspector, scope: EVENT, type: JAVA_BEAN, class: org.jboss.seam.debug.Introspector
                                16:31:46,933 INFO  [Component] Component: org.jboss.seam.exception.exceptions, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.exception.Exceptions
                                16:31:46,933 INFO  [Component] Component: org.jboss.seam.faces.dataModels, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.faces.DataModels
                                16:31:46,933 INFO  [Component] Component: org.jboss.seam.faces.facesContext, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.faces.FacesContext
                                16:31:46,933 INFO  [Component] Component: org.jboss.seam.faces.facesMessages, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.faces.FacesMessages
                                16:31:46,933 INFO  [Component] Component: org.jboss.seam.faces.facesPage, scope: PAGE, type: JAVA_BEAN, class: org.jboss.seam.faces.FacesPage
                                16:31:46,933 INFO  [Component] Component: org.jboss.seam.faces.httpError, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.faces.HttpError
                                16:31:46,933 INFO  [Component] Component: org.jboss.seam.faces.redirect, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.faces.Redirect
                                16:31:46,933 INFO  [Component] Component: org.jboss.seam.faces.renderer, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.ui.facelet.FaceletsRenderer
                                16:31:46,949 INFO  [Component] Component: org.jboss.seam.faces.switcher, scope: PAGE, type: JAVA_BEAN, class: org.jboss.seam.faces.Switcher
                                16:31:46,949 INFO  [Component] Component: org.jboss.seam.faces.uiComponent, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.faces.UiComponent
                                16:31:46,949 INFO  [Component] Component: org.jboss.seam.faces.validation, scope: EVENT, type: JAVA_BEAN, class: org.jboss.seam.faces.Validation
                                16:31:46,949 INFO  [Component] Component: org.jboss.seam.framework.currentDate, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.framework.CurrentDate
                                16:31:46,949 INFO  [Component] Component: org.jboss.seam.framework.currentDatetime, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.framework.CurrentDatetime
                                16:31:46,949 INFO  [Component] Component: org.jboss.seam.framework.currentTime, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.framework.CurrentTime
                                16:31:46,949 INFO  [Component] Component: org.jboss.seam.graphicImage.image, scope: EVENT, type: JAVA_BEAN, class: org.jboss.seam.ui.graphicImage.Image
                                16:31:46,949 INFO  [Component] Component: org.jboss.seam.international.localeSelector, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.international.LocaleSelector
                                16:31:46,949 INFO  [Component] Component: org.jboss.seam.international.messagesFactory, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.international.Messages
                                16:31:46,949 INFO  [Component] Component: org.jboss.seam.international.timeZone, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.international.TimeZone
                                16:31:47,027 INFO  [Component] Component: org.jboss.seam.international.timeZoneSelector, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.international.TimeZoneSelector
                                16:31:47,042 INFO  [Component] Component: org.jboss.seam.mail.mailSession, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.mail.MailSession
                                16:31:47,042 INFO  [Component] Component: org.jboss.seam.navigation.pages, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.navigation.Pages
                                16:31:47,042 INFO  [Component] Component: org.jboss.seam.navigation.safeActions, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.navigation.SafeActions
                                16:31:47,042 INFO  [Component] Component: org.jboss.seam.pdf.documentStore, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.pdf.DocumentStore
                                16:31:47,042 INFO  [Component] Component: org.jboss.seam.persistence.persistenceContexts, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.persistence.PersistenceContexts
                                16:31:47,058 INFO  [Component] Component: org.jboss.seam.persistence.persistenceProvider, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.persistence.HibernatePersistenceProvider
                                16:31:47,058 INFO  [Component] Component: org.jboss.seam.remoting.gwt.gwtToSeamAdapter, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.remoting.gwt.GWTToSeamAdapter
                                16:31:47,058 INFO  [Component] Component: org.jboss.seam.remoting.remoting, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.remoting.Remoting
                                16:31:47,058 INFO  [Component] Component: org.jboss.seam.security.configurationFactory, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.security.Configuration
                                16:31:47,074 INFO  [Component] Component: org.jboss.seam.security.entityPermissionChecker, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.security.HibernateEntityPermissionChecker
                                16:31:47,074 INFO  [Component] Component: org.jboss.seam.security.facesSecurityEvents, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.security.FacesSecurityEvents
                                16:31:47,074 INFO  [Component] Component: org.jboss.seam.security.identity, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.security.RuleBasedIdentity
                                16:31:47,074 INFO  [Component] Component: org.jboss.seam.theme.themeFactory, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.theme.Theme
                                16:31:47,074 INFO  [Component] Component: org.jboss.seam.theme.themeSelector, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.theme.ThemeSelector
                                16:31:47,074 INFO  [Component] Component: org.jboss.seam.transaction.ejbTransaction, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.transaction.EjbTransaction
                                16:31:47,074 INFO  [Component] Component: org.jboss.seam.transaction.synchronizations, scope: EVENT, type: STATEFUL_SESSION_BEAN, class: org.jboss.seam.transaction.EjbSynchronizations, JNDI: BETS/EjbSynchronizations/local
                                16:31:47,089 INFO  [Component] Component: org.jboss.seam.transaction.transaction, scope: EVENT, type: JAVA_BEAN, class: org.jboss.seam.transaction.Transaction
                                16:31:47,089 INFO  [Component] Component: org.jboss.seam.ui.EntityConverter, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.ui.converter.EntityConverter
                                16:31:47,089 INFO  [Component] Component: org.jboss.seam.ui.entityIdentifierStore, scope: PAGE, type: JAVA_BEAN, class: org.jboss.seam.ui.converter.entityConverter.EntityIdentifierStore
                                16:31:47,105 INFO  [Component] Component: org.jboss.seam.ui.entityLoader, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.ui.converter.entityConverter.EntityLoader
                                16:31:47,105 INFO  [Component] Component: org.jboss.seam.ui.facelet.faceletCompiler, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.ui.facelet.FaceletCompiler
                                16:31:47,105 INFO  [Component] Component: org.jboss.seam.ui.graphicImage.graphicImageResource, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.ui.graphicImage.GraphicImageResource
                                16:31:47,105 INFO  [Component] Component: org.jboss.seam.ui.graphicImage.graphicImageStore, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.ui.graphicImage.GraphicImageStore
                                16:31:47,105 INFO  [Component] Component: org.jboss.seam.ui.hibernateEntityLoader, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.ui.converter.entityConverter.HibernateEntityLoader
                                16:31:47,120 INFO  [Component] Component: org.jboss.seam.ui.resource.safeStyleResources, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.ui.resource.SafeStyleResources
                                16:31:47,120 INFO  [Component] Component: org.jboss.seam.ui.resource.styleResource, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.ui.resource.StyleResource
                                16:31:47,120 INFO  [Component] Component: org.jboss.seam.ui.resource.webResource, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.ui.resource.WebResource
                                16:31:47,120 INFO  [Component] Component: org.jboss.seam.web.ajax4jsfFilter, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.web.Ajax4jsfFilter
                                16:31:47,120 INFO  [Component] Component: org.jboss.seam.web.ajax4jsfFilterInstantiator, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.ui.filter.Ajax4jsfFilterInstantiator
                                16:31:47,120 INFO  [Component] Component: org.jboss.seam.web.exceptionFilter, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.web.ExceptionFilter
                                16:31:47,120 INFO  [Component] Component: org.jboss.seam.web.isUserInRole, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.faces.IsUserInRole
                                16:31:47,120 INFO  [Component] Component: org.jboss.seam.web.loggingFilter, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.web.LoggingFilter
                                16:31:47,120 INFO  [Component] Component: org.jboss.seam.web.multipartFilter, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.web.MultipartFilter
                                16:31:47,120 INFO  [Component] Component: org.jboss.seam.web.parameters, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.faces.Parameters
                                16:31:47,136 INFO  [Component] Component: org.jboss.seam.web.redirectFilter, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.web.RedirectFilter
                                16:31:47,136 INFO  [Component] Component: org.jboss.seam.web.servletContexts, scope: EVENT, type: JAVA_BEAN, class: org.jboss.seam.web.ServletContexts
                                16:31:47,136 INFO  [Component] Component: org.jboss.seam.web.session, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.web.Session
                                16:31:47,136 INFO  [Component] Component: org.jboss.seam.web.userPrincipal, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.faces.UserPrincipal
                                16:31:47,136 INFO  [Component] Component: populateDropDown, scope: CONVERSATION, type: JAVA_BEAN, class: com.cox.bets.session.PopulateDropDown
                                16:31:47,136 INFO  [Component] Component: repairCaseDetails, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.RepairCaseDetailsAction, JNDI: BETS/RepairCaseDetailsAction/local
                                16:31:47,136 INFO  [Component] Component: seamValidatorCodes, scope: CONVERSATION, type: JAVA_BEAN, class: com.cox.bets.utils.validators.SeamValidatorCodes
                                16:31:47,136 INFO  [Component] Component: seamValidatorCost, scope: CONVERSATION, type: JAVA_BEAN, class: com.cox.bets.utils.validators.SeamValidatorCost
                                16:31:47,136 INFO  [Component] Component: seamValidatorDates, scope: CONVERSATION, type: JAVA_BEAN, class: com.cox.bets.utils.validators.SeamValidatorDates
                                16:31:47,152 INFO  [Component] Component: seamValidatorMacAddress, scope: CONVERSATION, type: JAVA_BEAN, class: com.cox.bets.utils.validators.SeamValidatorMacAddress
                                16:31:47,152 INFO  [Component] Component: seamValidatorRepairCostType, scope: SESSION, type: JAVA_BEAN, class: com.cox.bets.utils.validators.SeamValidatorRepairCostType
                                16:31:47,152 INFO  [Component] Component: securityRoleDAO, scope: STATELESS, type: STATELESS_SESSION_BEAN, class: com.cox.bets.dao.SecurityRoleDAO, JNDI: BETS/SecurityRoleDAO/local
                                16:31:47,152 INFO  [Component] Component: securityRoleManager, scope: STATELESS, type: STATELESS_SESSION_BEAN, class: com.cox.bets.session.SecurityRoleManager, JNDI: BETS/SecurityRoleManager/local
                                16:31:47,152 INFO  [Component] Component: securityRules, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.drools.RuleBase
                                16:31:47,152 INFO  [Component] Component: storedProcedureDAO, scope: STATELESS, type: STATELESS_SESSION_BEAN, class: com.cox.bets.dao.StoredProcedureDAO, JNDI: BETS/StoredProcedureDAO/local
                                16:31:47,152 WARN  [Component] Component class should be serializable: stringUtils
                                16:31:47,152 INFO  [Component] Component: stringUtils, scope: CONVERSATION, type: JAVA_BEAN, class: com.cox.bets.utils.StringUtils
                                16:31:47,152 INFO  [Component] Component: testBackButtonAction, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.TestBackButtonAction, JNDI: BETS/TestBackButtonAction/local
                                16:31:47,152 INFO  [Component] Component: testIdentityInsert, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.TestIdentityInsertAction, JNDI: BETS/TestIdentityInsertAction/local
                                16:31:47,167 INFO  [Component] Component: testIdentityUpdate, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.TestIdentityUpdateAction, JNDI: BETS/TestIdentityUpdateAction/local
                                16:31:47,167 INFO  [Component] Component: testInjectCreate, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.TestInjectCreateAction, JNDI: BETS/TestInjectCreateAction/local
                                16:31:47,167 INFO  [Component] Component: testManageEquipment, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, class: com.cox.bets.session.TestManageEquipmentAction, JNDI: BETS/TestManageEquipmentAction/local

                                • 13. Re: Help with back button
                                  Arbi Sookazian Master

                                  This is critical as well.


                                  org.jboss.seam.jsf.SeamPhaseListener:


                                  protected void beforeRenderResponse(FacesContext facesContext)
                                     {  
                                        
                                        if ( Contexts.isPageContextActive() )
                                        {
                                           Context pageContext = Contexts.getPageContext();
                                           //after every time that the view may have changed,
                                           //we need to flush the page context, since the 
                                           //attribute map is being discarder
                                           pageContext.flush();
                                           //force refresh of the conversation lists (they are kept in PAGE context)
                                           pageContext.remove(Seam.getComponentName(Switcher.class));
                                           pageContext.remove("org.jboss.seam.core.conversationList");
                                           pageContext.remove("org.jboss.seam.core.conversationStack");
                                        }
                                        
                                        preRenderPage(facesContext);
                                        
                                        if ( facesContext.getResponseComplete() )
                                        {
                                           //workaround for a bug in MyFaces prior to 1.1.3
                                           if ( Init.instance().isMyFacesLifecycleBug() ) 
                                           {
                                              FacesLifecycle.endRequest( facesContext.getExternalContext() );
                                           }
                                        }
                                        else //if the page actions did not call responseComplete()
                                        {
                                           FacesMessages.instance().beforeRenderResponse();
                                           //do this both before and after render, since conversations 
                                           //and pageflows can begin during render
                                           FacesManager.instance().prepareBackswitch(facesContext); 
                                        }
                                        
                                        FacesPage.instance().storeConversation();
                                        FacesPage.instance().storePageflow();
                                        
                                        PersistenceContexts persistenceContexts = PersistenceContexts.instance();
                                        if (persistenceContexts != null) 
                                        {
                                            persistenceContexts.beforeRender();
                                        }
                                     }



                                  So it may come down to this line of code:


                                  facesContext.getResponseComplete()



                                  this apparently is returning true for a4j:commandButton scenario and false for h:commandButton scenario.


                                  how is there a page action when you click the back button in browser?  anybody care to explain?  and yes, I tested with FF 3 and same results.

                                  • 14. Re: Help with back button
                                    Nikolay Elenkov Master

                                    If you click the back button, your browser should do a GET using the previous URL in history (assuming you disabled caching).
                                    Use Firefly or something similar to see what exactly is happening. My guess is that,
                                    for some reason, your URL looks different when using a4j:commandButton as opposed to h:commandButton,
                                    and that is why you are getting different behaviour.


                                    Seam cleans up all contexts on request end (deleting temporary/expired conversations, etc.), so if
                                    you have a request (GET in this case), cleanup code should get executed. 


                                    Your SFSB is destroyed probably because of this:


                                    2009-05-18 16:19:01,980 DEBUG [org.jboss.seam.core.Manager] Discarding conversation state: 55
                                    



                                    Dump conversation/session contents to the log to be sure.


                                    HTH

                                    1 2 3 Previous Next