Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import org.eclipse.lsp4j.services.LanguageServer;
import org.eclipse.ui.PlatformUI;
import org.osgi.framework.Bundle;
import org.springframework.ide.eclipse.editor.support.preferences.ProblemSeverityPreferityPageFromMetadata;
import org.springframework.tooling.boot.ls.prefs.CategoryProblemsSeverityPrefsPage;
import org.springframework.tooling.boot.ls.prefs.FileListEditor;
import org.springframework.tooling.boot.ls.prefs.ProblemCategoryData;
Expand Down Expand Up @@ -328,6 +329,15 @@ private void putValidationCategoryToggles(Map<String, Object> settings) {
try {
IEclipsePreferences prefs = BootLanguageServerPlugin.getPreferences();
for (ProblemCategoryData category : CategoryProblemsSeverityPrefsPage.ALL_PROBLEM_CATEGORIES) {
if (category.getParameters() != null) {
for (ProblemSeverityPreferityPageFromMetadata.ProblemParameterData param : category.getParameters()) {
String prefKey = "problem-parameters." + category.getId() + "." + param.getKey();
String val = prefs.get(prefKey, null);
if (val != null) {
dotPut(settings, "spring-boot.ls." + prefKey, val);
}
}
}
if (category.getToggle() != null) {
CategoryToggleData toggle = category.getToggle();
String val = prefs.get(toggle.getPreferenceKey(), null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,12 @@

import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.ComboFieldEditor;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.preference.PreferenceManager;
import org.eclipse.jface.preference.PreferenceNode;
import org.eclipse.jface.preference.StringFieldEditor;
import org.eclipse.ui.PlatformUI;
import org.springframework.ide.eclipse.editor.support.preferences.ProblemSeverityPreferencesUtil;
import org.springframework.ide.eclipse.editor.support.preferences.ProblemSeverityPreferityPageFromMetadata;
Expand Down Expand Up @@ -57,6 +60,12 @@ protected void initializeDefaults() {
defaults.put(PREF_KEY_PREFIX + category.getToggle().getPreferenceKey(), category.getToggle().getDefaultValue());

}
if (category.getParameters() != null) {
IEclipsePreferences defaults = DefaultScope.INSTANCE.getNode(getPluginId());
for (ProblemParameterData param : category.getParameters()) {
defaults.put(getProblemParametersPreferencePrefix() + param.getKey(), param.getDefaultValue());
}
}
super.initializeDefaults();
}

Expand All @@ -72,6 +81,18 @@ protected void createFieldEditors() {
);
addField(field);
}
if (category.getParameters() != null) {
for (ProblemParameterData param : category.getParameters()) {
String prefKey = getProblemParametersPreferencePrefix() + param.getKey();
if ("boolean".equals(param.getType())) {
addField(new BooleanFieldEditor(prefKey, param.getLabel(), getFieldEditorParent()));
} else if ("integer".equals(param.getType())) {
addField(new IntegerFieldEditor(prefKey, param.getLabel(), getFieldEditorParent()));
} else {
addField(new StringFieldEditor(prefKey, param.getLabel(), getFieldEditorParent()));
}
}
}
super.createFieldEditors();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2022 VMware, Inc.
* Copyright (c) 2022, 2026 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
Expand All @@ -10,6 +10,7 @@
*******************************************************************************/
package org.springframework.tooling.boot.ls.prefs;

import org.springframework.ide.eclipse.editor.support.preferences.ProblemSeverityPreferityPageFromMetadata.ProblemParameterData;
import org.springframework.ide.eclipse.editor.support.preferences.ProblemSeverityPreferityPageFromMetadata.ProblemTypeData;

public class ProblemCategoryData {
Expand All @@ -19,6 +20,7 @@ public class ProblemCategoryData {
private CategoryToggleData toggle;
private int order;
private ProblemTypeData[] problemTypes;
private ProblemParameterData[] parameters;

ProblemCategoryData() {}

Expand All @@ -42,6 +44,10 @@ public String getId() {
return id;
}

public ProblemParameterData[] getParameters() {
return parameters;
}

public ProblemTypeData[] getProblemTypes() {
return problemTypes;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2022 VMware, Inc.
* Copyright (c) 2022, 2026 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
Expand Down Expand Up @@ -28,13 +28,21 @@ public final class ProblemCategory {
final private List<ProblemType> problemTypes = new ArrayList<>();;

final private Toggle toggle;
private List<ProblemTypeParameter> parameters;

final public int order;

public ProblemCategory(String id, String label, Toggle toggle) {
this(id, label, toggle, null);
}

public ProblemCategory(String id, String label, Toggle toggle, List<ProblemTypeParameter> parameters) {
this.id = id;
this.label = label;
this.toggle = toggle;
if (parameters != null) {
this.parameters = new ArrayList<>(parameters);
}
this.order = counter.getAndIncrement();
}

Expand All @@ -50,6 +58,10 @@ public List<ProblemType> getProblemTypes() {
return problemTypes;
}

public List<ProblemTypeParameter> getParameters() {
return parameters;
}

public Toggle getToggle() {
return toggle;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,6 @@ public interface ProblemType {
* {@code spring-boot.ls.problem-parameters.&lt;category&gt;.&lt;code&gt;.&lt;key&gt;} in LSP settings.
*/
default List<ProblemTypeParameter> getParameters() {
return ProblemTypeParameter.none();
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@
*******************************************************************************/
package org.springframework.ide.vscode.commons.languageserver.reconcile;

import java.util.List;

/**
* Optional configuration for a {@link ProblemType}, surfaced in client settings and
* {@code problem-types.json} metadata.
Expand Down Expand Up @@ -58,7 +56,4 @@ public String getDefaultValue() {
return defaultValue;
}

public static List<ProblemTypeParameter> none() {
return List.of();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,11 @@ public boolean isSpelExpressionValidationEnabled() {
return isProblemCategoryEnabled(categorySwitch);
}

public boolean isUseProjectBuildFileForVersionValidation() {
Boolean enabled = settings.getBoolean("spring-boot", "ls", "problem-parameters", "version-validation", "use-project-build-file");
return enabled == null || enabled.booleanValue();
}

public boolean isBootVersionValidationEnabled() {
Toggle categorySwitch = SpringProblemCategories.VERSION_VALIDATION.getToggle();
return isProblemCategoryEnabled(categorySwitch);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ public void afterPropertiesSet() throws Exception {
new BootJavaLanguageServerComponents(appContext),
new SpringXMLLanguageServerComponents(server, springIndexer, params, config, appContext.getBean(SpelReconciler.class)),
new SpringFactoriesLanguageServerComponents(projectFinder, springIndexer, config),
new PomLanguageServerComponents(server, projectFinder, params.projectObserver, appContext.getBean(SpringProjectsProvider.class), appContext.getBean(MavenMetadataProvider.class)),
new PomLanguageServerComponents(server, projectFinder, params.projectObserver, appContext.getBean(SpringProjectsProvider.class), appContext.getBean(MavenMetadataProvider.class), appContext.getBean(BootJavaConfig.class)),
new JpaQueryPropertiesLanguageServerComponents(server.getTextDocumentService(), projectFinder, appContext.getBean(JpqlSemanticTokens.class),
appContext.getBean(HqlSemanticTokens.class), appContext.getBean(JpqlSupportState.class), (Reconciler) appContext.getBean("hqlReconciler"), (Reconciler) appContext.getBean("jpqlReconciler"))
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ public class BootVersionValidationConfig {
return new MavenMetadataProvider(server.getWorkspaceService().getFileObserver(), server.getProgressService());
}

@Bean UpdateBootVersion updateBootVersion(SimpleLanguageServer server, Optional<SpringBootUpgrade> bootUpgradeOpt, SpringProjectsProvider projectsProvider, MavenMetadataProvider mavenMetadataProvider) {
return new UpdateBootVersion(server.getDiagnosticSeverityProvider(), bootUpgradeOpt, projectsProvider, mavenMetadataProvider);
@Bean UpdateBootVersion updateBootVersion(SimpleLanguageServer server, Optional<SpringBootUpgrade> bootUpgradeOpt, SpringProjectsProvider projectsProvider, MavenMetadataProvider mavenMetadataProvider, BootJavaConfig bootJavaConfig) {
return new UpdateBootVersion(server.getDiagnosticSeverityProvider(), bootUpgradeOpt, projectsProvider, mavenMetadataProvider, bootJavaConfig);
}

@Bean SpringIoProjectsProvider springProjectsProvider(SimpleLanguageServer server, BootJavaConfig config, RestTemplateFactory restTemplateFactory) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,11 @@ public int getIntParameter(ProblemType problem, String paramKey) {
if (v != null) {
return v;
}
for (ProblemTypeParameter p : problem.getParameters()) {
if (paramKey.equals(p.getKey()) && p.getType() == ValueType.INTEGER) {
return Integer.parseInt(p.getDefaultValue());
if (problem.getParameters() != null) {
for (ProblemTypeParameter p : problem.getParameters()) {
if (paramKey.equals(p.getKey()) && p.getType() == ValueType.INTEGER) {
return Integer.parseInt(p.getDefaultValue());
}
}
}
throw new IllegalStateException("No integer parameter '" + paramKey + "' for " + problem.getCode());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@

import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemCategory;
import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemCategory.Toggle;
import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemTypeParameter;
import java.util.List;

import static org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemCategory.Toggle.Option.*;

Expand All @@ -39,7 +41,8 @@ public class SpringProblemCategories {
new Toggle("Enablement", EnumSet.of(OFF, ON), ON, "boot-java.validation.spel.on"));

public static final ProblemCategory VERSION_VALIDATION = new ProblemCategory("version-validation", "Versions and Support Ranges",
new Toggle("Enablement", EnumSet.of(OFF, ON), ON, "boot-java.validation.java.version-validation"));
new Toggle("Enablement", EnumSet.of(OFF, ON), ON, "boot-java.validation.java.version-validation"),
List.of(new ProblemTypeParameter("use-project-build-file", "Use project build file for version validation", "Use project build file for version validation", ProblemTypeParameter.ValueType.BOOLEAN, "true")));

public static final ProblemCategory DATA_QUERY = new ProblemCategory("data-query", "Data Queries",
new Toggle("Enablement", EnumSet.of(OFF, ON), ON, "boot-java.validation.data-query"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public enum SpringAiProblemType implements ProblemType {
SPRING_AI_TOOL_MISSING_DESCRIPTION(WARNING,
"Spring AI tool/prompt/resource is missing a description. Descriptions are critical for the LLM to correctly select and invoke the tool.",
"Missing @Tool description",
ProblemTypeParameter.none()),
null),

SPRING_AI_TOOL_DESCRIPTION_TOO_SHORT(WARNING,
"Spring AI tool/prompt/resource description is too short. A meaningful description helps the LLM decide when and how to invoke the tool.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import org.eclipse.lsp4j.jsonrpc.CancelChecker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ide.vscode.boot.app.BootJavaConfig;
import org.springframework.ide.vscode.boot.java.rewrite.SpringBootUpgrade;
import org.springframework.ide.vscode.boot.validation.generations.GenerationsValidator;
import org.springframework.ide.vscode.boot.validation.generations.MavenMetadata;
Expand All @@ -49,6 +50,7 @@
import org.springframework.ide.vscode.commons.languageserver.java.ProjectObserver;
import org.springframework.ide.vscode.commons.languageserver.util.InlayHintHandler;
import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer;
import org.springframework.ide.vscode.commons.protocol.java.ProjectBuild;
import org.springframework.ide.vscode.commons.util.BadLocationException;
import org.springframework.ide.vscode.commons.util.Optionals;
import org.springframework.ide.vscode.commons.util.text.TextDocument;
Expand All @@ -62,11 +64,13 @@ public class PomInlayHintHandler implements InlayHintHandler {
final private JavaProjectFinder projectFinder;
final private SpringProjectsProvider generationsProvider;
final private MavenMetadataProvider mavenMetadataProvider;
final private BootJavaConfig bootJavaConfig;

public PomInlayHintHandler(SimpleLanguageServer server, JavaProjectFinder projectFinder, ProjectObserver projectObserver, SpringProjectsProvider generationsProvider, MavenMetadataProvider mavenMetadataProvider) {
public PomInlayHintHandler(SimpleLanguageServer server, JavaProjectFinder projectFinder, ProjectObserver projectObserver, SpringProjectsProvider generationsProvider, MavenMetadataProvider mavenMetadataProvider, BootJavaConfig bootJavaConfig) {
this.projectFinder = projectFinder;
this.generationsProvider = generationsProvider;
this.mavenMetadataProvider = mavenMetadataProvider;
this.bootJavaConfig = bootJavaConfig;

projectObserver.addListener(new ProjectObserver.Listener() {

Expand Down Expand Up @@ -131,7 +135,7 @@ public List<InlayHint> handle(TextDocument doc, Range range, CancelChecker cance

try {
SortedVersions versions = null;
if (org.springframework.ide.vscode.commons.protocol.java.ProjectBuild.MAVEN_PROJECT_TYPE.equals(jp.getProjectBuild().getType())) {
if (bootJavaConfig.isUseProjectBuildFileForVersionValidation() && ProjectBuild.MAVEN_PROJECT_TYPE.equals(jp.getProjectBuild().getType())) {
try {
MavenMetadata metadata = mavenMetadataProvider.getMetadata(jp, "org.springframework.boot", "spring-boot");
if (metadata != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
import java.util.Optional;
import java.util.Set;

import org.springframework.ide.vscode.boot.app.BootJavaConfig;
import org.springframework.ide.vscode.boot.validation.generations.MavenMetadataProvider;
import org.springframework.ide.vscode.boot.validation.generations.SpringProjectsProvider;
import org.springframework.ide.vscode.commons.languageserver.composable.LanguageServerComponents;
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
Expand All @@ -25,8 +27,8 @@ public class PomLanguageServerComponents implements LanguageServerComponents{

private PomInlayHintHandler inlayHintHandler;

public PomLanguageServerComponents(SimpleLanguageServer server, JavaProjectFinder projectFinder, ProjectObserver projectObserver, SpringProjectsProvider generationsProvider, org.springframework.ide.vscode.boot.validation.generations.MavenMetadataProvider mavenMetadataProvider) {
this.inlayHintHandler = new PomInlayHintHandler(server, projectFinder, projectObserver, generationsProvider, mavenMetadataProvider);
public PomLanguageServerComponents(SimpleLanguageServer server, JavaProjectFinder projectFinder, ProjectObserver projectObserver, SpringProjectsProvider generationsProvider, MavenMetadataProvider mavenMetadataProvider, BootJavaConfig bootJavaConfig) {
this.inlayHintHandler = new PomInlayHintHandler(server, projectFinder, projectObserver, generationsProvider, mavenMetadataProvider, bootJavaConfig);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2023, 2025 VMware, Inc.
* Copyright (c) 2023, 2026 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
Expand All @@ -21,6 +21,7 @@
import org.eclipse.lsp4j.Diagnostic;
import org.eclipse.lsp4j.Range;
import org.eclipse.lsp4j.ShowDocumentParams;
import org.springframework.ide.vscode.boot.app.BootJavaConfig;
import org.springframework.ide.vscode.boot.app.BootLanguageServerInitializer;
import org.springframework.ide.vscode.boot.java.rewrite.SpringBootUpgrade;
import org.springframework.ide.vscode.boot.validation.generations.preferences.VersionValidationProblemType;
Expand All @@ -40,19 +41,21 @@ public class UpdateBootVersion extends AbstractDiagnosticValidator {

private SpringProjectsProvider springProjectsProvider;
private MavenMetadataProvider mavenMetadataProvider;
private BootJavaConfig bootJavaConfig;

public UpdateBootVersion(DiagnosticSeverityProvider diagnosticSeverityProvider, Optional<SpringBootUpgrade> bootUpgradeOpt, SpringProjectsProvider springProjectsProvider, MavenMetadataProvider mavenMetadataProvider) {
public UpdateBootVersion(DiagnosticSeverityProvider diagnosticSeverityProvider, Optional<SpringBootUpgrade> bootUpgradeOpt, SpringProjectsProvider springProjectsProvider, MavenMetadataProvider mavenMetadataProvider, BootJavaConfig bootJavaConfig) {
super(diagnosticSeverityProvider);
this.bootUpgradeOpt = bootUpgradeOpt;
this.springProjectsProvider = springProjectsProvider;
this.mavenMetadataProvider = mavenMetadataProvider;
this.bootJavaConfig = bootJavaConfig;
}

@Override
public Collection<Diagnostic> validate(IJavaProject javaProject, Version javaProjectVersion) throws Exception {
SortedVersions versions = null;

if (ProjectBuild.MAVEN_PROJECT_TYPE.equals(javaProject.getProjectBuild().getType())) {
if (bootJavaConfig.isUseProjectBuildFileForVersionValidation() && ProjectBuild.MAVEN_PROJECT_TYPE.equals(javaProject.getProjectBuild().getType())) {
try {
MavenMetadata metadata = mavenMetadataProvider.getMetadata(javaProject, "org.springframework.boot", "spring-boot");
if (metadata != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -444,6 +444,15 @@
"preferenceKey": "boot-java.validation.java.version-validation",
"defaultValue": "ON"
},
"parameters": [
{
"key": "use-project-build-file",
"label": "Use project build file for version validation",
"description": "Use project build file for version validation",
"type": "boolean",
"defaultValue": "true"
}
],
"order": 8,
"problemTypes": [
{
Expand Down
Loading
Loading