From 2d7fc49d0896bc214414beb30d0cb58c1ce3d76e Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Tue, 1 Oct 2019 19:41:17 +0200 Subject: [PATCH] avoid automatic process tracker to automatically reconnect to a process when the user manually disconnected from it --- .../livehover/v2/SpringProcessTracker.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessTracker.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessTracker.java index c8aade510..8fda9bd14 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessTracker.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessTracker.java @@ -11,6 +11,9 @@ package org.springframework.ide.vscode.boot.java.livehover.v2; import java.time.Duration; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -33,11 +36,14 @@ public class SpringProcessTracker { private boolean automaticTrackingEnabled; private Duration POLLING_INTERVAL; private ScheduledThreadPoolExecutor timer; + + private Set processesAlreadySeen; public SpringProcessTracker(SpringProcessConnectorLocal localProcessConnector, Duration pollingInterval) { this.localProcessConnector = localProcessConnector; this.POLLING_INTERVAL = pollingInterval != null ? pollingInterval : Duration.ofMillis(BootJavaConfig.LIVE_INFORMATION_AUTOMATIC_TRACKING_DELAY_DEFAULT); this.automaticTrackingEnabled = false; + this.processesAlreadySeen = new HashSet<>(); this.isConnectorAvailable = SpringProcessConnectorLocal.isAvailable(); } @@ -92,12 +98,27 @@ public class SpringProcessTracker { try { SpringProcessDescriptor[] autoConnectProcesses = this.localProcessConnector.getProcesses(true, SpringProcessStatus.AUTO_CONNECT); + Set autoConnectProcessKeys = new HashSet<>(); + for (SpringProcessDescriptor process : autoConnectProcesses) { - if (!this.localProcessConnector.isConnected(process.getProcessKey())) { + autoConnectProcessKeys.add(process.getProcessKey()); + + if (!processesAlreadySeen.contains(process.getProcessKey())) { + processesAlreadySeen.add(process.getProcessKey()); + log.info("auto-connect to process: " + process.getProcessKey()); this.localProcessConnector.connectProcess(process); } } + + // cleanup list of already seen processes + Iterator iter = this.processesAlreadySeen.iterator(); + while (iter.hasNext()) { + String processKey = iter.next(); + if (!autoConnectProcessKeys.contains(processKey)) { + iter.remove(); + } + } } catch (Throwable e) { log.error("error searching for local processes", e);