You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by sd...@apache.org on 2022/02/18 07:25:03 UTC

[netbeans] branch master updated: Fixed endless CompletionStage chaining.

This is an automated email from the ASF dual-hosted git repository.

sdedic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new 2d010f9  Fixed endless CompletionStage chaining.
     new 2df6992  Merge pull request #3621 from sdedic/lsp/endless-getNodeId
2d010f9 is described below

commit 2d010f98735e3cc289082cdee2cab02a9bce69ad
Author: Svata Dedic <sv...@oracle.com>
AuthorDate: Thu Feb 17 10:28:55 2022 +0100

    Fixed endless CompletionStage chaining.
---
 .../java/lsp/server/explorer/TreeViewProvider.java | 23 ++++++++++----
 .../lsp/server/explorer/TreeViewProviderTest.java  | 35 ++++++++++++++++++++++
 2 files changed, 53 insertions(+), 5 deletions(-)

diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/TreeViewProvider.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/TreeViewProvider.java
index 581355d..7171331 100644
--- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/TreeViewProvider.java
+++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/explorer/TreeViewProvider.java
@@ -34,6 +34,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.LinkedHashSet;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -474,6 +475,7 @@ public abstract class TreeViewProvider {
     public CompletionStage<Integer> getNodeId(Node n) {
         Integer i;
         List<Node> toExpand = new ArrayList<>();
+        toExpand.add(n);
         synchronized (this) {
             i = idMap.get(n);
             if (i != null) {
@@ -486,20 +488,26 @@ public abstract class TreeViewProvider {
                 if (i != null) {
                     break;
                 }
+                parent = parent.getParentNode();
             }
             if (parent == null) {
                 return CompletableFuture.completedFuture(null);
             }
         }
-        CompletionStage<Node[]> stage = null;
-        for (Node p : toExpand) {
-            if (stage == null) {
+        CompletionStage<Integer> nextStage = null;
+        // do not iterate index #0
+        for (int idx = toExpand.size() - 1; idx > 0; idx--) {
+            CompletionStage<Node[]> stage = null;
+            Node p = toExpand.get(idx);
+            if (nextStage == null) {
                 stage = getChildren(p);
             } else {
-                stage = stage.thenCompose((nodes) -> getChildren(p));
+                stage = nextStage.thenCompose((x) -> getChildren(p));
             }
+            final int fidx = idx - 1;
+            nextStage = stage.thenApply((ch) -> findId(toExpand.get(fidx)));
         }
-        return stage.thenCompose((any) -> getNodeId(n));
+        return nextStage;
     }
 
     public final CompletionStage<TreeItem> getTreeItem(int id) {
@@ -680,4 +688,9 @@ public abstract class TreeViewProvider {
         }
     }
     
+    /* testing */ SortedMap<Integer, NodeHolder> getHolders() {
+        synchronized (this) {
+            return new TreeMap<>(holdChildren);
+        }
+    }
 }
diff --git a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/explorer/TreeViewProviderTest.java b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/explorer/TreeViewProviderTest.java
index e3b1071..9298304 100644
--- a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/explorer/TreeViewProviderTest.java
+++ b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/explorer/TreeViewProviderTest.java
@@ -21,6 +21,10 @@ package org.netbeans.modules.java.lsp.server.explorer;
 import java.io.File;
 import java.util.HashSet;
 import java.util.Set;
+import java.util.SortedMap;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionStage;
+import java.util.concurrent.TimeUnit;
 import org.junit.Test;
 import static org.junit.Assert.*;
 import org.openide.explorer.ExplorerManager;
@@ -119,6 +123,37 @@ public class TreeViewProviderTest {
     }
 
 
+    /**
+     * A call to getNodeId for a nested node should materialize & register parents
+     * in the TreeViewProvider.
+     */
+    @Test
+    public void getNodeIdRegistersParents() throws Exception {
+        ExplorerManager em = new ExplorerManager();
+        Node r = new FibNode(10);
+        em.setRootContext(r);
+        
+        Node[] firstLevel = r.getChildren().getNodes(true);
+        Node[] secondLevel = firstLevel[0].getChildren().getNodes(true);
+        Node[] thirdLevel = secondLevel[1].getChildren().getNodes(true);
+        
+        Node toFind = thirdLevel[0];
+        
+        TreeViewProviderImpl tvp = new TreeViewProviderImpl(em, registry);
+        
+        CompletionStage<Integer> nodeId = tvp.getNodeId(toFind);
+        int id = nodeId.toCompletableFuture().get(30, TimeUnit.SECONDS);
+        assertSame(toFind, tvp.findNode(id));
+        
+        // make clone of the map before asking for node IDs.
+        SortedMap<Integer, TreeViewProvider.NodeHolder> map = tvp.getHolders();
+        int parentId = tvp.findId(toFind.getParentNode());
+        int grandParentId = tvp.findId(toFind.getParentNode().getParentNode());
+        
+        assertNotNull(map.get(parentId));
+        assertNotNull(map.get(grandParentId));
+    }
+
     final static class TreeViewProviderImpl extends TreeViewProvider {
         private Set<Node> changed = new HashSet<>();
 

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists