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