4 Replies Latest reply on Aug 9, 2007 5:36 AM by jfbenck

    Passing data between nested conversations

    jfbenck

      Hi all,

      I've got a question about seam regarding the use of nested conversations and more specifically, how I can pass data between nested conversations. To explain, consider the following hypothetical use case of a banking application:

      I have a generic "web-component" (i.e. set of classes, faces-config.xml, JSP's, etc), which can be used to search for clients or create new clients. This component is used from a number of different locations, like creating new accounts (adding owners of the account), or requesting a loan.

      I'm not an expert in seam, but from what I've seen (and tested), the pageflow to this component can be handled using jPDL (subprocess tag). Using nested conversations, each of these components can have their own scope for data.

      The problem I'm thinking about is how to pass data between these two conversation scopes (i.e. from the account scope to the client scope when the client component is called and the other way around to pass the selected client back to the account component).

      I know child-scopes can access their parent scope (in a read-only fashion), however I'd like the client-component in this case to be agnostic of the calling component. Is there some generic best-practice in Seam how to handle this case?

      Thanks for your thoughts,

      Jeroen

        • 1. Re: Passing data between nested conversations
          denis-karpov

          From the nested conversation you have access to the parent conversation scope. You can't add or remove from the parent scope, but you can get a reference to an any object and you can change the state of this object.

          Next thing you can do. You can pass parameters when you start nested conversation.

          For instance, to choose link object I use nested conversation (old one, because I use 1.2.1 version)

          In this way I start nested conversation

          <a4j:commandLink value="#{messages['com.colvir.common.choose']}" action="#{refer.begin}" propagation="nest">
           <a4j:actionparam name="ref" value="#{refName}" assignTo="#{refer.refName}"/>
           <a4j:actionparam name="caption" value="#{caption}" assignTo="#{refer.caption}"/>
           <a4j:actionparam name="binding" value="#{binding}" assignTo="#{refer.binding}"/>
           <a4j:actionparam name="viewid" value="#{viewid}" assignTo="#{refer.viewid}"/>
           </a4j:commandLink>
          


          In this way I return from nested to parent
          public String select() {
           if (binding==null){
           throw new RuntimeException("Binding in reference can't be null");
           }
           Query r = getRef();
           if ( r==null ){
           throw new RuntimeException("Reference query can't be null");
           }
           Object o = r.getDataModel().getRowData();
          
           // End conversation and redirect to parent
           Conversation.instance().endAndRedirect(true);
           // Returning selected value
           Expressions.instance().createValueBinding("#{"+binding+"}").setValue(o);
           return null;
           }
          
           public String cancel() {
           Conversation.instance().endAndRedirect(true);
           return null;
           }
          


          Actually, with composite pageflows everything has to be much simpler.
          Denis.

          • 2. Re: Passing data between nested conversations
            jfbenck

            Hi Denis,

            Thanks for your reply. The option to retrieve the data from the parent scope was clear to me, however the question is how to add this object to the parent scope? Outjection is probably an option, however: is there a risk of naming-clashes between the different objects, is the code and resulting behaviour clear to other developers, how is the name for the result object defined? I'm thus inquiring for some best practices and potential pit falls.

            Passing data to the child scope is indeed not much of a problem using e.g. the mentioned parameters or just performing calls on the object directly.

            Jeroen

            • 3. Re: Passing data between nested conversations
              denis-karpov

               

              the question is how to add this object to the parent scope?

              It is the bad practice, to try to do this. Even if you hack this, Gavin will probably close this door in the next release ;-)

              Why not to make a special container that hold the shared state?
              And put this container to the parent context. Then you can change the state of this container from any nested conversation. Is it not enough?

              • 4. Re: Passing data between nested conversations
                jfbenck

                That was what I meant (sorry for the bad explanation, looks confusing after re-reading it)

                So from the parent bean I outject a container (simple POJO) into the context under a specified name and refer (inject) to this object from the child context.