myfaces-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Silverman, Glenn" <GSilver...@dylt.com>
Subject RE: How can I create a session scoped Trinidad menu model
Date Fri, 01 Aug 2008 14:31:11 GMT
Andrew,

Thanks for the heads up. I'll look into alternatives, as you suggested.

Glenn...

-----Original Message-----
From: Andrew Robinson [mailto:andrew.rw.robinson@gmail.com]
Sent: Thursday, July 31, 2008 4:24 PM
To: MyFaces Discussion
Subject: Re: How can I create a session scoped Trinidad menu model


My personal opinion would be to not use it. It really gave me
heartburn when I attempted to use it. I would recommend using
ChildPropertyMenuModel instead and if you want to use XML, use the
commons digester with it. That is just my opinion though.

BTW, I think it really is application scoped in practice, as it uses
one shared model, so there really isn't any state to save (like in the
session). The architecture of it is very odd and a bit broken (you can
only have one menu model on a page for example).

-Andrew

On Thu, Jul 31, 2008 at 3:46 PM, Silverman, Glenn <GSilverman@dylt.com> wrote:
> Are there any examples available of using XMLMenuModel. The
> Trinidad demo apps use ProcessMenuModel and that, apparently, can
> be session scoped, so it doen't help me.
>
> Glenn Silverman
>
> -----Original Message-----
> From: Zigc Junk [mailto:zigcjunk@gmail.com]
> Sent: Thursday, July 31, 2008 2:23 PM
> To: MyFaces Discussion
> Subject: Re: How can I create a session scoped Trinidad menu model
>
>
> Did u try to change from request to session? Since your bean is
> request scoped, every request will create a new instance of the bean,
> so does its property.
>
> regard
>
> Bill
>
> On Thu, Jul 31, 2008 at 4:05 PM, Silverman, Glenn <GSilverman@dylt.com> wrote:
>> I need a session-scoped menu model but the documentation says I can't, and
>> that creates a problem
>> whenever I click on a button to do something when I'm not on the first tab
>> of the menu. Here's my code...
>> I have a trinidad switcher control managed by a commandNavigationItem
>> control.
>>
>>                         <tr:navigationPane id="navPaneA" level="1"
>> value="#{root_menu}" var="foo">
>>                                 <f:facet name="nodeStamp">
>>                                         <tr:commandNavigationItem
>> id="navItemA" text="#{foo.label}"
>>                                                 action="#{foo.doAction}"/>
>>                                 </f:facet>
>>                         </tr:navigationPane>
>>
>>                         <tr:switcher facetName="#{root_menu.navLabel}"
>> defaultFacet="Messages" >
>>                                 <f:facet name="Messages">
>>                                 <tr:panelGroupLayout layout="vertical">
>>                                                 <jsp:include
>> page="../editors/errormessages.jspx"/>
>>                                         </tr:panelGroupLayout>
>>                                 </f:facet>
>>                                 <f:facet name="Help Text">
>>                                 <tr:panelGroupLayout layout="vertical">
>>                                                 <jsp:include
>> page="../editors/help.jspx"/>
>>                                         </tr:panelGroupLayout>
>>                                 </f:facet>
>>                         <f:facet name="Buttons">
>>                            <tr:panelGroupLayout layout="vertical">
>>                                                 <jsp:include
>> page="../editors/buttons.jspx"/>
>>                                         </tr:panelGroupLayout>
>>                                 </f:facet>
>>                                 <f:facet name="Sounds">
>>                                 <tr:panelGroupLayout layout="vertical">
>>                                                 <jsp:include
>> page="../editors/sounds.jspx"/>
>>                                         </tr:panelGroupLayout>
>>                                 </f:facet>
>>                         </tr:switcher>
>>
>> And a menu model:
>>
>>         <menu xmlns="http://myfaces.apache.org/trinidad/menu">
>>                 <groupNode id="msgs" idref="message" label="Error Messages"
>> defaultFocustPath="true">
>>                         <itemNode id="message" label="Messages"
>> action="goToMessages"
>>                                 focusViewId="/index.jspx"/>
>>                         <itemNode id="help" label="Help Text"
>> action="goToHelp"
>>                                 focusViewId="/index.jspx"/>
>>                         <itemNode id="button" label="Buttons"
>> action="goToButton"
>>                                 focusViewId="/index.jspx"/>
>>                         <itemNode id="sound" label="Sounds"
>> action="goToSound"
>>                                 focusViewId="/index.jspx"/>
>>                 </groupNode>
>>                 <groupNode id="allcodes" label="AllCodes" idref="cat">
>>
>>                         <itemNode id="cat" label="Categories"
>> action="goToCategory"
>>                                 focusViewId="/index.jspx" />
>>                         <itemNode id="link" label="CodeLinks"
>> action="goToLink"
>>                                 focusViewId="/index.jspx" />
>>                 </groupNode>
>>         </menu>
>>
>> which is defined in faces-config.xml as a managed bean:
>>
>>       <managed-bean>
>>         <managed-bean-name>root_menu</managed-bean-name>
>>         <managed-bean-class>com.dylt.bean.MenuModelBean</managed-bean-class>
>>         <managed-bean-scope>request</managed-bean-scope>
>>         <managed-property>
>>               <property-name>source</property-name>
>>               <property-class>java.lang.String</property-class>
>>               <value>/WEB-INF/menu-metadata.xml</value>
>>        </managed-property>
>>       </managed-bean>
>>
>> Here, MenuModelBean just extends XMLMenuModel as follows (This is
>> similar to the example in the Trinidad Developer Guide):
>>
>>         public class MenuModelBean extends XMLMenuModel {
>>
>>                 public String getGroupLabel(){
>>                         List list = getNodesFromFocusPath(false);
>>                         return (String)list.get(list.size()-1);
>>                 }
>>                 public String getNavLabel(){
>>                         List list = getNodesFromFocusPath(true);
>>                         return (String)list.get(list.size()-1);
>>                 }
>>         public List getNodesFromFocusPath(boolean itemsOnly){
>>         ArrayList focusPath = (ArrayList)this.getFocusRowKey();
>>         return getNodesFromFocusPath(focusPath, itemsOnly);
>>         }
>>
>>         public List getNodesFromFocusPath(ArrayList focusPath, boolean
>> itemsOnly){
>>
>>
>>               if (focusPath == null || focusPath.size() == 0)
>>                 return null;
>>
>>               // Clone the focusPath cause we remove elements
>>               ArrayList fp = (ArrayList) focusPath.clone();
>>
>>               // List of nodes to return
>>               List nodeList = new ArrayList<Object>();
>>
>>               // Convert String rowkey to int and point to the
>>               // node (row) corresponding to this index
>>               int targetNodeIdx = (Integer)fp.get(0);
>>               TreeModel tree = (TreeModel)this.getWrappedData();
>>
>>               tree.setRowIndex(targetNodeIdx);
>>
>>               // Get the node
>>               Object node = tree.getRowData();
>>               String label = null;
>>               if(node instanceof ItemNode){
>>                   label= ((ItemNode)node).getLabel();
>>                   if(itemsOnly)
>>                           nodeList.add(label);
>>               }
>>               else if (node instanceof GroupNode){
>>                   label= ((GroupNode)node).getLabel();
>>                   if(!itemsOnly)
>>                           nodeList.add(label);
>>               }
>>
>>
>>               // Remove the 0th rowkey from the focus path
>>               // leaving the remaining focus path
>>               fp.remove(0);
>>
>>               // traverse into children
>>               if (   fp.size() > 0
>>                   && tree.isContainer()
>>                   && !tree.isContainerEmpty()
>>                  )
>>               {
>>                 tree.enterContainer();
>>
>>                 // get list of nodes in remaining focusPath
>>                 List childList = getNodesFromFocusPath(fp, itemsOnly);
>>
>>                 // Add this list to the nodeList
>>                 nodeList.addAll(childList);
>>
>>                 tree.exitContainer();
>>               }
>>
>>               return nodeList;
>>             }
>>       )
>>
>> Here's the problem: If I'm on one of the facet pages other than the first
>> one, clicking
>> on any command button or link always takes me back to the first facet. If I
>> use
>> partialSubmit and partialTriggers to try to limit page refresh to a
>> particular page
>> element, the behavior is even more bizarre. If I click on a tab to change
>> facets, the
>> first command button or link click works as expected, but any subsequent
>> clicks assume
>> I am on the first facet page and won't update the facet page I'm on at all.
>>
>> Here's an example page, the help.jspx in the second facet:
>>
>>         jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"
>>                 xmlns:f="http://java.sun.com/jsf/core"
>>                 xmlns:tr="http://myfaces.apache.org/trinidad">
>>         <jsp:directive.page contentType="text/html;charset=utf-8" />
>>                 <f:subview id="helpWrapperA">
>>                         <tr:table id="helpTableA" var="hlp"
>> value="#{helpBean.list}" partialTriggers="helpEditLink">
>>                                 <tr:column headerText="Id">
>>                                         <tr:outputText value="#{hlp.helpId}"
>> />
>>                                 </tr:column>
>>                                 <tr:column headerText="Message">
>>                                         <tr:commandLink id="helpEditLink"
>> text="#{hlp.text}"
>>                                                 immediate="true"
>> partialSubmit="true">
>>                                                 <tr:setActionListener
>> from="#{hlp}"
>>
>> to="#{pageFlowScope.helpDetail}" />
>>                                         </tr:commandLink>
>>                                 </tr:column>
>>                         </tr:table>
>>         </f:subview>
>>         <tr:separator/>
>>         <tr:showDetail undisclosedText="Show Detail" disclosedText="Hide
>> Detail">
>>                 <f:subview id="helpWrapperB">
>>                                 <tr:panelFormLayout rows="2"
>>
>> partialTriggers=":::helpWrapperA:helpTableA:helpEditLink">
>>                                         <tr:outputText value="ID:" />
>>                                         <tr:outputText value="Text:" />
>>                                         <tr:outputText
>> value="#{pageFlowScope.helpDetail.helpId}" />
>>                                         <tr:inputText
>> value="#{pageFlowScope.helpDetail.text}"/>
>>                                 </tr:panelFormLayout>
>>                     </f:subview>
>>                 </tr:showDetail>
>>         </jsp:root>
>>
>> Could this behavior be the result of the fact that the scope for the menu
>> model must be "request" ? If so, then every subsequent
>>
>> "request" will always go to, or assume I'm on,  the default tab.  How can I
>> change this?
>>
>> Glenn Silverman
>>
>>
>
>


Mime
View raw message