Uploaded image for project: 'ZK'
  1. ZK
  2. ZK-3022

NPE when expand all node of Tree by set isOpen = true for all TreeItem

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Blocker
    • Resolution: Fixed
    • Affects Version/s: 8.0.0
    • Fix Version/s: 8.0.1
    • Component/s: None
    • Labels:
      None
    • gh.sprint.customfield.default.name:
      ZK 8.0.1 S3

      Description

      when you has a tree at latest three level. with init with all node is closed.
      add code to set isOpen = true to all node to expand all tree node.

      with prev 8.0.0, code do well and all job done at one request.
      from 8.0.0 it will create node at first request, and do render at second request (second request fire by javascript code and is fire ON_RENDER event)

      code at tree class, block handle event ON_RENDER:

                                        for (Treeitem ti : items) {
      					if (ti.isRendered())
      						continue;
      					int i = ti.getIndex();
      					if (maxItem == null) {
      						maxItem = ti;
      						maxIndex = i;
      					}
      					if (i > maxIndex) {
      						maxItem = ti;
      						maxIndex = i;
      					}
      					
      					ti.getChildren().clear();
      					Treechildren parent = (Treechildren) ti.getParent();
      					Object childNode = getAssociatedNode(ti, this);
      					renderChildren0(renderer, parent, ti, childNode, i);
      				}
      

      when render node at level 2. line ti.getChildren().clear(); will clear all child node.
      so when render not at level 3 code getAssociatedNode(ti, this) thru a NPE.

      below is code to re-proceduce bug:

      // build tree when init page
                    DefaultTreeNode<String> rootNode = new DefaultTreeNode<>("root", new  ArrayList<DefaultTreeNode<String>>());
      		
      		addChildNode (rootNode, 1, 3);
      		
      		for (TreeNode<String> nodeLv1:rootNode.getChildren()){
      			addChildNode (nodeLv1, 2, 3);
      			
      			for (TreeNode<String> nodeLv2:nodeLv1.getChildren()){
      				addChildNode (nodeLv2, 3, 3);
      			}
      		}
      		
      		DefaultTreeModel<String> model = new DefaultTreeModel<>(rootNode);
      		
      		expandAllTree = new Tree();
      		expandAllTree.setModel(model);
      		
      		this.appendChild(expandAllTree);
      
      // function add child node
      	public void addChildNode (TreeNode<String> node, int level, int num){
      		for (int i = 0; i < num; i++){
      			DefaultTreeNode<String> child = new DefaultTreeNode<String> (String.valueOf(level) + "_" + String.valueOf(i), new ArrayList<DefaultTreeNode<String>>());
      			node.add(child);
      		}
      			
      	}
      
      // function to expand tree
                protected void collapseTree (Component treeObject, boolean isOpen){	
      		if (treeObject instanceof Treeitem) {
      			Treeitem treeitem = (Treeitem) treeObject;
      			treeitem.setOpen(isOpen);
      		}
      		Collection<?> com = treeObject.getChildren();
      		if (com != null) {
      			for (Iterator<?> iterator = com.iterator(); iterator.hasNext();) {
      				collapseTree((Component) iterator.next(), isOpen);
      
      			}
      		}
      	}
      
      // call collapseTree in event handle button 
              collapseTree (expandAllTree, true);
      

      below is full NPE message

      java.lang.NullPointerException
      at org.zkoss.zul.Tree.getTreeitemPath(Tree.java:2385)
      at org.zkoss.zul.Tree.getAssociatedNode(Tree.java:2372)
      at org.zkoss.zul.Tree.service(Tree.java:2749)
      at org.zkoss.zk.ui.impl.DesktopImpl.service(DesktopImpl.java:713)
      at org.zkoss.zk.ui.impl.UiEngineImpl.execUpdate(UiEngineImpl.java:1306)
      at org.zkoss.zk.au.http.DHtmlUpdateServlet.process(DHtmlUpdateServlet.java:611)
      at org.zkoss.zk.au.http.DHtmlUpdateServlet.doGet(DHtmlUpdateServlet.java:485)
      at org.zkoss.zk.au.http.DHtmlUpdateServlet.doPost(DHtmlUpdateServlet.java:494)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
      at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:821)
      at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1685)
      at org.eclipse.jetty.servlets.PushCacheFilter.doFilter(PushCacheFilter.java:119)
      at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1668)
      at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581)
      at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
      at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
      at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)
      at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1158)
      at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)
      at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
      at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1090)
      at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
      at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213)
      at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109)
      at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119)
      at org.eclipse.jetty.server.Server.handle(Server.java:517)
      at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:308)
      at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242)
      at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:261)
      at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
      at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75)
      at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213)
      at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147)
      at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)
      at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)
      at java.lang.Thread.run(Thread.java:745)

        Attachments

          Activity

            People

            Assignee:
            christopherszu christopherszu
            Reporter:
            hiepgau hiepgau
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Dates

              Created:
              Updated:
              Resolved:

                Time Tracking

                Estimated:
                Original Estimate - Not Specified
                Not Specified
                Remaining:
                Remaining Estimate - 0 minutes
                0m
                Logged:
                Time Spent - 2 hours
                2h