From a19082813f686c4f8ceab920d43c8bcdae4cc6e1 Mon Sep 17 00:00:00 2001 From: aboyko Date: Mon, 13 Feb 2023 18:41:04 -0500 Subject: [PATCH] Shared properties metadata file preference setting --- .../plugin.xml | 5 +- .../tooling/boot/ls/Constants.java | 4 +- .../DelegatingStreamConnectionProvider.java | 5 + .../RewriteCommandsQuickAccessProvider.java | 92 --------------- .../commands/SpringQuickAccessProvider.java | 110 ++++++++++++++++++ .../ls/prefs/BootJavaPreferencesPage.java | 9 ++ .../ide/vscode/boot/app/BootJavaConfig.java | 9 +- .../boot/app/BootLanguageServerBootApp.java | 4 +- .../boot/app/BootLanguageServerParams.java | 8 +- .../DefaultSpringPropertyIndexProvider.java | 14 ++- .../boot/metadata/PropertiesLoader.java | 8 +- .../SpringPropertiesIndexManager.java | 34 +++++- .../boot/metadata/SpringPropertyIndex.java | 82 +++++++++---- .../editor/harness/PropertyIndexHarness.java | 4 +- .../harness/BootLanguageServerHarness.java | 4 +- .../vscode-spring-boot/package.json | 12 ++ 16 files changed, 267 insertions(+), 137 deletions(-) delete mode 100644 eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/commands/RewriteCommandsQuickAccessProvider.java create mode 100644 eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/commands/SpringQuickAccessProvider.java diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/plugin.xml b/eclipse-language-servers/org.springframework.tooling.boot.ls/plugin.xml index 8e099e96d..6b5e33387 100644 --- a/eclipse-language-servers/org.springframework.tooling.boot.ls/plugin.xml +++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/plugin.xml @@ -472,8 +472,9 @@ name="Spring - Live Process Information" requiresUIAccess="false"/> + class="org.springframework.tooling.boot.ls.commands.SpringQuickAccessProvider" + name="Spring" + requiresUIAccess="false"> usedLanguageServers = LanguageServiceAccessor.getActiveLanguageServers(serverCapabilities -> true); - - if (usedLanguageServers.isEmpty()) { - return; - } - - ExecuteCommandParams commandParams = new ExecuteCommandParams(); - commandParams.setCommand(CMD_REWRITE_RELOAD); - - commandParams.setArguments(Collections.emptyList()); - - try { - CompletableFuture.allOf(usedLanguageServers.stream().map(ls -> - ls.getWorkspaceService().executeCommand(commandParams)).toArray(CompletableFuture[]::new)).get(2, TimeUnit.SECONDS); - } - catch (Exception e) { - BootLanguageServerPlugin.getDefault().getLog().error("Failed to reload OpenRewrite Recipes!", e); - } - } - } - }; - } - - @Override - public QuickAccessElement[] computeElements() { - return new QuickAccessElement[0]; - } - - @Override - public void resetState() { - } - - @Override - public boolean needsRefresh() { - return false; - } - -} diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/commands/SpringQuickAccessProvider.java b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/commands/SpringQuickAccessProvider.java new file mode 100644 index 000000000..6c6cfd139 --- /dev/null +++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/commands/SpringQuickAccessProvider.java @@ -0,0 +1,110 @@ +/******************************************************************************* + * Copyright (c) 2023 VMware, 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 + * https://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VMware, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.tooling.boot.ls.commands; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.lsp4e.LanguageServiceAccessor; +import org.eclipse.lsp4j.ExecuteCommandParams; +import org.eclipse.lsp4j.services.LanguageServer; +import org.eclipse.ui.quickaccess.IQuickAccessComputer; +import org.eclipse.ui.quickaccess.IQuickAccessComputerExtension; +import org.eclipse.ui.quickaccess.QuickAccessElement; +import org.springframework.tooling.boot.ls.BootLanguageServerPlugin; + +@SuppressWarnings("restriction") +public class SpringQuickAccessProvider implements IQuickAccessComputer, IQuickAccessComputerExtension { + + final private QuickAccessElement reloadPropertiesAction = createForNoArgsLsCommand( + "sts/common-properties/reload", + "Reload Shared Properties Metadata", + "Failed to reload shared properties metadata file!" + ); + + final private QuickAccessElement reloadRecipesAction = createForNoArgsLsCommand( + "sts/rewrite/reload", + "Reload OpenRewrite Recipes, Code Actions, Problem and Quick Fix Descriptors", + "Failed to reload OpenRewrite Recipes!" + ); + + private static QuickAccessElement createForNoArgsLsCommand(String commandId, String label, String errorMsg) { + return new QuickAccessElement() { + + @Override + public String getLabel() { + return label; + } + + @Override + public ImageDescriptor getImageDescriptor() { + return null; + } + + @Override + public String getId() { + return commandId; + } + + @Override + public void execute() { + List usedLanguageServers = LanguageServiceAccessor.getActiveLanguageServers(serverCapabilities -> true); + + if (usedLanguageServers.isEmpty()) { + return; + } + + ExecuteCommandParams commandParams = new ExecuteCommandParams(); + commandParams.setCommand(commandId); + + commandParams.setArguments(Collections.emptyList()); + + try { + CompletableFuture.allOf(usedLanguageServers.stream().map(ls -> + ls.getWorkspaceService().executeCommand(commandParams)).toArray(CompletableFuture[]::new)).get(2, TimeUnit.SECONDS); + } + catch (Exception e) { + BootLanguageServerPlugin.getDefault().getLog().error(errorMsg, e); + } + } + }; + } + + @Override + public QuickAccessElement[] computeElements() { + return new QuickAccessElement[] { + reloadPropertiesAction, + reloadRecipesAction + }; + } + + @Override + public void resetState() { + } + + @Override + public boolean needsRefresh() { + return false; + } + + @Override + public QuickAccessElement[] computeElements(String query, IProgressMonitor monitor) { + return new QuickAccessElement[] { + reloadPropertiesAction, + reloadRecipesAction + }; + } + +} diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/prefs/BootJavaPreferencesPage.java b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/prefs/BootJavaPreferencesPage.java index 78cf8fe14..2d2109326 100644 --- a/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/prefs/BootJavaPreferencesPage.java +++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/prefs/BootJavaPreferencesPage.java @@ -10,8 +10,11 @@ *******************************************************************************/ package org.springframework.tooling.boot.ls.prefs; +import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.preference.BooleanFieldEditor; import org.eclipse.jface.preference.FieldEditorPreferencePage; +import org.eclipse.jface.preference.FileFieldEditor; +import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; @@ -40,6 +43,12 @@ public class BootJavaPreferencesPage extends FieldEditorPreferencePage implement addField(new BooleanFieldEditor(Constants.PREF_CHANGE_DETECTION, "Live Boot Change Detection", fieldEditorParent)); + Composite c = new Composite(fieldEditorParent, SWT.NONE); + GridDataFactory.fillDefaults().grab(true, false).applyTo(c); + FileFieldEditor propMetadataFileEditor = new FileFieldEditor(Constants.PREF_COMMON_PROPS_METADATA, "Shared Properties", true, c); + propMetadataFileEditor.setFileExtensions(new String[] {"json"}); + addField(propMetadataFileEditor); + } } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootJavaConfig.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootJavaConfig.java index 95ca76357..0d9eab7da 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootJavaConfig.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootJavaConfig.java @@ -11,6 +11,8 @@ package org.springframework.ide.vscode.boot.app; import java.io.File; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -156,7 +158,7 @@ public class BootJavaConfig implements InitializingBean { } public String getSpringIOApiUrl() { - String url = getRawSettings().getString("spring-boot", "io", "api"); + String url = getRawSettings().getString("boot-java", "io", "api"); return url == null ? SPRING_IO_API_URL : url; } @@ -192,6 +194,11 @@ public class BootJavaConfig implements InitializingBean { return settings.getStringSet("boot-java", "rewrite", "scan-files"); } + public Path getCommonPropertiesFile() { + String str = settings.getString("boot-java", "common", "properties-metadata"); + return str == null || str.isBlank() ? null : Paths.get(str); + } + public Settings getRawSettings() { return settings; } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerBootApp.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerBootApp.java index 9a50d3d50..8b2b8a147 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerBootApp.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerBootApp.java @@ -219,8 +219,8 @@ public class BootLanguageServerBootApp { } @ConditionalOnMissingClass("org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness") - @Bean BootLanguageServerParams serverParams(SimpleLanguageServer server, ValueProviderRegistry valueProviders, JavaProjectsService projectsService) { - return BootLanguageServerParams.createDefault(server, valueProviders, projectsService); + @Bean BootLanguageServerParams serverParams(SimpleLanguageServer server, ValueProviderRegistry valueProviders, JavaProjectsService projectsService, BootJavaConfig config) { + return BootLanguageServerParams.createDefault(server, valueProviders, projectsService, config); } @ConditionalOnMissingClass("org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness") diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerParams.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerParams.java index 851dd14bc..e4fae2088 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerParams.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerParams.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017, 2020 Pivotal, Inc. + * Copyright (c) 2017, 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 @@ -23,7 +23,6 @@ import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFin import org.springframework.ide.vscode.commons.languageserver.java.ProjectObserver; import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; import org.springframework.ide.vscode.commons.util.Assert; -import org.springframework.ide.vscode.commons.util.FileObserver; import org.springframework.ide.vscode.commons.util.text.IDocument; /** @@ -63,10 +62,9 @@ public class BootLanguageServerParams { this.typeUtilProvider = typeUtilProvider; } - public static BootLanguageServerParams createDefault(SimpleLanguageServer server, ValueProviderRegistry valueProviders, JavaProjectsService javaProjectService) { + public static BootLanguageServerParams createDefault(SimpleLanguageServer server, ValueProviderRegistry valueProviders, JavaProjectsService javaProjectService, BootJavaConfig config) { // Initialize project finders, project caches and project observers - FileObserver fileObserver = server.getWorkspaceService().getFileObserver(); - DefaultSpringPropertyIndexProvider indexProvider = new DefaultSpringPropertyIndexProvider(javaProjectService, javaProjectService, fileObserver, valueProviders); + DefaultSpringPropertyIndexProvider indexProvider = new DefaultSpringPropertyIndexProvider(javaProjectService, javaProjectService, server, valueProviders, config); indexProvider.setProgressService(server.getProgressService()); return new BootLanguageServerParams( diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/DefaultSpringPropertyIndexProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/DefaultSpringPropertyIndexProvider.java index 0e2f2defe..6a5852e7d 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/DefaultSpringPropertyIndexProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/DefaultSpringPropertyIndexProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2016, 2017 Pivotal, Inc. + * Copyright (c) 2016, 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 @@ -12,13 +12,15 @@ package org.springframework.ide.vscode.boot.metadata; import java.util.Optional; +import java.util.concurrent.CompletableFuture; import org.eclipse.lsp4j.TextDocumentIdentifier; +import org.springframework.ide.vscode.boot.app.BootJavaConfig; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.ProgressService; import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; import org.springframework.ide.vscode.commons.languageserver.java.ProjectObserver; -import org.springframework.ide.vscode.commons.util.FileObserver; +import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; import org.springframework.ide.vscode.commons.util.text.IDocument; public class DefaultSpringPropertyIndexProvider implements SpringPropertyIndexProvider { @@ -30,14 +32,18 @@ public class DefaultSpringPropertyIndexProvider implements SpringPropertyIndexPr private ProgressService progressService = ProgressService.NO_PROGRESS; - public DefaultSpringPropertyIndexProvider(JavaProjectFinder javaProjectFinder, ProjectObserver projectObserver, FileObserver fileObserver, ValueProviderRegistry valueProviders) { + public DefaultSpringPropertyIndexProvider(JavaProjectFinder javaProjectFinder, ProjectObserver projectObserver, SimpleLanguageServer server, ValueProviderRegistry valueProviders, BootJavaConfig config) { this.javaProjectFinder = javaProjectFinder; - this.indexManager = new SpringPropertiesIndexManager(valueProviders, projectObserver, fileObserver); + this.indexManager = new SpringPropertiesIndexManager(valueProviders, projectObserver, server.getWorkspaceService().getFileObserver()); this.indexManager.addListener(info -> { if (changeHandler != null) { changeHandler.run(); } }); + server.onCommand("sts/common-properties/reload", params -> CompletableFuture.completedFuture(indexManager.reloadCommonProperties())); + if (config != null) { + config.addListener(v -> indexManager.setCommonPropertiesFile(config.getCommonPropertiesFile())); + } } @Override diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/PropertiesLoader.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/PropertiesLoader.java index deb366a64..f41f2666d 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/PropertiesLoader.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/PropertiesLoader.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2016, 2018 Pivotal, Inc. + * Copyright (c) 2016, 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 @@ -25,7 +25,6 @@ import org.springframework.ide.vscode.boot.configurationmetadata.ConfigurationMe import org.springframework.ide.vscode.boot.configurationmetadata.ConfigurationMetadataRepositoryJsonBuilder; import org.springframework.ide.vscode.commons.java.IClasspath; import org.springframework.ide.vscode.commons.java.IClasspathUtil; -import org.springframework.ide.vscode.commons.util.Log; public class PropertiesLoader { @@ -70,6 +69,11 @@ public class PropertiesLoader { ConfigurationMetadataRepository repository = builder.build(); return repository; } + + public ConfigurationMetadataRepository loadJson(Path path) { + loadFromJsonFile(path); + return builder.build(); + } private void loadFromOutputFolder(Path outputFolderPath) { if (outputFolderPath != null && Files.exists(outputFolderPath)) { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/SpringPropertiesIndexManager.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/SpringPropertiesIndexManager.java index edf132d8c..f12381b95 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/SpringPropertiesIndexManager.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/SpringPropertiesIndexManager.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2014, 2022 Pivotal, Inc. + * Copyright (c) 2014, 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 @@ -10,10 +10,13 @@ *******************************************************************************/ package org.springframework.ide.vscode.boot.metadata; +import java.nio.file.Path; import java.util.concurrent.ExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.ide.vscode.boot.configurationmetadata.ConfigurationMetadataRepository; +import org.springframework.ide.vscode.boot.metadata.SpringPropertyIndex.Builder; import org.springframework.ide.vscode.boot.metadata.util.Listener; import org.springframework.ide.vscode.boot.metadata.util.ListenerManager; import org.springframework.ide.vscode.commons.java.IJavaProject; @@ -21,6 +24,9 @@ import org.springframework.ide.vscode.commons.languageserver.ProgressService; import org.springframework.ide.vscode.commons.languageserver.java.ProjectObserver; import org.springframework.ide.vscode.commons.util.FileObserver; +import com.google.common.base.Objects; +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.common.collect.ImmutableList; @@ -40,6 +46,9 @@ public class SpringPropertiesIndexManager extends ListenerManager indexes; private final ValueProviderRegistry valueProviders; private static int progressIdCt = 0; + + private Path commonPropertiesFile; + private Supplier commonPropertiesMetadata; public SpringPropertiesIndexManager(ValueProviderRegistry valueProviders, ProjectObserver projectObserver, FileObserver fileObserver) { this.valueProviders = valueProviders; @@ -72,7 +81,11 @@ public class SpringPropertiesIndexManager extends ListenerManager new PropertiesLoader().loadJson(commonPropertiesFile)); + clear(); + } + } + + public synchronized boolean reloadCommonProperties() { + if (commonPropertiesFile != null) { + commonPropertiesMetadata = Suppliers.memoize(() -> new PropertiesLoader().loadJson(commonPropertiesFile)); + clear(); + return true; + } + return false; + } + } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/SpringPropertyIndex.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/SpringPropertyIndex.java index 1ae08f90e..b7558f27b 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/SpringPropertyIndex.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/metadata/SpringPropertyIndex.java @@ -10,8 +10,10 @@ *******************************************************************************/ package org.springframework.ide.vscode.boot.metadata; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.springframework.ide.vscode.boot.configurationmetadata.ConfigurationMetadataGroup; @@ -27,7 +29,7 @@ import com.google.common.collect.ImmutableSet; public class SpringPropertyIndex { - public static final SpringPropertyIndex EMPTY_INDEX = new SpringPropertyIndex(null, null); + public static final SpringPropertyIndex EMPTY_INDEX = new SpringPropertyIndex(null); private final ValueProviderRegistry valueProviders; @@ -40,30 +42,31 @@ public class SpringPropertyIndex { } }; - public SpringPropertyIndex(ValueProviderRegistry valueProviders, IClasspath projectPath) { + private SpringPropertyIndex(ValueProviderRegistry valueProviders) { this.valueProviders = valueProviders; - if (projectPath!=null) { -// try { - PropertiesLoader loader = new PropertiesLoader(); - ConfigurationMetadataRepository metadata = loader.load(projectPath); - //^^^ Should be done in bg? It seems fast enough for now. + } + + private void loadFromClasspath(IClasspath projectPath) { + PropertiesLoader loader = new PropertiesLoader(); + addMetadata(loader.load(projectPath)); + //^^^ Should be done in bg? It seems fast enough for now. + } + + private void addMetadata(ConfigurationMetadataRepository metadata) { + Collection allEntries = metadata.getAllProperties().values(); + for (ConfigurationMetadataProperty item : allEntries) { + properties.add(new PropertyInfo(valueProviders, item)); + } - Collection allEntries = metadata.getAllProperties().values(); - for (ConfigurationMetadataProperty item : allEntries) { - properties.add(new PropertyInfo(valueProviders, item)); + for (ConfigurationMetadataGroup group : metadata.getAllGroups().values()) { + for (ConfigurationMetadataSource source : group.getSources().values()) { + ImmutableSet.Builder sources = ImmutableSet.builder(); + for (ConfigurationMetadataProperty prop : source.getProperties().values()) { + PropertyInfo info = properties.get(prop.getId()); + sources.add(info.addSource(source)); } - - for (ConfigurationMetadataGroup group : metadata.getAllGroups().values()) { - for (ConfigurationMetadataSource source : group.getSources().values()) { - ImmutableSet.Builder sources = ImmutableSet.builder(); - for (ConfigurationMetadataProperty prop : source.getProperties().values()) { - PropertyInfo info = properties.get(prop.getId()); - sources.add(info.addSource(source)); - } - groups.put(group.getId(), sources.build()); - } - } - + groups.put(group.getId(), sources.build()); + } } } @@ -144,5 +147,40 @@ public class SpringPropertyIndex { public Collection getGroupSources(String prefix) { return groups.get(prefix); } + + public static final Builder builder(ValueProviderRegistry valueProviders) { + return new Builder(valueProviders); + } + public static class Builder { + + private final ValueProviderRegistry valueProviders; + private IClasspath projectClasspath; + private List metadataList; + + private Builder(ValueProviderRegistry valueProviders) { + this.valueProviders = valueProviders; + this.metadataList = new ArrayList<>(); + } + + public Builder withClasspath(IClasspath projectClasspath) { + this.projectClasspath = projectClasspath; + return this; + } + + public Builder withMetadata(ConfigurationMetadataRepository metadata) { + metadataList.add(metadata); + return this; + } + + public SpringPropertyIndex build() { + SpringPropertyIndex index = new SpringPropertyIndex(valueProviders); + for (ConfigurationMetadataRepository m : metadataList) { + index.addMetadata(m); + } + index.loadFromClasspath(projectClasspath); + return index; + } + + } } diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/editor/harness/PropertyIndexHarness.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/editor/harness/PropertyIndexHarness.java index 68f9ad9ee..1721d8823 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/editor/harness/PropertyIndexHarness.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/editor/harness/PropertyIndexHarness.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017, 2019 Pivotal, Inc. + * Copyright (c) 2017, 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 @@ -48,7 +48,7 @@ public class PropertyIndexHarness { synchronized (PropertyIndexHarness.this) { if (index==null) { IClasspath classpath = testProject == null ? null : testProject.getClasspath(); - index = new SpringPropertyIndex(valueProviders, classpath); + index = SpringPropertyIndex.builder(valueProviders).withClasspath(classpath).build(); for (ConfigurationMetadataProperty propertyInfo : datas.values()) { index.add(propertyInfo); } diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/project/harness/BootLanguageServerHarness.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/project/harness/BootLanguageServerHarness.java index b13a723c3..dccaf4c31 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/project/harness/BootLanguageServerHarness.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/project/harness/BootLanguageServerHarness.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017, 2020 Pivotal, Inc. + * Copyright (c) 2017, 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 @@ -176,7 +176,7 @@ public class BootLanguageServerHarness extends LanguageServerHarness { CompositeProjectOvserver projectObserver = new CompositeProjectOvserver(Arrays.asList(mavenProjectCache, gradleProjectCache)); - DefaultSpringPropertyIndexProvider indexProvider = new DefaultSpringPropertyIndexProvider(javaProjectFinder, projectObserver, null, valueProviders); + DefaultSpringPropertyIndexProvider indexProvider = new DefaultSpringPropertyIndexProvider(javaProjectFinder, projectObserver, server, valueProviders, null); indexProvider.setProgressService(server.getProgressService()); return new BootLanguageServerParams( diff --git a/vscode-extensions/vscode-spring-boot/package.json b/vscode-extensions/vscode-spring-boot/package.json index 17e13d103..38abb0b3c 100644 --- a/vscode-extensions/vscode-spring-boot/package.json +++ b/vscode-extensions/vscode-spring-boot/package.json @@ -121,6 +121,11 @@ "command": "vscode-spring-boot.rewrite.reload", "title": "Reload OpenRewrite Recipes, Code Actions, Problem and Quick Fix Descriptors", "category": "Spring Boot" + }, + { + "command": "sts/common-properties/reload", + "title": "Reload Shared Properties Metadata", + "category": "Spring Boot" } ], "configuration": [ @@ -174,6 +179,13 @@ "default": true, "description": "Enable/Disable Spring running Boot application Code Lenses" }, + "boot-java.common.properties-metadata": { + "type": [ + "string", + "null" + ], + "description": "The path to a shared properties metadata JSON file." + }, "boot-java.change-detection.on": { "type": "boolean", "default": false,