NPE when deleting a TreeNode with visible children
--------------------------------------------------

                 Key: WICKET-3057
                 URL: https://issues.apache.org/jira/browse/WICKET-3057
             Project: Wicket
          Issue Type: Bug
          Components: wicket, wicket-extensions
    Affects Versions: 1.4.12
         Environment: Mac OS X 10.4.11, Firefox 3.6.10
            Reporter: Mike Hefner


When using an org.apache.wicket.extensions.markup.html.tree.Tree, deleting a 
currently selected TreeNode that has been expanded so that its children are 
visible causes a NullPointerException.

In AbstractTree.treeNodesRemoved(), each of the deleted node's children is 
passed to DefaultTreeState.selectNode() to ensure that they are deselected. A 
flaw in the logic of that method caused the deleted node to be invalidated and 
mistakenly marked for rendering. When the deleted node is rendered, it no 
longer has a parent node, causing the NullPointerException on the line:
                TreeNode parent = node.getParent();

My fix was to correct the logic in DefaultTreeState.selectNode() so that 
passing in a currently unselected node for deselection does not affect the 
currently selected node. Thus, the deleted node is not invalidated and is not 
rendered.

Stack Trace:

java.lang.NullPointerException
at 
org.apache.wicket.extensions.markup.html.tree.DefaultAbstractTree.isNodeLast(DefaultAbstractTree.java:622)
at 
org.apache.wicket.extensions.markup.html.tree.DefaultAbstractTree.access$0(DefaultAbstractTree.java:620)
at 
org.apache.wicket.extensions.markup.html.tree.DefaultAbstractTree$1.onComponentTagBody(DefaultAbstractTree.java:310)
at org.apache.wicket.Component.renderComponent(Component.java:2686)
at org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1538)
at org.apache.wicket.Component.render(Component.java:2517)
at org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:1440)
at 
org.apache.wicket.MarkupContainer.renderComponentTagBody(MarkupContainer.java:1603)
at 
org.apache.wicket.MarkupContainer.onComponentTagBody(MarkupContainer.java:1527)
at org.apache.wicket.Component.renderComponent(Component.java:2686)
at org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1538)
at 
org.apache.wicket.markup.html.tree.AbstractTree$TreeItem.onRender(AbstractTree.java:215)
at org.apache.wicket.Component.render(Component.java:2517)
at org.apache.wicket.Component.renderComponent(Component.java:2627)
at 
org.apache.wicket.ajax.AjaxRequestTarget.respondComponent(AjaxRequestTarget.java:853)
at 
org.apache.wicket.ajax.AjaxRequestTarget.respondComponents(AjaxRequestTarget.java:682)
at org.apache.wicket.ajax.AjaxRequestTarget.respond(AjaxRequestTarget.java:592)
at 
org.apache.wicket.request.AbstractRequestCycleProcessor.respond(AbstractRequestCycleProcessor.java:105)
at 
org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1258)
at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329)
at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1436)
at org.apache.wicket.RequestCycle.request(RequestCycle.java:545)
at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:484)
at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:317)
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:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
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:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
at 
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:613)

Complete stack:

org.apache.wicket.WicketRuntimeException: Exception in rendering component: 
[MarkupContainer [Component id = indent]]
at org.apache.wicket.Component.renderComponent(Component.java:2725)
at org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1538)
at org.apache.wicket.Component.render(Component.java:2517)
at org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:1440)
at 
org.apache.wicket.MarkupContainer.renderComponentTagBody(MarkupContainer.java:1603)
at 
org.apache.wicket.MarkupContainer.onComponentTagBody(MarkupContainer.java:1527)
at org.apache.wicket.Component.renderComponent(Component.java:2686)
at org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1538)
at 
org.apache.wicket.markup.html.tree.AbstractTree$TreeItem.onRender(AbstractTree.java:215)
at org.apache.wicket.Component.render(Component.java:2517)
at org.apache.wicket.Component.renderComponent(Component.java:2627)
at 
org.apache.wicket.ajax.AjaxRequestTarget.respondComponent(AjaxRequestTarget.java:853)
at 
org.apache.wicket.ajax.AjaxRequestTarget.respondComponents(AjaxRequestTarget.java:682)
at org.apache.wicket.ajax.AjaxRequestTarget.respond(AjaxRequestTarget.java:592)
at 
org.apache.wicket.request.AbstractRequestCycleProcessor.respond(AbstractRequestCycleProcessor.java:105)
at 
org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1258)
at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329)
at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1436)
at org.apache.wicket.RequestCycle.request(RequestCycle.java:545)
at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:484)


-- 
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