From 9d0d2862ba98a68a4d7e2d7cbb31b5beb6fc3955 Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Wed, 4 Sep 2019 12:49:14 +0200 Subject: [PATCH] added check for availability of the tools.jar types --- .../BootJavaLanguageServerComponents.java | 1 - .../v2/SpringProcessConnectorLocal.java | 16 ++++++++++++- .../livehover/v2/SpringProcessTracker.java | 23 +++++++++++-------- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java index b9e83740a..92fb578ab 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java @@ -256,7 +256,6 @@ public class BootJavaLanguageServerComponents implements LanguageServerComponent } private void shutdown() { -// this.liveHoverWatchdog.shutdown(); this.liveProcessTracker.stop(); this.liveChangeDetectionWatchdog.shutdown(); this.cuCache.dispose(); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorLocal.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorLocal.java index aabb72311..28b0a7bfb 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorLocal.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorLocal.java @@ -87,6 +87,20 @@ public class SpringProcessConnectorLocal { }); } + /** + * checks whether this class can operate normally or not - it is recommended to check this before calling out to this class + * (if the attach to VirtualMachine library is not around, this class cannot really do anything and will throw exceptions) + */ + public static boolean isAvailable() { + try { + Class vmClass = VirtualMachine.class; + return vmClass != null; + } + catch (NoClassDefFoundError e) { + return false; + } + } + public void searchForNewProcesses() { List currentVms = VirtualMachine.list(); Set currentVMKeys = new HashSet<>(); @@ -211,5 +225,5 @@ public class SpringProcessConnectorLocal { int firstSpace = rawName.indexOf(' '); return firstSpace < 0 ? rawName : rawName.substring(0, firstSpace); } - + } 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 cd43f8c17..ac6770882 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 @@ -27,6 +27,7 @@ public class SpringProcessTracker { private final long POLLING_INTERVAL_MILLISECONDS; private final SpringProcessConnectorLocal localProcessConnector; + private final boolean isConnectorAvailable; private boolean automaticTrackingEnabled; private ScheduledThreadPoolExecutor timer; @@ -35,16 +36,28 @@ public class SpringProcessTracker { this.localProcessConnector = localProcessConnector; this.POLLING_INTERVAL_MILLISECONDS = pollingInterval == null ? DEFAULT_INTERVAL.toMillis() : pollingInterval.toMillis(); this.automaticTrackingEnabled = true; + + this.isConnectorAvailable = SpringProcessConnectorLocal.isAvailable(); } public synchronized void setTrackingEnabled(boolean trackingEnabled) { if (automaticTrackingEnabled != trackingEnabled) { automaticTrackingEnabled = trackingEnabled; - refresh(); + + if (automaticTrackingEnabled) { + start(); + } else { + stop(); + } } } public synchronized void start() { + if (!isConnectorAvailable) { + log.error("virtual machine connector library not available, no automatic local process tracking possible"); + return; + } + if (automaticTrackingEnabled && timer == null) { log.info("Starting SpringProcessTracker"); this.timer = new ScheduledThreadPoolExecutor(1); @@ -70,12 +83,4 @@ public class SpringProcessTracker { } } - private void refresh() { - if (automaticTrackingEnabled) { - start(); - } else { - stop(); - } - } - }