0 Replies Latest reply on May 14, 2009 11:41 AM by gewuerzgurke

    Bijection Issue using Factory and Event Observer approch

    gewuerzgurke

      I've figured out strange behaviour (maybe a bug) using the event/observer pattern with DataModel and Factory.
      I know the difference ideas behind @Factory and @Observer.


      Using Seam 2.1.1. GA and Jboss 4.2.3 GA.


      Componenent customerListAction raises an event when a customer from it's list is deleted


      @Name("customerListAction")
      @Scope(ScopeType.CONVERSATION)
      @AutoCreate
      public class CustomerListAction {
              @Logger
              Log log;
      
              @DataModel
              List<Customer> allCustomers;
      
              @DataModelSelection("allCustomers")
              @Out(required = false)
              Customer selectedCustomer;
      
      
      
              @Factory(value = "allCustomers")        
              public void findAllCustomers() {
                      allCustomers = customerList.getResultList();
              }
              
              @Observer( create=false, value = {
                              "org.domain.testseam.session.customer.CustomerListAction.delete",
                              "org.domain.testseam.session.customer.CustomerEditAction.save" })
              public void onModelChange() {
                      log.debug("model changed");             
                      Contexts.getConversationContext().set("allCustomers", null);
              }
      
      
              @RaiseEvent("org.domain.testseam.session.customer.CustomerListAction.delete")
              public void delete() {
                      if (selectedCustomer != null) {
                              customerHome.setInstance(selectedCustomer);
                              customerHome.remove();
                              selectedCustomer = null;
                      }
              }
      }
      



      Have a look on the onModelChange() method that observes the event. The following code doesn't work:


      @Observer( create=false, value = {
                              "org.domain.testseam.session.customer.CustomerListAction.delete",
                              "org.domain.testseam.session.customer.CustomerEditAction.save" })
              public void onModelChange() {
                      log.debug("model changed");             
                      allCustomers = null
              }
      



      It seems that allCustomers is not the same object, maybe a problem with the scopes. In which context will an
      observer method be invoked?


      The xhtml file looks like this:


      <rich:simpleTogglePanel opened="true">
                              <a:region>
                              <f:facet name="header">Kundenliste</f:facet>
                                      <h:form id="customerSelectForm">
                                              <rich:dataTable var="_customer" value="#{allCustomers}">
                                                      <f:facet name="header">
                                                              <rich:columnGroup>
                                                                      <rich:column>                                                 
                                                      Id
                                              </rich:column>
                                                                      <rich:column>                                                 
                                                      Name
                                              </rich:column>
                                                                      <rich:column>                                                     
                                                      Aktion                                                                                  
                                                      </rich:column>
                                                              </rich:columnGroup>
                                                      </f:facet>
                                                      <rich:column>
                                                      #{_customer.id}
                                              </rich:column>
                                                      <rich:column>
                                                      #{_customer.name}
                                              </rich:column>
                                                      <rich:column>                                                                                                             
                                                              <a:commandButton action="#{customerListAction.select}" value="Auswählen" reRender="customerSelectForm"/>
                                                              <a:commandButton action="#{customerListAction.delete}" value="Entfernen" reRender="customerSelectForm"/>
                                                      </rich:column>
                                              </rich:dataTable>
                                      </h:form>
                              </a:region>
                      </rich:simpleTogglePanel>
      



      Using Contexts.getConversationContext().set("allCustomers", null); looks ugly, any ideas?