4 Replies Latest reply on Mar 11, 2007 3:17 PM by adamkoprowski

    Seam & Trinidad.

    adamkoprowski

      Hello everybody,

      Few weeks ago I started playing around with Seam and I must say I'm pretty impressed with its capabilities. However, I'm somehow less impressed with the fact that it does not fully cooperate with Trinidad - a component library on which I am (just as tons of other people) heavily relying.

      Let me illustrate the problem (not the first one) I'm having (maybe I'm doing something stupid). I'm having a Trinidad table and I want to do a simplest possible master-detail navigation to a page with details for table entry. Now:

      -) As I read on this forum (and experienced myself) I cannot use Seam's extended EL (parameters to methods) with Trinidad.

      -) As I'm dealing with Trinidad table @DataModel and @DataModelSelection won't work.

      -) My first idea was to use plain <f:param> to propagate the id of table entry but I want to do redirect to detail page so request parameters are not propagated, right?

      -) My second idea was to use the Seam pages.xml mechanism for request parameters propagation with the following navigation entry:

      <page view-id="/master.xhtml">
       <navigation>
       <rule if-outcome="viewDetail">
       <redirect view-id="/detail.xhtml">
       <param name="id" value="#{master.selectedEntry.id}"/>
       </redirect>
       </rule>
       </navigation>
      </page>
      

      But then in selectedEntry I need to figure out which table entry was clicked but for some reason the component tree has only AjaxViewRoot root component with no children.
      Hence my questions: is it normal that the component tree is not available in this context? If not what may I be doing wrong? If so, how can I get the id of selected table entry?

      Thanks a lot for any help!
      Adam Koprowski

        • 1. Re: Seam & Trinidad.
          pmuir

           

          "adamkoprowski" wrote:
          However, I'm somehow less impressed with the fact that it does not fully cooperate with Trinidad - a component library on which I am (just as tons of other people) heavily relying.


          Part of the problem here is that Trinidad have taken ages to get a release out - once their 1.0.0 release is out (any day now I think) we can start improving Seam integration.

          -) As I read on this forum (and experienced myself) I cannot use Seam's extended EL (parameters to methods) with Trinidad.


          I don't know of anyone who has got this working.

          -) As I'm dealing with Trinidad table @DataModel and @DataModelSelection won't work.


          They *should* do - and I haven't heard anyone say they don't. The current feeling is that page parameters are better than @DataModel stuff. If they aren't working with Trinidad can you file a JIRA issue, and I'll try to take a look.

          -) My first idea was to use plain <f:param> to propagate the id of table entry but I want to do redirect to detail page so request parameters are not propagated, right?


          If you do a redirect yes. Thats why we have page parameters in pages.xml.

          -) My second idea was to use the Seam pages.xml mechanism for request parameters propagation with the following navigation entry:
          <page view-id="/master.xhtml">
           <navigation>
           <rule if-outcome="viewDetail">
           <redirect view-id="/detail.xhtml">
           <param name="id" value="#{master.selectedEntry.id}"/>
           </redirect>
           </rule>
           </navigation>
          </page>
          

          But then in selectedEntry I need to figure out which table entry was clicked but for some reason the component tree has only AjaxViewRoot root component with no children.
          Hence my questions: is it normal that the component tree is not available in this context? If not what may I be doing wrong? If so, how can I get the id of selected table entry?


          I don't get *why* you need to do this. Surely with the id of the selectedEntry you can load it from the persistence context and edit it? Take a look at the way a seam-gen'd project does things - that demonstrates the use of page parameters for master/detail.

          • 2. Re: Seam & Trinidad.
            adamkoprowski

            Dear Petemuir,
            Thank you for your fast and helpful response!

            "petemuir" wrote:

            Part of the problem here is that Trinidad have taken ages to get a release out - once their 1.0.0 release is out (any day now I think) we can start improving Seam integration.


            Great! Indeed it seems that the release is just around the corner so I'm looking forward for that! Then the stack of seam + facelets + ajax4jsf + Trinidad will be a killer!


            "adamkoprowski" wrote:
            -) As I read on this forum (and experienced myself) I cannot use Seam's extended EL (parameters to methods) with Trinidad.


            I don't know of anyone who has got this working.

            Too bad. Any idea what's the reason? Any hope this will be resolved at some point?


            "adamkoprowski" wrote:
            -) As I'm dealing with Trinidad table @DataModel and @DataModelSelection won't work.


            They *should* do - and I haven't heard anyone say they don't. The current feeling is that page parameters are better than @DataModel stuff. If they aren't working with Trinidad can you file a JIRA issue, and I'll try to take a look.

            Ok, my fault, probably they do. I just recalled reading on this forum that @DataModel does not work for Trinidad trees and assumed that this is probably the case for tables as well.


            "adamkoprowski" wrote:
            -) My second idea was to use the Seam pages.xml mechanism for request parameters propagation with the following navigation entry:
            <page view-id="/master.xhtml">
             <navigation>
             <rule if-outcome="viewDetail">
             <redirect view-id="/detail.xhtml">
             <param name="id" value="#{master.selectedEntry.id}"/>
             </redirect>
             </rule>
             </navigation>
            </page>
            

            But then in selectedEntry I need to figure out which table entry was clicked but for some reason the component tree has only AjaxViewRoot root component with no children.
            Hence my questions: is it normal that the component tree is not available in this context? If not what may I be doing wrong? If so, how can I get the id of selected table entry?


            I don't get *why* you need to do this. Surely with the id of the selectedEntry you can load it from the persistence context and edit it? Take a look at the way a seam-gen'd project does things - that demonstrates the use of page parameters for master/detail.

            Ok, I guess I wasn't clear enough. What I meant is that I need to propagate the id to the detail page (and then surely I can fetch the data). Anyway I tried to take a look at how this is done by seam-gen (wasn't that easy for me as then the core of this master/detail navigation is obscured by many details). I tried to follow this approach and worked it out too a small but self contained and complete example showing the gist of my problem. There is still something I don't understand and I'd be very grateful if anybody could cast some light on me. Here we go:

            Simple objects (Entry.java)
            package test;
            
            public class Entry
            {
             public Long id;
             public String name;
            
             public Entry(Long i)
             {
             id = i;
             name = "Entry #" + i;
             }
            
             public Long getId()
             {
             return id;
             }
            
             public void setId(Long id)
             {
             this.id = id;
             }
            
             public String getName()
             {
             return name;
             }
            
             public void setName(String name)
             {
             this.name = name;
             }
            }
            


            Master component (Master.java)
            package test;
            
            import java.util.List;
            import java.util.Vector;
            
            import org.jboss.seam.annotations.Name;
            
            @Name("master")
            public class Master
            {
            
             public List<Entry> getEntries()
             {
             List<Entry> res = new Vector<Entry>();
             for (int i = 0; i < 50; i++)
             res.add(new Entry(new Long(i)));
             return res;
             }
            
            }
            


            Detail component (Detail.java)
            package test;
            
            import org.jboss.seam.annotations.Name;
            import org.jboss.seam.annotations.RequestParameter;
            
            @Name("detail")
            public class Detail
            {
            
             @RequestParameter [1]
             Long entryId;
            
             public Long getEntryId()
             {
             return entryId;
             }
            
             public void setEntryId(Long entryId)
             {
             this.entryId = entryId;
             }
            
             public Entry getEntry()
             {
             return new Entry(entryId);
             }
            
            }
            


            Master page (master.xhtml)
            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
             "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
            
            <f:view xmlns="http://www.w3.org/1999/xhtml"
             xmlns:f="http://java.sun.com/jsf/core"
             xmlns:s="http://jboss.com/products/seam/taglib"
             xmlns:tr="http://myfaces.apache.org/trinidad"
             xmlns:trh="http://myfaces.apache.org/trinidad/html">
             <trh:html>
             <trh:body>
             <tr:form>
             <tr:table var="entry" value="#{master.entries}" rows="10">
             <tr:column>
             <f:facet name="header">
             <tr:outputText value="Entry id" />
             </f:facet>
             <s:link action="viewDetail" value="#{entry.name}">
             <f:param name="entryId" value="#{entry.id}" />
             </s:link>
             </tr:column>
             </tr:table>
             </tr:form>
             </trh:body>
             </trh:html>
            </f:view>
            


            Detail page (detail.xhtml)
            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
             "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
            
            <f:view xmlns="http://www.w3.org/1999/xhtml"
             xmlns:f="http://java.sun.com/jsf/core"
             xmlns:s="http://jboss.com/products/seam/taglib"
             xmlns:tr="http://myfaces.apache.org/trinidad"
             xmlns:trh="http://myfaces.apache.org/trinidad/html">
             <trh:html>
             <trh:body>
             <tr:outputText value="Entry id: #{detail.entry.id}" />
             <tr:outputText value="Entry name: #{detail.entry.name}" />
             </trh:body>
             </trh:html>
            </f:view>
            


            pages.xml
            <!DOCTYPE pages PUBLIC
             "-//JBoss/Seam Pages Configuration DTD 1.1//EN"
             "http://jboss.com/products/seam/pages-1.1.dtd">
            
            <pages>
             <page view-id="/master.xhtml">
             <navigation>
             <rule if-outcome="viewDetail">
             <redirect view-id="/detail.xhtml" />
             </rule>
             </navigation>
             </page>
             <page view-id="/detail.xhtml">
             <param name="entryId" value="#{detail.entryId}" /> [2]
             </page>
            </pages>
            


            Now the thing is that it does not work without the @RequestParameter annotation [1] (as then detail.entryId is never set), while I though that the job of initializing detail.entryId is done in pages.xml by [2]. What am I missing? Because I have to say that I am still quite confused with the concept of state propagation in Seam even though I read the documentation and played around with it for quite a while...
            My guess is that this is due to the fact that page parameters like [2] are bidirectional while I only want to set the component property from the request parameter. So things would work fine if Master.java and Detail.java were kind of merged into one component. But that's not what I want since I want them to have different scopes - think of search screen/results. What's the proper way to propagate state in such scenario?

            Any help appreciated!
            Adam

            • 3. Re: Seam & Trinidad.
              pmuir

               

              "adamkoprowski" wrote:



              "adamkoprowski" wrote:
              -) As I read on this forum (and experienced myself) I cannot use Seam's extended EL (parameters to methods) with Trinidad.


              I don't know of anyone who has got this working.

              Too bad. Any idea what's the reason? Any hope this will be resolved at some point?


              No (it's not a priority for Seam, but if someone provides a patch...). The extended EL is a stop-gap measure until we get a version of EL that really supports this.

              ...


              Try this:

              <pages>
               <page view-id="/master.xhtml">
               <navigation>
               <rule if-outcome="viewDetail">
               <redirect view-id="/detail.xhtml" />
               </rule>
               </navigation>
               <param name="entryId" value="#{detail.entryId}" />
               </page>
              </pages>


              • 4. Re: Seam & Trinidad.
                adamkoprowski

                 

                "petemuir" wrote:

                Try this:

                <pages>
                 <page view-id="/master.xhtml">
                 <navigation>
                 <rule if-outcome="viewDetail">
                 <redirect view-id="/detail.xhtml" />
                 </rule>
                 </navigation>
                 <param name="entryId" value="#{detail.entryId}" />
                 </page>
                </pages>
                



                Indeed, it did the trick. I only had to change the scope of the 'detail' component to at least CONVERSATION (I'm not quite sure why PAGE is not sufficient). Thanks a lot for help!
                Adam