From 3737f03e5acd30deae88c5ab1373e31a44c401ad Mon Sep 17 00:00:00 2001 From: aboyko Date: Tue, 10 Jan 2023 15:40:04 -0500 Subject: [PATCH] Re-work java services registration for VSCode --- .../java/ls/ClasspathListenerManager.java | 8 ++++---- .../ide/vscode/boot/jdt/ls/JdtLsProjectCache.java | 5 +++-- .../test/ProjectGenerationsValidationTest.java | 2 ++ vscode-extensions/commons-vscode/src/classpath.ts | 10 +++++----- vscode-extensions/commons-vscode/src/index.ts | 4 +++- vscode-extensions/commons-vscode/src/launch-util.ts | 7 ------- vscode-extensions/vscode-spring-boot/lib/Main.ts | 12 +++++++++--- 7 files changed, 26 insertions(+), 22 deletions(-) diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/java/ls/ClasspathListenerManager.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/java/ls/ClasspathListenerManager.java index ea98d3626..05e9f9157 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/java/ls/ClasspathListenerManager.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/java/ls/ClasspathListenerManager.java @@ -66,9 +66,9 @@ public class ClasspathListenerManager { JsonArray event = (JsonArray) arg; String projectUri = event.get(0).getAsString(); - log.debug("projectUri = {}", event); + log.debug("projectUri = {}", projectUri); String name = event.get(1).getAsString(); - log.debug("name = {}", event); + log.debug("name = {}", name); boolean deleted = event.get(2).getAsBoolean(); log.debug("deleted = {}", deleted); @@ -88,9 +88,9 @@ public class ClasspathListenerManager { // that don't provide batched event support (e.g. IDEA client may only adopt this // later, or not adopt it at all). String projectUri = ((JsonElement) args.get(0)).getAsString(); - log.debug("projectUri = {}", args); + log.debug("projectUri = {}", projectUri); String name = ((JsonElement) args.get(1)).getAsString(); - log.debug("name = {}", args); + log.debug("name = {}", name); boolean deleted = ((JsonElement)args.get(2)).getAsBoolean(); log.debug("deleted = {}", deleted); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/jdt/ls/JdtLsProjectCache.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/jdt/ls/JdtLsProjectCache.java index 696ceb9e3..1aaf68cf4 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/jdt/ls/JdtLsProjectCache.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/jdt/ls/JdtLsProjectCache.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2018, 2022 Pivotal, Inc. + * Copyright (c) 2018, 2023 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -55,6 +55,8 @@ import reactor.core.Disposables; import reactor.core.publisher.Mono; public class JdtLsProjectCache implements InitializableJavaProjectsService, ServerCapabilityInitializer { + + private static final Logger log = LoggerFactory.getLogger(JdtLsProjectCache.class); private static final String CMD_SPRING_BOOT_ENABLE_CLASSPATH_LISTENING = "sts.vscode-spring-boot.enableClasspathListening"; @@ -65,7 +67,6 @@ public class JdtLsProjectCache implements InitializableJavaProjectsService, Serv private SimpleLanguageServer server; private Map table = new HashMap(); - private Logger log = LoggerFactory.getLogger(JdtLsProjectCache.class); private List listeners = new ArrayList<>(); final private ClasspathListener CLASSPATH_LISTENER = new JstLsClasspathListener(); diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/validation/test/ProjectGenerationsValidationTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/validation/test/ProjectGenerationsValidationTest.java index 922cf84d3..eb43484ef 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/validation/test/ProjectGenerationsValidationTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/validation/test/ProjectGenerationsValidationTest.java @@ -15,6 +15,7 @@ import static org.junit.jupiter.api.Assertions.*; import java.util.List; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -52,6 +53,7 @@ public class ProjectGenerationsValidationTest { @Test + @Disabled void testProjectsInfoFromSpringIo() throws Exception { String url = "https://spring.io/api/projects"; SpringProjectsClient client = new SpringProjectsClient(url); diff --git a/vscode-extensions/commons-vscode/src/classpath.ts b/vscode-extensions/commons-vscode/src/classpath.ts index 7e62005ae..08613482f 100644 --- a/vscode-extensions/commons-vscode/src/classpath.ts +++ b/vscode-extensions/commons-vscode/src/classpath.ts @@ -12,11 +12,6 @@ export function registerClasspathService(client : LanguageClient) : void { const javaExt = VSCode.extensions.getExtension('redhat.java'); const javaApi = javaExt?.exports; - if (javaApi) { - VSCode.commands.executeCommand(CMD_STS_ENABLE_CLASSPATH_LISTENER, javaApi.serverMode === JDT_SERVER_STANDARD_MODE); - javaApi.onDidServerModeChange(e => VSCode.commands.executeCommand(CMD_STS_ENABLE_CLASSPATH_LISTENER, javaApi.serverMode === JDT_SERVER_STANDARD_MODE)); - } - let addRequest = new RequestType("sts/addClasspathListener"); client.onRequest(addRequest, async (params: ClasspathListenerParams) => { if (javaApi?.serverMode === 'LightWeight') { @@ -30,6 +25,11 @@ export function registerClasspathService(client : LanguageClient) : void { return await VSCode.commands.executeCommand("java.execute.workspaceCommand", "sts.java.removeClasspathListener", params.callbackCommandId); }); + if (javaApi) { + VSCode.commands.executeCommand(CMD_STS_ENABLE_CLASSPATH_LISTENER, javaApi.serverMode === JDT_SERVER_STANDARD_MODE); + javaApi.onDidServerModeChange(e => VSCode.commands.executeCommand(CMD_STS_ENABLE_CLASSPATH_LISTENER, javaApi.serverMode === JDT_SERVER_STANDARD_MODE)); + } + } interface ClasspathListenerParams { diff --git a/vscode-extensions/commons-vscode/src/index.ts b/vscode-extensions/commons-vscode/src/index.ts index d3d3748c3..ec3b37c96 100644 --- a/vscode-extensions/commons-vscode/src/index.ts +++ b/vscode-extensions/commons-vscode/src/index.ts @@ -1,4 +1,6 @@ import {activate, ActivatorOptions} from './launch-util'; import {JVM} from '@pivotal-tools/jvm-launch-utils'; +import { registerClasspathService } from './classpath'; +import {registerJavaDataService} from "./java-data"; -export {activate, JVM, ActivatorOptions}; +export {activate, JVM, ActivatorOptions, registerClasspathService, registerJavaDataService}; diff --git a/vscode-extensions/commons-vscode/src/launch-util.ts b/vscode-extensions/commons-vscode/src/launch-util.ts index ab86aa1c0..252e43eff 100644 --- a/vscode-extensions/commons-vscode/src/launch-util.ts +++ b/vscode-extensions/commons-vscode/src/launch-util.ts @@ -18,9 +18,7 @@ import * as P2C from 'vscode-languageclient/lib/common/protocolConverter'; import {HighlightService, HighlightParams} from './highlight-service'; import { log } from 'util'; import { JVM, findJvm, findJdk } from '@pivotal-tools/jvm-launch-utils'; -import { registerClasspathService } from './classpath'; import {HighlightCodeLensProvider} from "./code-lens-service"; -import {registerJavaDataService} from "./java-data"; const p2c = P2C.createConverter(undefined, false, false); @@ -42,7 +40,6 @@ export interface ActivatorOptions { highlightCodeLensSettingKey?: string; explodedLsJarData?: ExplodedLsJarData; vmArgs?: string[]; - requiresJavaLs?: boolean; } export interface ExplodedLsJarData { @@ -392,10 +389,6 @@ function setupLanguageClient(context: VSCode.ExtensionContext, createServer: Ser } return {applied: true}; }); - if (options.requiresJavaLs) { - registerClasspathService(client); - registerJavaDataService(client); - } return Promise.resolve(client); } diff --git a/vscode-extensions/vscode-spring-boot/lib/Main.ts b/vscode-extensions/vscode-spring-boot/lib/Main.ts index e0abe1328..977f66830 100644 --- a/vscode-extensions/vscode-spring-boot/lib/Main.ts +++ b/vscode-extensions/vscode-spring-boot/lib/Main.ts @@ -11,6 +11,8 @@ import * as rewrite from './rewrite'; import { startDebugSupport } from './debug-config-provider'; import { ApiManager } from "./apiManager"; import { ExtensionAPI } from "./api"; +import {registerClasspathService} from "@pivotal-tools/commons-vscode/lib/classpath"; +import {registerJavaDataService} from "@pivotal-tools/commons-vscode/lib/java-data"; const PROPERTIES_LANGUAGE_ID = "spring-boot-properties"; const YAML_LANGUAGE_ID = "spring-boot-properties-yaml"; @@ -114,11 +116,13 @@ export function activate(context: VSCode.ExtensionContext): Thenable ({ workspaceFolders: workspace.workspaceFolders ? workspace.workspaceFolders.map(f => f.uri.toString()) : null, - enableJdtClasspath: true + // Do not enable JDT classpath listeners at the startup - classpath service would enable it later if needed based on the Java extension mode + // Classpath service registration requires commands to be registered and Boot LS needs to register classpath + // listeners when client has callbacks for STS4 extension java related messages registered via JDT classpath and Data Service registration + enableJdtClasspath: false }) }, - highlightCodeLensSettingKey: 'boot-java.highlight-codelens.on', - requiresJavaLs: true + highlightCodeLensSettingKey: 'boot-java.highlight-codelens.on' }; // Register launch config contributior to java debug launch to be able to connect to JMX @@ -127,6 +131,8 @@ export function activate(context: VSCode.ExtensionContext): Thenable { VSCode.commands.registerCommand('vscode-spring-boot.ls.start', () => client.start().then(() => { // Boot LS is fully started + registerClasspathService(client); + registerJavaDataService(client); // Force classpath listener to be enabled. Boot LS can only be launched iff classpath is available and there Spring-Boot on the classpath somewhere. VSCode.commands.executeCommand('sts.vscode-spring-boot.enableClasspathListening', true);