Deleting a treenode results in NPE
----------------------------------

                 Key: WICKET-1226
                 URL: https://issues.apache.org/jira/browse/WICKET-1226
             Project: Wicket
          Issue Type: Bug
          Components: wicket
    Affects Versions: 1.3.0-rc1
            Reporter: Doug Leeper
             Fix For: 1.3.0-rc3


I have a LinkTree with the root node visible.  When deleting the last child 
tree node from the root, I get a NullPointerException.

java.lang.NullPointerException
     at 
org.apache.wicket.markup.html.tree.BaseTree.isNodeLast(BaseTree.java:167)
     at org.apache.wicket.markup.html.tree.BaseTree.access$000(BaseTree.java:49)
     at 
org.apache.wicket.markup.html.tree.BaseTree$JunctionBorder.renderBefore(BaseTree.java:215)
     at org.apache.wicket.Component.render(Component.java:2254)
     at org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:1240)
     at 
org.apache.wicket.MarkupContainer.renderComponentTagBody(MarkupContainer.java:1407)
     at 
org.apache.wicket.MarkupContainer.onComponentTagBody(MarkupContainer.java:1344)
     at org.apache.wicket.Component.renderComponent(Component.java:2419)
     at org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1354)
     at 
org.apache.wicket.markup.html.tree.AbstractTree$TreeItem.onRender(AbstractTree.java:203)
     at org.apache.wicket.Component.render(Component.java:2256)
     at 
org.apache.wicket.markup.html.tree.AbstractTree$TreeItemContainer$1.visitItem(AbstractTree.java:383)
     at 
org.apache.wicket.markup.html.tree.AbstractTree.visitItemAndChildren(AbstractTree.java:1430)
     at 
org.apache.wicket.markup.html.tree.AbstractTree.visitItemChildren(AbstractTree.java:1449)
     at 
org.apache.wicket.markup.html.tree.AbstractTree.visitItemAndChildren(AbstractTree.java:1431)
     at 
org.apache.wicket.markup.html.tree.AbstractTree.visitItemChildren(AbstractTree.java:1449)
     at 
org.apache.wicket.markup.html.tree.AbstractTree.visitItemAndChildren(AbstractTree.java:1431)
     at 
org.apache.wicket.markup.html.tree.AbstractTree.access$4(AbstractTree.java:1428)
     at 
org.apache.wicket.markup.html.tree.AbstractTree$TreeItemContainer.onRender(AbstractTree.java:390)
     at org.apache.wicket.Component.render(Component.java:2256)
     at org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:1240)
     at 
org.apache.wicket.MarkupContainer.renderComponentTagBody(MarkupContainer.java:1407)
     at 
org.apache.wicket.MarkupContainer.renderAssociatedMarkup(MarkupContainer.java:631)
     at 
org.apache.wicket.markup.html.panel.Panel.onComponentTagBody(Panel.java:112)
     at org.apache.wicket.Component.renderComponent(Component.java:2419)
     at org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1354)
     at org.apache.wicket.Component.render(Component.java:2256)
     at org.apache.wicket.Component.renderComponent(Component.java:2359)
     at 
org.apache.wicket.ajax.AjaxRequestTarget.respondComponent(AjaxRequestTarget.java:702)
     at 
org.apache.wicket.ajax.AjaxRequestTarget.respondComponents(AjaxRequestTarget.java:604)
     at 
org.apache.wicket.ajax.AjaxRequestTarget.respond(AjaxRequestTarget.java:519)
     at 
org.apache.wicket.request.AbstractRequestCycleProcessor.respond(AbstractRequestCycleProcessor.java:103)
     at 
org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1100)
     at org.apache.wicket.RequestCycle.step(RequestCycle.java:1169)
     at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1248)
     at org.apache.wicket.RequestCycle.request(RequestCycle.java:489)
     at 
org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:354)
     at 
org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:194)
     at 
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
     at homeiq.hib.web.HibernateFilter.doFilter(HibernateFilter.java:68)
     at 
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
     at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
     at 
org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
     at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
     at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
     at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
     at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
     at org.mortbay.jetty.Server.handle(Server.java:313)
     at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506)
     at 
org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:830)
     at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514)
     at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
     at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)
     at 
org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396)
     at 
org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)

A possible fix is the following:

In BaseTree.java:

               public void renderBefore(Component component)
                {
                        Response response = RequestCycle.get().getResponse();
                        TreeNode parent = node.getParent();

                        CharSequence classes[] = new CharSequence[level];
                        for (int i = 0; i < level; ++i)
                        {
                                // FIX
                                //if (isNodeLast(parent))
                                if ( parent == null || isNodeLast(parent) ) {
                                {
                                        classes[i] = "spacer";
                                }
                                else
                                {
                                        classes[i] = "line";
                                }

                                parent = parent.getParent();
                        }

                        for (int i = level - 1; i >= 0; --i)
                        {
                                response.write("<td class=\"" + classes[i] + 
"\"><span></span></td>");
                        }

                        if (isNodeLast(node))
                        {
                                response.write("<td class=\"half-line\">");
                        }
                        else
                        {
                                response.write("<td class=\"line\">");
                        }
                }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to