rich:tree with dynamic menu
ipraveenjain Nov 16, 2009 2:06 AMhi
i am trying to run a example of Rich Tree with ContextMenu
but i am gettign the exception
my code is
<f:view> <h:form> <rich:tree style="width:300px" nodeSelectListener="#{simpleTreeBean.processSelection}" reRender="selectedNode" ajaxSubmitSelection="true" switchType="client" value="#{simpleTreeBean.treeNode}" var="item"> <rich:treeNode> <h:outputText value="#{item}" /> <a4j:support event="oncontextmenu" oncomplete="#{rich:component('cm')}.doShow(event, {})" actionListener="#{simpleTreeBean.treeListener}" reRender="cm"> <f:setPropertyActionListener value="#{item}" target="#{simpleTreeBean.nodeSelected}" /> </a4j:support> </rich:treeNode> </rich:tree> <rich:contextMenu submitMode="ajax" id="cm" binding="#{simpleTreeBean.contextMenu}" /> </h:form> </f:view>
the bean is
public class SimpleTreeBean { private TreeNode rootNode = null; private List<String> selectedNodeChildren = new ArrayList<String>(); private ArrayList<String> child = new ArrayList<String>(); private String nodeTitle; private static final String DATA_PATH = "/richfaces/tree/examples/simple-tree-data.properties"; private ArrayList<String> treenode = new ArrayList<String>(); private ContextMenu contextMenu; private String nodeSelected; public SimpleTreeBean() { for (int i = 1; i <= 3; i++) { treenode.add((i) + ""); for (int j = 1; j <= 5; j++) { child.add((i * j) + ""); } } } private void addNodes(String path, TreeNode node, ArrayList properties) { boolean end = false; int counter = 1; for (int count = 0; count < treenode.size(); count++) { // String key = path != null ? path + '.' + counter : // String.valueOf(counter); String value = treenode.get(count);// properties.getProperty(key); if (value != null) { TreeNodeImpl nodeImpl = new TreeNodeImpl(); nodeImpl.setData(value); node.addChild(new Integer(counter), nodeImpl); addChildNodes(count + "", nodeImpl, child); counter++; } else { end = true; } } } private void addChildNodes(String path, TreeNode node, ArrayList properties) { boolean end = false; int counter = 1; for (int count = 0; count < child.size(); count++) { // String key = path != null ? path + '.' + counter : // String.valueOf(counter); String value = child.get(count);// properties.getProperty(key); if (value != null) { TreeNodeImpl nodeImpl = new TreeNodeImpl(); nodeImpl.setData(value); node.addChild(new Integer(counter), nodeImpl); counter++; } else { end = true; } } } private void loadTree() { // FacesContext facesContext = FacesContext.getCurrentInstance(); // ExternalContext externalContext = facesContext.getExternalContext(); // InputStream dataStream = // externalContext.getResourceAsStream(DATA_PATH); try { // Properties properties = new Properties(); // properties.load(dataStream); rootNode = new TreeNodeImpl(); addNodes(null, rootNode, treenode); } catch (Exception e) { throw new FacesException(e.getMessage(), e); } finally { } } public void processSelection(NodeSelectedEvent event) { HtmlTree tree = (HtmlTree) event.getComponent(); nodeTitle = (String) tree.getRowData(); selectedNodeChildren.clear(); TreeNode currentNode = tree.getModelTreeNode(tree.getRowKey()); if (currentNode.isLeaf()) { selectedNodeChildren.add((String) currentNode.getData()); } else { Iterator<Map.Entry<Object, TreeNode>> it = currentNode .getChildren(); while (it != null && it.hasNext()) { Map.Entry<Object, TreeNode> entry = it.next(); selectedNodeChildren.add(entry.getValue().getData().toString()); } } } public TreeNode getTreeNode() { if (rootNode == null) { loadTree(); } return rootNode; } public String getNodeTitle() { return nodeTitle; } public void setNodeTitle(String nodeTitle) { this.nodeTitle = nodeTitle; } public ContextMenu getContextMenu() { if(contextMenu==null){ contextMenu=new ContextMenu(); contextMenu.setId("cm"); } return contextMenu; } public void setContextMenu(ContextMenu contextMenu) { this.contextMenu = contextMenu; } public String getNodeSelected() { return nodeSelected; } public void setNodeSelected(String nodeSelected) { this.nodeSelected = nodeSelected; } public void treeListener(ActionEvent event) { FacesContext context = FacesContext.getCurrentInstance(); Application app = context.getApplication(); getContextMenu().getChildren().clear(); UIOutput label = (UIOutput) app .createComponent(HtmlOutputText.COMPONENT_TYPE); label.setId("someLabel"); label.setValue(nodeSelected); HtmlMenuItem mi = (HtmlMenuItem) app .createComponent(HtmlMenuItem.COMPONENT_TYPE); mi.setId("menuItem"); mi.getChildren().add(label); getContextMenu().getChildren().add(mi); } }
and exception is
09/11/16 12:37:28 INFO annotation.TomcatAnnotationLifecycleProvider: Creating instance of one.SimpleTreeBean
09/11/16 12:37:28 ERROR webapp._ErrorPageWriter: An exception occurred
javax.faces.FacesException: Exception while calling encodeBegin on component : {Component-Path : [Class: org.ajax4jsf.component.AjaxViewRoot,ViewId: /treetest.jsp][Class: javax.faces.component.html.HtmlForm,Id: j_id_jsp_1136468845_1][Class: org.richfaces.component.html.ContextMenu,Id: cm]}
at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:599)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:245)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:257)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:257)
at org.apache.myfaces.application.jsp.JspViewHandlerImpl.actuallyRenderView(JspViewHandlerImpl.java:427)
at org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:383)
at org.jenia.faces.template.handler.ViewHandler.renderView(ViewHandler.java:184)
at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100)
at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176)
at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:41)
at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:140)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:155)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:390)
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:517)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:301)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
Caused by: javax.faces.FacesException: Context menu cannot be attached to the component with id = j_id_jsp_1136468845_1, because a client identifier of the component won't be rendered onto the page. Please, set the identifier.
at org.richfaces.renderkit.html.ContextMenuRendererBase.ensureParentPresent(ContextMenuRendererBase.java:126)
at org.richfaces.renderkit.html.ContextMenuRendererBase.doEncodeBegin(ContextMenuRendererBase.java:110)
at org.ajax4jsf.renderkit.RendererBase.encodeBegin(RendererBase.java:101)
at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:596)
... 32 more
Please help me to resolve this exception