You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@myfaces.apache.org by Alex Burton <gr...@gmail.com> on 2006/01/17 07:32:08 UTC

Fwd: tree2 problem: Encountered a node [0] + with an illogical state

hi there,

Is there a way to properly flush the tree2 client and server side
components? I seem to get the below exception very regularly. I have a
drop down selection list that on change shows a different tree. after
a few goes i seem to get this pretty often.... i also seem to start
getting duplicates in the tree sometimes too... any ideas?

cheers,
Alex.



javax.servlet.ServletException: Encountered a node [0] + with an
illogical state.  Node is expanded but it is also considered a leaf (a
leaf cannot be considered expanded.
        javax.faces.webapp.FacesServlet.service(FacesServlet.java:121)
        org.apache.myfaces.component.html.util.ExtensionsFilter.doFilter(ExtensionsFilter.java:122)

root cause

java.lang.IllegalStateException: Encountered a node [0] + with an
illogical state.  Node is expanded but it is also considered a leaf (a
leaf cannot be considered expanded.
        org.apache.myfaces.custom.tree2.HtmlTreeRenderer.encodeNavigation(HtmlTreeRenderer.java:463)
        org.apache.myfaces.custom.tree2.HtmlTreeRenderer.encodeCurrentNode(HtmlTreeRenderer.java:346)
        org.apache.myfaces.custom.tree2.HtmlTreeRenderer.encodeTree(HtmlTreeRenderer.java:248)
        org.apache.myfaces.custom.tree2.HtmlTreeRenderer.encodeChildren(HtmlTreeRenderer.java:196)
        javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:319)
        javax.faces.webapp.UIComponentTag.encodeChildren(UIComponentTag.java:343)
        javax.faces.webapp.UIComponentTag.doEndTag(UIComponentTag.java:251)
        org.apache.jsp.structure_jsp._jspx_meth_t_tree2_0(structure_jsp.java:593)
        org.apache.jsp.structure_jsp._jspx_meth_h_form_0(structure_jsp.java:461)
        org.apache.jsp.structure_jsp._jspx_meth_f_view_0(structure_jsp.java:197)
        org.apache.jsp.structure_jsp._jspService(structure_jsp.java:147)
        org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:415)
        org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:234)
        org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:352)
        javax.faces.webapp.FacesServlet.service(FacesServlet.java:107)
        org.apache.myfaces.component.html.util.ExtensionsFilter.doFilter(ExtensionsFilter.java:122)


code:
                                <t:tree2
value="#{siteBean.navTreeModel}" id="tree"
                                var="node" varNodeToggler="t"
clientSideToggle="false"
                                 preserveToggle="false">
                                        <f:facet name="node">
                                                <h:panelGroup>
                                                       
<t:graphicImage value="images/document.png" border="0" />
                                                        <h:outputText
value="#{node.description}" />
                                                       
<t:graphicImage value="images/spacer.gif" width="10" height="1"
border="0" />
                                                        <t:popup
styleClass="popup" closePopupOnExitingPopup="true">
                                                               
<t:graphicImage value="images/edit.png" border="0" />
                                                               
<f:facet name="popup">
                                                                      
 <h:panelGroup>
                                                                      
         <h:panelGrid columns="1">
                                                                      
                 <h:outputText value="#{node.description}" />
                                                                      
                 <h:commandLink styleClass="document"
action="structure_add">
                                                                      
                         <t:graphicImage value="images/document.png"
border="0" />
                                                                      
                         <h:outputText value="Add new child page" />
                                                                      
                         <f:param name="structureForm:navItem.siteId"
value="#{siteBean.siteSelectedItem}" />
                                                                      
                         <f:param
name="structureForm:navItem.parentId"
value="#{node.identifier}" />
                                                                      
                 </h:commandLink>
                                                                      
         </h:panelGrid>
                                                                      
 </h:panelGroup>
                                                                </f:facet>
                                                        </t:popup>
                                                </h:panelGroup>
                                        </f:facet>
                                </t:tree2>

        <managed-bean>
                <managed-bean-name>siteBean</managed-bean-name>
               
<managed-bean-class>com.zuffle.cms.view.bean.SiteBean</managed-bean-class>
                <managed-bean-scope>session</managed-bean-scope>
        </managed-bean>


public class SiteBean extends BaseBean implements ValueChangeListener
{
        private Logger log = Logger.getLogger(this.getClass());

        private List sites;

        private List sitesSelectedItems = new ArrayList();

        private String siteSelectedItem;

        private Site site;

        private TreeModelBase navTreeModel;

