From f034246f18eb41153b95ca5fdf1e7783549779ec Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Wed, 12 Mar 2025 12:42:08 +0100 Subject: [PATCH] GH-1499: added demo code to find config beans with imports for a certain type --- .../ide/vscode/boot/java/Annotations.java | 3 ++- .../test/SpringIndexerBeanRegistrarTest.java | 19 +++++++++++++++ .../src/main/java/com/example/BeanClass.java | 5 ---- .../example/ConfigImportsBeanRegistrar.java | 9 +++++++ .../java/com/example/MyBeanRegistrar.java | 24 ++++++++----------- .../example/NotRegisterredBeanRegistrar.java | 14 +++++++++++ 6 files changed, 54 insertions(+), 20 deletions(-) delete mode 100644 headless-services/spring-boot-language-server/src/test/resources/test-projects/test-framework-7-indexing/src/main/java/com/example/BeanClass.java create mode 100644 headless-services/spring-boot-language-server/src/test/resources/test-projects/test-framework-7-indexing/src/main/java/com/example/ConfigImportsBeanRegistrar.java create mode 100644 headless-services/spring-boot-language-server/src/test/resources/test-projects/test-framework-7-indexing/src/main/java/com/example/NotRegisterredBeanRegistrar.java diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/Annotations.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/Annotations.java index 1064b54fb..792981421 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/Annotations.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/Annotations.java @@ -27,6 +27,8 @@ public class Annotations { public static final String COMPONENT = "org.springframework.stereotype.Component"; public static final String CONFIGURATION = "org.springframework.context.annotation.Configuration"; + public static final String IMPORT = "org.springframework.context.annotation.Import"; + public static final String CONTROLLER = "org.springframework.stereotype.Controller"; public static final String CONFIGURATION_PROPERTIES = "org.springframework.boot.context.properties.ConfigurationProperties"; @@ -113,5 +115,4 @@ public class Annotations { "org.aspectj.lang.annotation.DeclareParents", "DeclareParents" ); - } diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/index/test/SpringIndexerBeanRegistrarTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/index/test/SpringIndexerBeanRegistrarTest.java index 901622feb..20b916ef4 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/index/test/SpringIndexerBeanRegistrarTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/index/test/SpringIndexerBeanRegistrarTest.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.springframework.ide.vscode.boot.index.test; +import static org.junit.Assert.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; import java.io.File; @@ -28,7 +29,9 @@ import org.springframework.ide.vscode.boot.app.SpringSymbolIndex; import org.springframework.ide.vscode.boot.bootiful.BootLanguageServerTest; import org.springframework.ide.vscode.boot.bootiful.SymbolProviderTestConf; import org.springframework.ide.vscode.boot.index.SpringMetamodelIndex; +import org.springframework.ide.vscode.boot.java.Annotations; import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; +import org.springframework.ide.vscode.commons.protocol.spring.AnnotationMetadata; import org.springframework.ide.vscode.commons.protocol.spring.Bean; import org.springframework.ide.vscode.commons.protocol.spring.SpringIndexElement; import org.springframework.ide.vscode.project.harness.BootLanguageServerHarness; @@ -94,5 +97,21 @@ public class SpringIndexerBeanRegistrarTest { assertEquals("baz", baz.getName()); assertEquals("com.example.Baz", baz.getType()); } + + @Test + void testNonRegisteredBeanRegistrar() throws Exception { + + Bean[] beans = springIndex.getBeansOfProject("test-framework-7-indexing"); + String registrarName = "com.example.MyBeanRegistrar"; + + boolean anyMatch = Arrays.stream(beans) + .filter(bean -> bean.isConfiguration()) // look into beans with @Configuration only + .flatMap(bean -> Arrays.stream(bean.getAnnotations())) // look into annotations on this bean definition + .filter(annotation -> Annotations.IMPORT.equals(annotation.getAnnotationType())) // look into @Import annotations only + .flatMap(annotation -> Arrays.stream(annotation.getAttributes().get("value"))) // look into the attribute values of "value" attribute + .anyMatch(annotationValue -> annotationValue.getName().equals(registrarName)); + + assertTrue(anyMatch); + } } diff --git a/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-framework-7-indexing/src/main/java/com/example/BeanClass.java b/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-framework-7-indexing/src/main/java/com/example/BeanClass.java deleted file mode 100644 index 6fe79cd53..000000000 --- a/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-framework-7-indexing/src/main/java/com/example/BeanClass.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.example; - -public class BeanClass { - -} diff --git a/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-framework-7-indexing/src/main/java/com/example/ConfigImportsBeanRegistrar.java b/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-framework-7-indexing/src/main/java/com/example/ConfigImportsBeanRegistrar.java new file mode 100644 index 000000000..17a69efd6 --- /dev/null +++ b/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-framework-7-indexing/src/main/java/com/example/ConfigImportsBeanRegistrar.java @@ -0,0 +1,9 @@ +package com.example; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +@Configuration +@Import(MyBeanRegistrar.class) +public class ConfigImportsBeanRegistrar { +} diff --git a/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-framework-7-indexing/src/main/java/com/example/MyBeanRegistrar.java b/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-framework-7-indexing/src/main/java/com/example/MyBeanRegistrar.java index 202cbb8e4..2457ca48d 100644 --- a/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-framework-7-indexing/src/main/java/com/example/MyBeanRegistrar.java +++ b/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-framework-7-indexing/src/main/java/com/example/MyBeanRegistrar.java @@ -6,19 +6,15 @@ import org.springframework.core.env.Environment; public class MyBeanRegistrar implements BeanRegistrar { - @Override - public void register(BeanRegistry registry, Environment env) { - registry.registerBean(FooFoo.class); - registry.registerBean("foo", Foo.class); - registry.registerBean("bar", Bar.class, spec -> spec - .prototype() - .lazyInit() - .description("Custom description") - .supplier(context -> new Bar(context.bean(Foo.class)))); - if (env.matchesProfiles("baz")) { - registry.registerBean(Baz.class, spec -> spec - .supplier(context -> new Baz("Hello World!"))); - } - } + @Override + public void register(BeanRegistry registry, Environment env) { + registry.registerBean(FooFoo.class); + registry.registerBean("foo", Foo.class); + registry.registerBean("bar", Bar.class, spec -> spec.prototype().lazyInit().description("Custom description") + .supplier(context -> new Bar(context.bean(Foo.class)))); + if (env.matchesProfiles("baz")) { + registry.registerBean(Baz.class, spec -> spec.supplier(context -> new Baz("Hello World!"))); + } + } } diff --git a/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-framework-7-indexing/src/main/java/com/example/NotRegisterredBeanRegistrar.java b/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-framework-7-indexing/src/main/java/com/example/NotRegisterredBeanRegistrar.java new file mode 100644 index 000000000..26013e448 --- /dev/null +++ b/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-framework-7-indexing/src/main/java/com/example/NotRegisterredBeanRegistrar.java @@ -0,0 +1,14 @@ +package com.example; + +import org.springframework.beans.factory.BeanRegistrar; +import org.springframework.beans.factory.BeanRegistry; +import org.springframework.core.env.Environment; + +public class NotRegisterredBeanRegistrar implements BeanRegistrar { + + @Override + public void register(BeanRegistry registry, Environment env) { + registry.registerBean("not-registered-anyway", FooFoo.class); + } + +}