From 73b6c6b5b05979c64295d097cdb7d3c0d44819fa Mon Sep 17 00:00:00 2001 From: aboyko Date: Thu, 18 May 2023 11:47:11 -0400 Subject: [PATCH] Integrate validation for data repo domain id type --- .../.project | 17 ++++ .../commons/java/SpringProjectUtil.java | 4 +- .../HelloMethodRenameProblemDescriptor.java | 4 +- .../config/DefaultMarkerVisitorContext.java | 18 ++++ .../rewrite/config/MarkerVisitorContext.java | 22 +++++ .../config/RecipeCodeActionDescriptor.java | 5 +- .../boot/java/Boot2JavaProblemType.java | 9 +- .../rewrite/BootCodeActionRepository.java | 4 +- .../rewrite/RewriteCodeActionHandler.java | 4 +- .../java/rewrite/RewriteRecipeRepository.java | 5 +- .../boot/java/rewrite/RewriteReconciler.java | 8 +- ...ConfigurationIfBeansPresentCodeAction.java | 4 +- .../AuthorizeHttpRequestsCodeAction.java | 4 +- ...eldIntoConstructorParameterCodeAction.java | 4 +- .../reconcile/BeanMethodNotPublicProblem.java | 4 +- .../BeanPostProcessingIgnoreInAotProblem.java | 4 +- .../Boot3NotSupportedTypeProblem.java | 4 +- .../reconcile/EntityIdForRepoProblem.java | 59 +++++++++++++ .../HttpSecurityLamdaDslCodeAction.java | 4 +- .../NoAutowiredOnConstructorProblem.java | 4 +- .../reconcile/NoRepoAnnotationProblem.java | 4 +- .../NoRequestMappingAnnotationCodeAction.java | 4 +- .../reconcile/NotRegisteredBeansProblem.java | 88 +++++++++---------- .../reconcile/PreciseBeanTypeProblem.java | 4 +- ...ServerHttpSecurityLambdaDslCodeAction.java | 4 +- .../UnnecessarySpringExtensionProblem.java | 4 +- ...ebSecurityConfigurerAdapterCodeAction.java | 4 +- .../src/main/resources/problem-types.json | 6 ++ .../vscode-spring-boot/package.json | 14 ++- 29 files changed, 226 insertions(+), 97 deletions(-) create mode 100644 eclipse-distribution/org.springframework.boot.ide.product.e419/.project create mode 100644 headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/DefaultMarkerVisitorContext.java create mode 100644 headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/MarkerVisitorContext.java create mode 100644 headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/EntityIdForRepoProblem.java diff --git a/eclipse-distribution/org.springframework.boot.ide.product.e419/.project b/eclipse-distribution/org.springframework.boot.ide.product.e419/.project new file mode 100644 index 000000000..8bbadaf74 --- /dev/null +++ b/eclipse-distribution/org.springframework.boot.ide.product.e419/.project @@ -0,0 +1,17 @@ + + + org.springframework.boot.ide.product.e419 + + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + + diff --git a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/SpringProjectUtil.java b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/SpringProjectUtil.java index ce9645440..399c56aa2 100644 --- a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/SpringProjectUtil.java +++ b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/SpringProjectUtil.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017, 2022 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 @@ -93,7 +93,7 @@ public class SpringProjectUtil { return null; } - private static boolean hasSpecificLibraryOnClasspath(IJavaProject jp, String libraryNamePrefix, boolean onlyLibs) { + public static boolean hasSpecificLibraryOnClasspath(IJavaProject jp, String libraryNamePrefix, boolean onlyLibs) { try { IClasspath cp = jp.getClasspath(); if (cp!=null) { diff --git a/headless-services/commons/commons-rewrite-test/src/main/java/org/springframework/rewrite/test/HelloMethodRenameProblemDescriptor.java b/headless-services/commons/commons-rewrite-test/src/main/java/org/springframework/rewrite/test/HelloMethodRenameProblemDescriptor.java index 1e9e3cec9..e4ec96da6 100644 --- a/headless-services/commons/commons-rewrite-test/src/main/java/org/springframework/rewrite/test/HelloMethodRenameProblemDescriptor.java +++ b/headless-services/commons/commons-rewrite-test/src/main/java/org/springframework/rewrite/test/HelloMethodRenameProblemDescriptor.java @@ -19,12 +19,12 @@ import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaVisitor; import org.openrewrite.java.tree.J.MethodDeclaration; import org.openrewrite.marker.Range; -import org.springframework.context.ApplicationContext; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemCategory; import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemSeverity; import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemTypes; +import org.springframework.ide.vscode.commons.rewrite.config.MarkerVisitorContext; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; @@ -36,7 +36,7 @@ public class HelloMethodRenameProblemDescriptor implements RecipeCodeActionDescr private static final String RECIPE_ID = "org.springframework.rewrite.test.HelloMethodRenameRecipe"; @Override - public JavaVisitor getMarkerVisitor(ApplicationContext applicationContext) { + public JavaVisitor getMarkerVisitor(MarkerVisitorContext context) { return new JavaIsoVisitor<>() { @Override diff --git a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/DefaultMarkerVisitorContext.java b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/DefaultMarkerVisitorContext.java new file mode 100644 index 000000000..cb9482a43 --- /dev/null +++ b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/DefaultMarkerVisitorContext.java @@ -0,0 +1,18 @@ +/******************************************************************************* + * 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.ide.vscode.commons.rewrite.config; + +import org.springframework.context.ApplicationContext; +import org.springframework.ide.vscode.commons.java.IJavaProject; + +public record DefaultMarkerVisitorContext(ApplicationContext appContext, IJavaProject project) implements MarkerVisitorContext { + +} diff --git a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/MarkerVisitorContext.java b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/MarkerVisitorContext.java new file mode 100644 index 000000000..d11fddb60 --- /dev/null +++ b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/MarkerVisitorContext.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * 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.ide.vscode.commons.rewrite.config; + +import org.springframework.context.ApplicationContext; +import org.springframework.ide.vscode.commons.java.IJavaProject; + +public interface MarkerVisitorContext { + + IJavaProject project(); + + ApplicationContext appContext(); + +} diff --git a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/RecipeCodeActionDescriptor.java b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/RecipeCodeActionDescriptor.java index 5bce924e2..59208e6f6 100644 --- a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/RecipeCodeActionDescriptor.java +++ b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/RecipeCodeActionDescriptor.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2022 VMware, Inc. + * Copyright (c) 2022, 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 @@ -12,7 +12,6 @@ package org.springframework.ide.vscode.commons.rewrite.config; import org.openrewrite.ExecutionContext; import org.openrewrite.java.JavaVisitor; -import org.springframework.context.ApplicationContext; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; @@ -22,7 +21,7 @@ public interface RecipeCodeActionDescriptor { return getClass().getName(); } - JavaVisitor getMarkerVisitor(ApplicationContext applicationContext); + JavaVisitor getMarkerVisitor(MarkerVisitorContext context); boolean isApplicable(IJavaProject project); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/Boot2JavaProblemType.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/Boot2JavaProblemType.java index bf0edf008..75529134f 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/Boot2JavaProblemType.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/Boot2JavaProblemType.java @@ -10,10 +10,7 @@ *******************************************************************************/ package org.springframework.ide.vscode.boot.java; -import static org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemSeverity.IGNORE; -import static org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemSeverity.INFO; -import static org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemSeverity.HINT; -import static org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemSeverity.WARNING; +import static org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemSeverity.*; import org.springframework.ide.vscode.boot.common.SpringProblemCategories; import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemCategory; @@ -40,7 +37,9 @@ public enum Boot2JavaProblemType implements ProblemType { HTTP_SECIRITY_AUTHORIZE_HTTP_REQUESTS(WARNING, "'HttpSecurity.authroizeRequests(...)' API and related classes are to be deprecated use new `authorizeHttpRequests(...) and related classes", "Usage of old 'HttpSecurity.authroizeRequests(...)' API"), - WEB_SECURITY_CONFIGURER_ADAPTER(WARNING, "'WebSecurityConfigurerAdapter' is removed in Spring-Security 6.x. Refactor classes extending the 'WebSecurityConfigurerAdapter' into 'Configuration' beans and methods into 'Bean' definitions ", "Replace usage of 'WebSecurityConfigurerAdapter' as this class to be removed in Security 6.x"); + WEB_SECURITY_CONFIGURER_ADAPTER(WARNING, "'WebSecurityConfigurerAdapter' is removed in Spring-Security 6.x. Refactor classes extending the 'WebSecurityConfigurerAdapter' into 'Configuration' beans and methods into 'Bean' definitions ", "Replace usage of 'WebSecurityConfigurerAdapter' as this class to be removed in Security 6.x"), + + DOMAIN_ID_FOR_REPOSITORY(ERROR, "Invalid Domain ID type for Spring Data Repository", "Invalid Domain ID Type for Spring Data Repository"); private final ProblemSeverity defaultSeverity; private String description; diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/BootCodeActionRepository.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/BootCodeActionRepository.java index 3a64f61e4..0910fff51 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/BootCodeActionRepository.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/BootCodeActionRepository.java @@ -18,6 +18,7 @@ import org.springframework.ide.vscode.boot.java.rewrite.reconcile.AutowiredField import org.springframework.ide.vscode.boot.java.rewrite.reconcile.BeanMethodNotPublicProblem; import org.springframework.ide.vscode.boot.java.rewrite.reconcile.BeanPostProcessingIgnoreInAotProblem; import org.springframework.ide.vscode.boot.java.rewrite.reconcile.Boot3NotSupportedTypeProblem; +import org.springframework.ide.vscode.boot.java.rewrite.reconcile.EntityIdForRepoProblem; import org.springframework.ide.vscode.boot.java.rewrite.reconcile.HttpSecurityLamdaDslCodeAction; import org.springframework.ide.vscode.boot.java.rewrite.reconcile.NoAutowiredOnConstructorProblem; import org.springframework.ide.vscode.boot.java.rewrite.reconcile.NoRepoAnnotationProblem; @@ -49,7 +50,8 @@ public class BootCodeActionRepository extends CodeActionRepository { new ServerHttpSecurityLambdaDslCodeAction(), new AddConfigurationIfBeansPresentCodeAction(), new AuthorizeHttpRequestsCodeAction(), - new WebSecurityConfigurerAdapterCodeAction() + new WebSecurityConfigurerAdapterCodeAction(), + new EntityIdForRepoProblem() ); } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteCodeActionHandler.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteCodeActionHandler.java index 016c4009c..5f3d3ce9c 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteCodeActionHandler.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteCodeActionHandler.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2022 VMware, Inc. + * Copyright (c) 2022, 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 @@ -108,7 +108,7 @@ public class RewriteCodeActionHandler implements JavaCodeActionHandler { CompilationUnit cu = cuCache.getCU(project, URI.create(doc.getUri())); if (cu != null) { - cu = recipeRepo.mark(descriptors, cu); + cu = recipeRepo.mark(project, descriptors, cu); List codeActions = new ArrayList<>(); new JavaIsoVisitor() { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteRecipeRepository.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteRecipeRepository.java index 1f4b7cf07..7c7382ea8 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteRecipeRepository.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteRecipeRepository.java @@ -66,6 +66,7 @@ import org.springframework.ide.vscode.commons.protocol.java.ProjectBuild; import org.springframework.ide.vscode.commons.rewrite.LoadUtils; import org.springframework.ide.vscode.commons.rewrite.LoadUtils.DurationTypeConverter; import org.springframework.ide.vscode.commons.rewrite.ORDocUtils; +import org.springframework.ide.vscode.commons.rewrite.config.DefaultMarkerVisitorContext; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.StsEnvironment; import org.springframework.ide.vscode.commons.rewrite.gradle.GradleIJavaProjectParser; @@ -302,10 +303,10 @@ public class RewriteRecipeRepository implements ApplicationContextAware { return l; } - public CompilationUnit mark(List descriptors, CompilationUnit compilationUnit) { + public CompilationUnit mark(IJavaProject project, List descriptors, CompilationUnit compilationUnit) { CompilationUnit cu = compilationUnit; for (RecipeCodeActionDescriptor d : descriptors) { - TreeVisitor markVisitor = d.getMarkerVisitor(applicationContext); + TreeVisitor markVisitor = d.getMarkerVisitor(new DefaultMarkerVisitorContext(applicationContext, project)); if (markVisitor != null) { try { cu = (CompilationUnit) markVisitor.visit(cu, new InMemoryExecutionContext(e -> log.error("Marker visitor failed!", e))); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteReconciler.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteReconciler.java index c2b9d04aa..da3e09383 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteReconciler.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteReconciler.java @@ -90,7 +90,7 @@ public class RewriteReconciler implements JavaReconciler { if (!descriptors.isEmpty()) { CompilationUnit cu = cuCache.getCU(project, URI.create(doc.getUri())); if (cu != null) { - collectProblems(descriptors, doc, cu, problemCollector::accept); + collectProblems(project, descriptors, doc, cu, problemCollector::accept); } } } catch (Exception e) { @@ -279,7 +279,7 @@ public class RewriteReconciler implements JavaReconciler { Path sourcePath = Paths.get(URI.create(doc.getUri())); if (cu.getSourcePath().equals(sourcePath)) { k++; - collectProblems(descriptors, doc, cu, problems::add); + collectProblems(project, descriptors, doc, cu, problems::add); if (!problems.isEmpty()) { allProblems.put(doc, problems); } @@ -316,8 +316,8 @@ public class RewriteReconciler implements JavaReconciler { }).collect(Collectors.toList()); } - private void collectProblems(List descriptors, IDocument doc, CompilationUnit compilationUnit, Consumer problemHandler) { - CompilationUnit cu = recipeRepo.mark(descriptors, compilationUnit); + private void collectProblems(IJavaProject project, List descriptors, IDocument doc, CompilationUnit compilationUnit, Consumer problemHandler) { + CompilationUnit cu = recipeRepo.mark(project, descriptors, compilationUnit); if (compilationUnit != cu) { new JavaMarkerVisitor() { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/AddConfigurationIfBeansPresentCodeAction.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/AddConfigurationIfBeansPresentCodeAction.java index 5254e0816..e278c093c 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/AddConfigurationIfBeansPresentCodeAction.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/AddConfigurationIfBeansPresentCodeAction.java @@ -20,12 +20,12 @@ import org.openrewrite.java.spring.boot2.AddConfigurationAnnotationIfBeansPresen import org.openrewrite.java.tree.J.ClassDeclaration; import org.openrewrite.java.tree.J.MethodDeclaration; import org.openrewrite.java.tree.J.VariableDeclarations; -import org.springframework.context.ApplicationContext; import org.springframework.ide.vscode.boot.java.Boot2JavaProblemType; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.java.SpringProjectUtil; import org.springframework.ide.vscode.commons.java.Version; import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; +import org.springframework.ide.vscode.commons.rewrite.config.MarkerVisitorContext; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; @@ -41,7 +41,7 @@ public class AddConfigurationIfBeansPresentCodeAction implements RecipeCodeActio private static final String FIX_LABEL = "Add missing '@Configuration' annotations over classes"; @Override - public JavaVisitor getMarkerVisitor(ApplicationContext applicationContext) { + public JavaVisitor getMarkerVisitor(MarkerVisitorContext context) { return new JavaMarkerVisitor() { @Override diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/AuthorizeHttpRequestsCodeAction.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/AuthorizeHttpRequestsCodeAction.java index 823c10bee..e3933ab70 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/AuthorizeHttpRequestsCodeAction.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/AuthorizeHttpRequestsCodeAction.java @@ -20,12 +20,12 @@ import org.openrewrite.java.MethodMatcher; import org.openrewrite.java.tree.J.MethodInvocation; import org.openrewrite.java.tree.J.VariableDeclarations; import org.openrewrite.java.tree.JavaType.FullyQualified; -import org.springframework.context.ApplicationContext; import org.springframework.ide.vscode.boot.java.Boot2JavaProblemType; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.java.SpringProjectUtil; import org.springframework.ide.vscode.commons.java.Version; import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; +import org.springframework.ide.vscode.commons.rewrite.config.MarkerVisitorContext; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; @@ -56,7 +56,7 @@ public class AuthorizeHttpRequestsCodeAction implements RecipeCodeActionDescript } @Override - public JavaVisitor getMarkerVisitor(ApplicationContext applicationContext) { + public JavaVisitor getMarkerVisitor(MarkerVisitorContext context) { return new JavaMarkerVisitor<>() { @Override diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/AutowiredFieldIntoConstructorParameterCodeAction.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/AutowiredFieldIntoConstructorParameterCodeAction.java index b6ec83263..f053a8686 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/AutowiredFieldIntoConstructorParameterCodeAction.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/AutowiredFieldIntoConstructorParameterCodeAction.java @@ -32,10 +32,10 @@ import org.openrewrite.java.tree.J.VariableDeclarations; import org.openrewrite.java.tree.JavaType.FullyQualified; import org.openrewrite.java.tree.TypeUtils; import org.openrewrite.marker.Range; -import org.springframework.context.ApplicationContext; import org.springframework.ide.vscode.boot.java.Boot2JavaProblemType; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; +import org.springframework.ide.vscode.commons.rewrite.config.MarkerVisitorContext; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; import org.springframework.ide.vscode.commons.rewrite.java.AnnotationHierarchies; @@ -52,7 +52,7 @@ public class AutowiredFieldIntoConstructorParameterCodeAction implements RecipeC private static final String AUTOWIRED = "org.springframework.beans.factory.annotation.Autowired"; @Override - public JavaVisitor getMarkerVisitor(ApplicationContext applicationContext) { + public JavaVisitor getMarkerVisitor(MarkerVisitorContext context) { return new JavaMarkerVisitor<>() { @Override diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/BeanMethodNotPublicProblem.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/BeanMethodNotPublicProblem.java index c735a2e34..adedf3283 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/BeanMethodNotPublicProblem.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/BeanMethodNotPublicProblem.java @@ -21,10 +21,10 @@ import org.openrewrite.java.JavaVisitor; import org.openrewrite.java.tree.J; import org.openrewrite.java.tree.TypeUtils; import org.openrewrite.marker.Range; -import org.springframework.context.ApplicationContext; import org.springframework.ide.vscode.boot.java.Boot2JavaProblemType; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.java.SpringProjectUtil; +import org.springframework.ide.vscode.commons.rewrite.config.MarkerVisitorContext; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; @@ -40,7 +40,7 @@ public class BeanMethodNotPublicProblem implements RecipeCodeActionDescriptor { private static final AnnotationMatcher BEAN_ANNOTATION_MATCHER = new AnnotationMatcher("@org.springframework.context.annotation.Bean"); @Override - public JavaVisitor getMarkerVisitor(ApplicationContext applicationContext) { + public JavaVisitor getMarkerVisitor(MarkerVisitorContext context) { return new JavaMarkerVisitor() { @Override diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/BeanPostProcessingIgnoreInAotProblem.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/BeanPostProcessingIgnoreInAotProblem.java index 87a7358c3..389ebe923 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/BeanPostProcessingIgnoreInAotProblem.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/BeanPostProcessingIgnoreInAotProblem.java @@ -22,10 +22,10 @@ import org.openrewrite.java.JavaVisitor; import org.openrewrite.java.tree.J.ClassDeclaration; import org.openrewrite.java.tree.J.MethodDeclaration; import org.openrewrite.marker.Range; -import org.springframework.context.ApplicationContext; import org.springframework.ide.vscode.boot.java.SpringAotJavaProblemType; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; +import org.springframework.ide.vscode.commons.rewrite.config.MarkerVisitorContext; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; import org.springframework.ide.vscode.commons.rewrite.java.BeanPostProcessingIgnoreInAot; @@ -39,7 +39,7 @@ public class BeanPostProcessingIgnoreInAotProblem implements RecipeCodeActionDes private static final String LABEL = "Add method 'isBeanExcludedFromAotProcessing' that returns 'false'"; @Override - public JavaVisitor getMarkerVisitor(ApplicationContext applicationContext) { + public JavaVisitor getMarkerVisitor(MarkerVisitorContext context) { return new JavaMarkerVisitor() { @Override diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/Boot3NotSupportedTypeProblem.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/Boot3NotSupportedTypeProblem.java index b7978952f..fbb36903f 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/Boot3NotSupportedTypeProblem.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/Boot3NotSupportedTypeProblem.java @@ -24,10 +24,10 @@ import org.openrewrite.java.tree.JavaType.FullyQualified; import org.openrewrite.java.tree.JavaType.Method; import org.openrewrite.java.tree.NameTree; import org.openrewrite.java.tree.TypeUtils; -import org.springframework.context.ApplicationContext; import org.springframework.ide.vscode.boot.java.Boot3JavaProblemType; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; +import org.springframework.ide.vscode.commons.rewrite.config.MarkerVisitorContext; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; import org.springframework.ide.vscode.commons.rewrite.java.JavaMarkerVisitor; @@ -41,7 +41,7 @@ public class Boot3NotSupportedTypeProblem implements RecipeCodeActionDescriptor ); @Override - public JavaVisitor getMarkerVisitor(ApplicationContext applicationContext) { + public JavaVisitor getMarkerVisitor(MarkerVisitorContext context) { return new JavaMarkerVisitor<>() { @Override public J.Identifier visitIdentifier(J.Identifier ident, ExecutionContext executionContext) { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/EntityIdForRepoProblem.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/EntityIdForRepoProblem.java new file mode 100644 index 000000000..1dd8ea023 --- /dev/null +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/EntityIdForRepoProblem.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * 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.ide.vscode.boot.java.rewrite.reconcile; + +import static org.springframework.ide.vscode.commons.java.SpringProjectUtil.springBootVersionGreaterOrEqual; + +import org.openrewrite.ExecutionContext; +import org.openrewrite.Tree; +import org.openrewrite.java.JavaVisitor; +import org.openrewrite.java.spring.boot2.search.EntityIdForRepositoryVisitor; +import org.openrewrite.java.tree.JavaType; +import org.openrewrite.marker.Marker; +import org.springframework.ide.vscode.boot.java.Boot2JavaProblemType; +import org.springframework.ide.vscode.commons.java.IJavaProject; +import org.springframework.ide.vscode.commons.java.SpringProjectUtil; +import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; +import org.springframework.ide.vscode.commons.rewrite.config.MarkerVisitorContext; +import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; +import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; + +public class EntityIdForRepoProblem implements RecipeCodeActionDescriptor { + + private static final String ID = "org.openrewrite.java.spring.boot2.search.EntityIdForRepositoryVisitor"; + + @Override + public JavaVisitor getMarkerVisitor(MarkerVisitorContext context) { + boolean considerIdField = context.project() != null && SpringProjectUtil.hasSpecificLibraryOnClasspath(context.project(), "spring-data-mongodb-", true); + return new EntityIdForRepositoryVisitor<>(considerIdField) { + @Override + protected Marker createMarker(JavaType domainIdType) { + return new FixAssistMarker(Tree.randomId(), ID).withLabel("Expected Domain ID type is '" + domainIdType + "'"); + } + }; + } + + @Override + public boolean isApplicable(IJavaProject project) { + return springBootVersionGreaterOrEqual(2, 0, 0).test(project); + } + + @Override + public String getId() { + return ID; + } + + @Override + public ProblemType getProblemType() { + return Boot2JavaProblemType.DOMAIN_ID_FOR_REPOSITORY; + } + +} diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/HttpSecurityLamdaDslCodeAction.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/HttpSecurityLamdaDslCodeAction.java index c1ffd619e..14003b4b0 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/HttpSecurityLamdaDslCodeAction.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/HttpSecurityLamdaDslCodeAction.java @@ -19,12 +19,12 @@ import org.openrewrite.java.JavaVisitor; import org.openrewrite.java.spring.boot2.HttpSecurityLambdaDsl; import org.openrewrite.java.tree.J.MethodInvocation; import org.openrewrite.marker.Range; -import org.springframework.context.ApplicationContext; import org.springframework.ide.vscode.boot.java.Boot2JavaProblemType; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.java.SpringProjectUtil; import org.springframework.ide.vscode.commons.java.Version; import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; +import org.springframework.ide.vscode.commons.rewrite.config.MarkerVisitorContext; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; @@ -40,7 +40,7 @@ public class HttpSecurityLamdaDslCodeAction implements RecipeCodeActionDescripto private HttpSecurityLambdaDsl recipe = new HttpSecurityLambdaDsl(); @Override - public JavaVisitor getMarkerVisitor(ApplicationContext applicationContext) { + public JavaVisitor getMarkerVisitor(MarkerVisitorContext context) { return new JavaMarkerVisitor() { @Override diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NoAutowiredOnConstructorProblem.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NoAutowiredOnConstructorProblem.java index ab1380d77..d52bda26e 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NoAutowiredOnConstructorProblem.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NoAutowiredOnConstructorProblem.java @@ -27,10 +27,10 @@ import org.openrewrite.java.tree.JavaType.FullyQualified; import org.openrewrite.java.tree.Statement; import org.openrewrite.java.tree.TypeUtils; import org.openrewrite.marker.Range; -import org.springframework.context.ApplicationContext; import org.springframework.ide.vscode.boot.java.Annotations; import org.springframework.ide.vscode.boot.java.Boot2JavaProblemType; import org.springframework.ide.vscode.commons.java.IJavaProject; +import org.springframework.ide.vscode.commons.rewrite.config.MarkerVisitorContext; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; @@ -45,7 +45,7 @@ public class NoAutowiredOnConstructorProblem implements RecipeCodeActionDescript private static final String LABEL = "Remove Unnecessary @Autowired"; @Override - public JavaVisitor getMarkerVisitor(ApplicationContext applicationContext) { + public JavaVisitor getMarkerVisitor(MarkerVisitorContext context) { return new JavaMarkerVisitor() { public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext context) { J.ClassDeclaration cd = super.visitClassDeclaration(classDecl, context); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NoRepoAnnotationProblem.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NoRepoAnnotationProblem.java index 90153c659..e32aa83da 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NoRepoAnnotationProblem.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NoRepoAnnotationProblem.java @@ -24,10 +24,10 @@ import org.openrewrite.java.tree.J.ClassDeclaration; import org.openrewrite.java.tree.JavaType; import org.openrewrite.java.tree.TypeUtils; import org.openrewrite.marker.Range; -import org.springframework.context.ApplicationContext; import org.springframework.ide.vscode.boot.java.Annotations; import org.springframework.ide.vscode.boot.java.Boot2JavaProblemType; import org.springframework.ide.vscode.commons.java.IJavaProject; +import org.springframework.ide.vscode.commons.rewrite.config.MarkerVisitorContext; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; @@ -42,7 +42,7 @@ public class NoRepoAnnotationProblem implements RecipeCodeActionDescriptor { private static final String ANNOTATION_REPOSITORY = Annotations.REPOSITORY; @Override - public JavaVisitor getMarkerVisitor(ApplicationContext applicationContext) { + public JavaVisitor getMarkerVisitor(MarkerVisitorContext context) { return new JavaMarkerVisitor() { @Override diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NoRequestMappingAnnotationCodeAction.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NoRequestMappingAnnotationCodeAction.java index 56a6906d6..5164dda5f 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NoRequestMappingAnnotationCodeAction.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NoRequestMappingAnnotationCodeAction.java @@ -21,10 +21,10 @@ import org.openrewrite.java.AnnotationMatcher; import org.openrewrite.java.JavaVisitor; import org.openrewrite.java.tree.J; import org.openrewrite.marker.Range; -import org.springframework.context.ApplicationContext; import org.springframework.ide.vscode.boot.java.Boot2JavaProblemType; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; +import org.springframework.ide.vscode.commons.rewrite.config.MarkerVisitorContext; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; @@ -38,7 +38,7 @@ public class NoRequestMappingAnnotationCodeAction implements RecipeCodeActionDes private static final AnnotationMatcher REQUEST_MAPPING_ANNOTATION_MATCHER = new AnnotationMatcher("@org.springframework.web.bind.annotation.RequestMapping"); @Override - public JavaVisitor getMarkerVisitor(ApplicationContext applicationContext) { + public JavaVisitor getMarkerVisitor(MarkerVisitorContext context) { return new JavaMarkerVisitor() { @Override public J.Annotation visitAnnotation(J.Annotation annotation, ExecutionContext ctx) { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NotRegisteredBeansProblem.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NotRegisteredBeansProblem.java index 9c72ee5e4..12c414403 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NotRegisteredBeansProblem.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NotRegisteredBeansProblem.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2022 VMware, Inc. + * Copyright (c) 2022, 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 @@ -18,7 +18,6 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -import org.eclipse.lsp4j.TextDocumentIdentifier; import org.eclipse.lsp4j.WorkspaceSymbol; import org.openrewrite.ExecutionContext; import org.openrewrite.SourceFile; @@ -28,7 +27,6 @@ import org.openrewrite.java.tree.J.ClassDeclaration; import org.openrewrite.java.tree.JavaType; import org.openrewrite.java.tree.JavaType.FullyQualified; import org.openrewrite.java.tree.TypeUtils; -import org.springframework.context.ApplicationContext; import org.springframework.ide.vscode.boot.app.SpringSymbolIndex; import org.springframework.ide.vscode.boot.java.SpringAotJavaProblemType; import org.springframework.ide.vscode.boot.java.beans.BeansSymbolAddOnInformation; @@ -37,8 +35,8 @@ import org.springframework.ide.vscode.boot.java.handlers.EnhancedSymbolInformati import org.springframework.ide.vscode.boot.java.handlers.SymbolAddOnInformation; import org.springframework.ide.vscode.commons.java.IClasspathUtil; import org.springframework.ide.vscode.commons.java.IJavaProject; -import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; +import org.springframework.ide.vscode.commons.rewrite.config.MarkerVisitorContext; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; @@ -59,7 +57,7 @@ public class NotRegisteredBeansProblem implements RecipeCodeActionDescriptor { ); @Override - public JavaVisitor getMarkerVisitor(ApplicationContext applicationContext) { + public JavaVisitor getMarkerVisitor(MarkerVisitorContext context) { return new JavaMarkerVisitor() { @Override @@ -70,7 +68,7 @@ public class NotRegisteredBeansProblem implements RecipeCodeActionDescriptor { String beanClassName = type.getFullyQualifiedName(); boolean applicable = AOT_BEANS.stream().filter(fqName -> TypeUtils.isAssignableTo(fqName, type)).findFirst().isPresent(); if (applicable) { - SpringSymbolIndex index = applicationContext.getBean(SpringSymbolIndex.class); + SpringSymbolIndex index = context.appContext().getBean(SpringSymbolIndex.class); List beanSymbols = index.getSymbols(data -> { SymbolAddOnInformation[] additionalInformation = data.getAdditionalInformation(); if (additionalInformation != null) { @@ -87,48 +85,44 @@ public class NotRegisteredBeansProblem implements RecipeCodeActionDescriptor { List constructors = c.getType().getMethods().stream().filter(m -> m.isConstructor()).collect(Collectors.toList()); if (beanSymbols.isEmpty()) { SourceFile source = getCursor().firstEnclosing(SourceFile.class); - String uri = source.getSourcePath().toUri().toASCIIString(); FixAssistMarker marker = new FixAssistMarker(Tree.randomId(), getId()); - JavaProjectFinder projectFinder = applicationContext.getBean(JavaProjectFinder.class); - if (projectFinder != null) { - IJavaProject project = projectFinder.find(new TextDocumentIdentifier(uri)).orElse(null); - if (project != null) { - - for (EnhancedSymbolInformation s : index.getEnhancedSymbols(project)) { - if (s.getAdditionalInformation() != null) { - ConfigBeanSymbolAddOnInformation configInfo = Arrays.stream(s.getAdditionalInformation()).filter(ConfigBeanSymbolAddOnInformation.class::isInstance).map(ConfigBeanSymbolAddOnInformation.class::cast).findFirst().orElse(null); - if (configInfo != null) { - for (JavaType.Method constructor : constructors) { - String constructorParamsSignature = "(" + constructor.getParameterTypes().stream().map(pt -> typePattern(pt)).collect(Collectors.joining(",")) + ")"; - String beanMethodName = "get" + type.getClassName(); - String pattern = beanMethodName + constructorParamsSignature; - String contructorParamsLabel = "(" + constructor.getParameterTypes().stream().map(NotRegisteredBeansProblem::typeStr).collect(Collectors.joining(", ")) + ")"; - - Builder paramBuilder = ImmutableList.builder(); - for (int i = 0; i < constructor.getParameterNames().size() && i < constructor.getParameterTypes().size(); i++) { - JavaType paramType = constructor.getParameterTypes().get(i); - String paramName = constructor.getParameterNames().get(i); - paramBuilder.add(typeStr(paramType) + ' ' + paramName); - } - String paramsStr = String.join(", ", paramBuilder.build().toArray(String[]::new)); - - fixListBuilder.add(new FixDescriptor(DEFINE_METHOD_RECIPE, List.of(s.getSymbol().getLocation().getLeft().getUri()), "Define bean in config '" + configInfo.getBeanID() + "' with constructor " + contructorParamsLabel) - .withRecipeScope(RecipeScope.FILE) - .withParameters(Map.of( - "targetFqName", configInfo.getBeanType(), - "signature", pattern, - "template", "@Bean\n" - + type.getClassName() + " " + beanMethodName + "(" + paramsStr + ") {\n" - + "return new " + type.getClassName() + "(" + constructor.getParameterNames().stream().collect(Collectors.joining(", ")) + ");\n" - + "}\n", - "imports", allFQTypes(constructor).toArray(String[]::new), - "typeStubs", new String[] { source.printAll() }, - "classpath", IClasspathUtil.getAllBinaryRoots(project.getClasspath()).stream().map(f -> f.toPath().toString()).toArray(String[]::new) - - )) - ); - } - } + IJavaProject project = context.project(); + if (project != null) { + + for (EnhancedSymbolInformation s : index.getEnhancedSymbols(project)) { + if (s.getAdditionalInformation() != null) { + ConfigBeanSymbolAddOnInformation configInfo = Arrays.stream(s.getAdditionalInformation()).filter(ConfigBeanSymbolAddOnInformation.class::isInstance).map(ConfigBeanSymbolAddOnInformation.class::cast).findFirst().orElse(null); + if (configInfo != null) { + for (JavaType.Method constructor : constructors) { + String constructorParamsSignature = "(" + constructor.getParameterTypes().stream().map(pt -> typePattern(pt)).collect(Collectors.joining(",")) + ")"; + String beanMethodName = "get" + type.getClassName(); + String pattern = beanMethodName + constructorParamsSignature; + String contructorParamsLabel = "(" + constructor.getParameterTypes().stream().map(NotRegisteredBeansProblem::typeStr).collect(Collectors.joining(", ")) + ")"; + + Builder paramBuilder = ImmutableList.builder(); + for (int i = 0; i < constructor.getParameterNames().size() && i < constructor.getParameterTypes().size(); i++) { + JavaType paramType = constructor.getParameterTypes().get(i); + String paramName = constructor.getParameterNames().get(i); + paramBuilder.add(typeStr(paramType) + ' ' + paramName); + } + String paramsStr = String.join(", ", paramBuilder.build().toArray(String[]::new)); + + fixListBuilder.add(new FixDescriptor(DEFINE_METHOD_RECIPE, List.of(s.getSymbol().getLocation().getLeft().getUri()), "Define bean in config '" + configInfo.getBeanID() + "' with constructor " + contructorParamsLabel) + .withRecipeScope(RecipeScope.FILE) + .withParameters(Map.of( + "targetFqName", configInfo.getBeanType(), + "signature", pattern, + "template", "@Bean\n" + + type.getClassName() + " " + beanMethodName + "(" + paramsStr + ") {\n" + + "return new " + type.getClassName() + "(" + constructor.getParameterNames().stream().collect(Collectors.joining(", ")) + ");\n" + + "}\n", + "imports", allFQTypes(constructor).toArray(String[]::new), + "typeStubs", new String[] { source.printAll() }, + "classpath", IClasspathUtil.getAllBinaryRoots(project.getClasspath()).stream().map(f -> f.toPath().toString()).toArray(String[]::new) + + )) + ); + } } } } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/PreciseBeanTypeProblem.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/PreciseBeanTypeProblem.java index afc3657fb..e90069008 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/PreciseBeanTypeProblem.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/PreciseBeanTypeProblem.java @@ -24,9 +24,9 @@ import org.openrewrite.java.tree.J.Return; import org.openrewrite.java.tree.JavaType; import org.openrewrite.java.tree.TypeUtils; import org.openrewrite.marker.Range; -import org.springframework.context.ApplicationContext; import org.springframework.ide.vscode.boot.java.SpringAotJavaProblemType; import org.springframework.ide.vscode.commons.java.IJavaProject; +import org.springframework.ide.vscode.commons.rewrite.config.MarkerVisitorContext; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; @@ -42,7 +42,7 @@ public class PreciseBeanTypeProblem implements RecipeCodeActionDescriptor { private static final String MSG_KEY = "returnType"; @Override - public JavaVisitor getMarkerVisitor(ApplicationContext applicationContext) { + public JavaVisitor getMarkerVisitor(MarkerVisitorContext context) { return new JavaMarkerVisitor<>() { public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, ExecutionContext executionContext) { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/ServerHttpSecurityLambdaDslCodeAction.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/ServerHttpSecurityLambdaDslCodeAction.java index 6bd6a92d0..31a439e84 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/ServerHttpSecurityLambdaDslCodeAction.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/ServerHttpSecurityLambdaDslCodeAction.java @@ -19,12 +19,12 @@ import org.openrewrite.java.JavaVisitor; import org.openrewrite.java.spring.boot2.ServerHttpSecurityLambdaDsl; import org.openrewrite.java.tree.J.MethodInvocation; import org.openrewrite.marker.Range; -import org.springframework.context.ApplicationContext; import org.springframework.ide.vscode.boot.java.Boot2JavaProblemType; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.java.SpringProjectUtil; import org.springframework.ide.vscode.commons.java.Version; import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; +import org.springframework.ide.vscode.commons.rewrite.config.MarkerVisitorContext; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; @@ -40,7 +40,7 @@ public class ServerHttpSecurityLambdaDslCodeAction implements RecipeCodeActionDe private ServerHttpSecurityLambdaDsl recipe = new ServerHttpSecurityLambdaDsl(); @Override - public JavaVisitor getMarkerVisitor(ApplicationContext applicationContext) { + public JavaVisitor getMarkerVisitor(MarkerVisitorContext context) { return new JavaMarkerVisitor() { @Override diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/UnnecessarySpringExtensionProblem.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/UnnecessarySpringExtensionProblem.java index 25baf033a..02de24a5d 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/UnnecessarySpringExtensionProblem.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/UnnecessarySpringExtensionProblem.java @@ -24,9 +24,9 @@ import org.openrewrite.java.JavaVisitor; import org.openrewrite.java.tree.J.ClassDeclaration; import org.openrewrite.java.tree.JavaType.FullyQualified; import org.openrewrite.java.tree.TypeUtils; -import org.springframework.context.ApplicationContext; import org.springframework.ide.vscode.boot.java.Boot2JavaProblemType; import org.springframework.ide.vscode.commons.java.IJavaProject; +import org.springframework.ide.vscode.commons.rewrite.config.MarkerVisitorContext; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; @@ -58,7 +58,7 @@ public class UnnecessarySpringExtensionProblem implements RecipeCodeActionDescri private static final AnnotationMatcher SPRING_EXTENSION_ANNOTATIN_MATCHER = new AnnotationMatcher("@org.junit.jupiter.api.extension.ExtendWith(org.springframework.test.context.junit.jupiter.SpringExtension.class)"); @Override - public JavaVisitor getMarkerVisitor(ApplicationContext applicationContext) { + public JavaVisitor getMarkerVisitor(MarkerVisitorContext context) { return new JavaMarkerVisitor<>() { @Override diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/WebSecurityConfigurerAdapterCodeAction.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/WebSecurityConfigurerAdapterCodeAction.java index 19d5e774a..bf3d7ee40 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/WebSecurityConfigurerAdapterCodeAction.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/WebSecurityConfigurerAdapterCodeAction.java @@ -22,13 +22,13 @@ import org.openrewrite.java.tree.J.ClassDeclaration; import org.openrewrite.java.tree.JavaType; import org.openrewrite.java.tree.TypeTree; import org.openrewrite.java.tree.TypeUtils; -import org.springframework.context.ApplicationContext; import org.springframework.ide.vscode.boot.java.Annotations; import org.springframework.ide.vscode.boot.java.Boot2JavaProblemType; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.java.SpringProjectUtil; import org.springframework.ide.vscode.commons.java.Version; import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; +import org.springframework.ide.vscode.commons.rewrite.config.MarkerVisitorContext; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; @@ -82,7 +82,7 @@ public class WebSecurityConfigurerAdapterCodeAction implements RecipeCodeActionD } @Override - public JavaVisitor getMarkerVisitor(ApplicationContext applicationContext) { + public JavaVisitor getMarkerVisitor(MarkerVisitorContext context) { return new JavaMarkerVisitor<>() { @Override diff --git a/headless-services/spring-boot-language-server/src/main/resources/problem-types.json b/headless-services/spring-boot-language-server/src/main/resources/problem-types.json index cee5419ca..ae9b5022e 100644 --- a/headless-services/spring-boot-language-server/src/main/resources/problem-types.json +++ b/headless-services/spring-boot-language-server/src/main/resources/problem-types.json @@ -73,6 +73,12 @@ "label": "Replace usage of 'WebSecurityConfigurerAdapter' as this class to be removed in Security 6.x", "description": "'WebSecurityConfigurerAdapter' is removed in Spring-Security 6.x. Refactor classes extending the 'WebSecurityConfigurerAdapter' into 'Configuration' beans and methods into 'Bean' definitions ", "defaultSeverity": "WARNING" + }, + { + "code": "DOMAIN_ID_FOR_REPOSITORY", + "label": "Invalid Domain ID Type for Spring Data Repository", + "description": "Invalid Domain ID type for Spring Data Repository", + "defaultSeverity": "ERROR" } ] }, diff --git a/vscode-extensions/vscode-spring-boot/package.json b/vscode-extensions/vscode-spring-boot/package.json index a17949fb3..995c3216f 100644 --- a/vscode-extensions/vscode-spring-boot/package.json +++ b/vscode-extensions/vscode-spring-boot/package.json @@ -442,6 +442,18 @@ "HINT", "ERROR" ] + }, + "spring-boot.ls.problem.boot2.DOMAIN_ID_FOR_REPOSITORY": { + "type": "string", + "default": "ERROR", + "description": "Invalid Domain ID type for Spring Data Repository", + "enum": [ + "IGNORE", + "INFO", + "WARNING", + "HINT", + "ERROR" + ] } } }, @@ -1010,4 +1022,4 @@ "extensionDependencies": [ "redhat.java" ] -} +} \ No newline at end of file