        /**
         * Set up the SiteBean with data. It is held in the session.
         */
        public SiteBean()
        {
                // Get the sites
                this.sites =
this.serviceLocator.getStructureService().listSites(
                                new User());

                if (this.sites != null && this.sites.size() > 0)
                {
                        this.site = (Site) sites.get(0);
                        changeSiteValues();
                }
        }

        private void changeSiteValues()
        {
                // Select the first site (if there is one)
                if (this.sites != null && this.sites.size() > 0)
                {
                        // Turn into selects for controls
                        this.sitesSelectedItems = SelectItemHelper
                                        .getSelectItems(this.sites);

                        this.siteSelectedItem = this.site.getId().toString();
                        if (this.site.getStructures() != null
                                        && this.site.getStructures().size() > 0)
                        {
                                Structure structure = (Structure)
this.site.getStructures()
                                                .toArray()[0];
                                Set navItems = structure.getNavItems();
                                List listNavItems = new ArrayList(navItems);
                                NavItem rootNavItem = null;
                                try
                                {
                                        rootNavItem = (NavItem)
TreeHelper.collectionToTree(
                                                        "getId",
"getParentId", "getNavItems",
                                                        "setNavItems",
List.class, ArrayList.class,
                                                        listNavItems);
                                        TreeNodeBase rootNode = new
TreeNodeBase();
                                        rootNode =
walkTreeNode(rootNavItem, rootNode);
                                        this.navTreeModel = new
TreeModelBase(rootNode);
                                } catch (Exception e)
                                {
                                        // TODO: add handling
                                }
                        } else
                        {
                                // default entries
                                TreeNodeBase rootNode = new TreeNodeBase();
                                rootNode.setDescription("Missing home node");
                                rootNode.setIdentifier("0");
                                rootNode.setLeaf(true);
                                rootNode.setType("node");
                                this.navTreeModel = new TreeModelBase(rootNode);
                        }
                }
        }

        public Site getSite()
        {
                return site;
        }

        public void setSite(Site site)
        {
                this.site = site;
        }

        /**
         * The listener to change selected site
         */
        public void processValueChange(javax.faces.event.ValueChangeEvent event)
                        throws AbortProcessingException
        {
                log.debug("value change [" + event.getOldValue() + "] to ["
                                + event.getNewValue() + "]");
                //
                if (this.sites != null && this.sites.size() > 0)
                {
                        for (int i = 0; i < this.sites.size(); i++)
                        {
                                if (((Site)
sites.get(i)).getId().intValue() == Integer
                                                .parseInt((String)
event.getNewValue()))
                                {
                                        this.site = (Site) sites.get(i);
                                        changeSiteValues();
                                }
                        }
                }
        }

        public TreeModelBase getNavTreeModel() throws Exception
        {
                return navTreeModel;
        }

        public void setNavTreeModel(TreeModelBase navTreeModel)
        {
                this.navTreeModel = navTreeModel;
        }

        /**
         *
         */
        public TreeNodeBase walkTreeNode(NavItem navItem, TreeNodeBase navNode)
        {
                navNode.setDescription(navItem.getName() + "[" +
navItem.getOrder()
                                + "]");
                navNode.setIdentifier(navItem.getId().toString());

                if (navItem.getNavItems() != null &&
navItem.getNavItems().size() > 0)
                {
                        navNode.setLeaf(false);
                } else
                {
                        navNode.setLeaf(true);
                }

                navNode.setType("node");

                // step into child nodes
                List childNavItems = navItem.getNavItems();
                if (childNavItems != null)
                {
                        Iterator iChildNavItems = childNavItems.iterator();
                        while (iChildNavItems.hasNext())
                        {
                                NavItem childNavItem = (NavItem)
iChildNavItems.next();
                                TreeNodeBase childNode = new TreeNodeBase();
                                childNode = walkTreeNode(childNavItem,
childNode);
                                navNode.getChildren().add(childNode);
                        }
                }
                return navNode;
        }

        public List getSites()
        {
                return sites;
        }

        public void setSites(List sites)
        {
                this.sites = sites;
        }

        public String getSiteSelectedItem()
        {
                return siteSelectedItem;
        }

        public void setSiteSelectedItem(String siteSelectedItem)
        {
                this.siteSelectedItem = siteSelectedItem;
        }

        public List getSitesSelectedItems()
        {
                return sitesSelectedItems;
        }

        public void setSitesSelectedItems(List sitesSelectedItems)
        {
                this.sitesSelectedItems = sitesSelectedItems;
        }
}