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
 
     
    