|
16 | 16 | import java.util.List; |
17 | 17 | import java.util.Map; |
18 | 18 | import java.util.concurrent.CompletableFuture; |
| 19 | +import java.util.concurrent.atomic.AtomicInteger; |
19 | 20 | import java.util.logging.Level; |
20 | 21 | import java.util.logging.Logger; |
| 22 | +import java.util.stream.Collectors; |
21 | 23 |
|
22 | 24 | import com.microsoft.java.debug.core.Configuration; |
23 | 25 | import com.microsoft.java.debug.core.adapter.handler.AttachRequestHandler; |
@@ -67,17 +69,24 @@ public CompletableFuture<Messages.Response> dispatchRequest(Messages.Request req |
67 | 69 |
|
68 | 70 | Command command = Command.parse(request.command); |
69 | 71 | List<Command> dependencies = getCommandDependencies(command); |
| 72 | + CompletableFuture<Object> aggregatedDependencyFuture = new CompletableFuture<>(); |
| 73 | + if (dependencies.size() == 0) { |
| 74 | + aggregatedDependencyFuture.complete(null); |
| 75 | + } else { |
| 76 | + AtomicInteger unresolvedFutureCount = new AtomicInteger(dependencies.size()); |
| 77 | + for (CompletableFuture<Messages.Response> result : getFutures(dependencies)) { |
| 78 | + result.whenComplete((res, err) -> { |
| 79 | + if (unresolvedFutureCount.decrementAndGet() == 0) { |
| 80 | + aggregatedDependencyFuture.complete(null); |
| 81 | + } |
| 82 | + }); |
| 83 | + } |
| 84 | + } |
70 | 85 |
|
71 | | - getLastResults(dependencies) |
72 | | - |
73 | | - CompletableFuture<Messages.Response> thisResponse = CompletableFuture |
74 | | - .allOf(getLastResults(dependencies)) |
75 | | - .thenCompose((Void v) -> { |
76 | | - return processRequest(request, response); |
77 | | - }); |
| 86 | + CompletableFuture<Messages.Response> thisFuture = aggregatedDependencyFuture.thenCompose(o -> processRequest(request, response)); |
| 87 | + setFuture(command, thisFuture); |
78 | 88 |
|
79 | | - setLastResult(command, thisResponse); |
80 | | - return thisResponse; |
| 89 | + return thisFuture; |
81 | 90 | } |
82 | 91 |
|
83 | 92 | private CompletableFuture<Messages.Response> processRequest(Messages.Request request, Messages.Response response) { |
@@ -149,15 +158,15 @@ private List<Command> getCommandDependencies(Command command) { |
149 | 158 | return commandDependencies.computeIfAbsent(command, key -> new ArrayList()); |
150 | 159 | } |
151 | 160 |
|
152 | | - private CompletableFuture<Messages.Response> getLastResult(Command command) { |
| 161 | + private CompletableFuture<Messages.Response> getFuture(Command command) { |
153 | 162 | return lastResponses.computeIfAbsent(command, key -> CompletableFuture.completedFuture(new Messages.Response())); |
154 | 163 | } |
155 | 164 |
|
156 | | - private List<CompletableFuture<Messages.Response>> getLastResults(List<Command> commands) { |
157 | | - return new ArrayList(commands.stream().map(cmd -> getLastResult(cmd)).toArray(CompletableFuture[]::new)); |
| 165 | + private List<CompletableFuture<Messages.Response>> getFutures(List<Command> commands) { |
| 166 | + return commands.stream().map(cmd -> getFuture(cmd)).collect(Collectors.toList()); |
158 | 167 | } |
159 | 168 |
|
160 | | - private void setLastResult(Command command, CompletableFuture<Messages.Response> response) { |
| 169 | + private void setFuture(Command command, CompletableFuture<Messages.Response> response) { |
161 | 170 | lastResponses.put(command, response); |
162 | 171 | } |
163 | 172 | } |
0 commit comments