From de609e5d45e2eed1dca09d53c6d23be7db1d5851 Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Mon, 10 Oct 2022 16:52:22 +0200 Subject: [PATCH] Polishing --- .../context/aot/ContextAotProcessor.java | 17 +++++++++++++---- .../test/context/aot/TestAotProcessor.java | 10 +++++++++- .../test/context/aot/TestClassScanner.java | 5 ++--- .../context/aot/TestContextAotGenerator.java | 18 +++++++++--------- 4 files changed, 33 insertions(+), 17 deletions(-) diff --git a/spring-context/src/main/java/org/springframework/context/aot/ContextAotProcessor.java b/spring-context/src/main/java/org/springframework/context/aot/ContextAotProcessor.java index c645a47f54..0fc952f4c9 100644 --- a/spring-context/src/main/java/org/springframework/context/aot/ContextAotProcessor.java +++ b/spring-context/src/main/java/org/springframework/context/aot/ContextAotProcessor.java @@ -67,6 +67,15 @@ public abstract class ContextAotProcessor extends AbstractAotProcessor { this.application = application; } + + /** + * Get the the application entry point. + */ + protected Class getApplication() { + return this.application; + } + + /** * Invoke the processing by clearing output directories first, followed by * {@link #performAotProcessing(GenericApplicationContext)}. @@ -75,7 +84,7 @@ public abstract class ContextAotProcessor extends AbstractAotProcessor { */ public ClassName process() { deleteExistingOutput(); - GenericApplicationContext applicationContext = prepareApplicationContext(this.application); + GenericApplicationContext applicationContext = prepareApplicationContext(getApplication()); return performAotProcessing(applicationContext); } @@ -102,7 +111,7 @@ public abstract class ContextAotProcessor extends AbstractAotProcessor { registerEntryPointHint(generationContext, generatedInitializerClassName); generationContext.writeGeneratedContent(); writeHints(generationContext.getRuntimeHints()); - writeNativeImageProperties(getDefaultNativeImageArguments(this.application.getName())); + writeNativeImageProperties(getDefaultNativeImageArguments(getApplication().getName())); return generatedInitializerClassName; } @@ -113,7 +122,7 @@ public abstract class ContextAotProcessor extends AbstractAotProcessor { * @return the class name generator */ protected ClassNameGenerator createClassNameGenerator() { - return new ClassNameGenerator(ClassName.get(this.application)); + return new ClassNameGenerator(ClassName.get(getApplication())); } /** @@ -137,7 +146,7 @@ public abstract class ContextAotProcessor extends AbstractAotProcessor { ClassName generatedInitializerClassName) { TypeReference generatedType = TypeReference.of(generatedInitializerClassName.canonicalName()); - TypeReference applicationType = TypeReference.of(this.application); + TypeReference applicationType = TypeReference.of(getApplication()); ReflectionHints reflection = generationContext.getRuntimeHints().reflection(); reflection.registerType(applicationType); reflection.registerType(generatedType, typeHint -> typeHint.onReachableType(applicationType) diff --git a/spring-test/src/main/java/org/springframework/test/context/aot/TestAotProcessor.java b/spring-test/src/main/java/org/springframework/test/context/aot/TestAotProcessor.java index 19cd25e29b..bf2da8d2ef 100644 --- a/spring-test/src/main/java/org/springframework/test/context/aot/TestAotProcessor.java +++ b/spring-test/src/main/java/org/springframework/test/context/aot/TestAotProcessor.java @@ -61,6 +61,14 @@ public abstract class TestAotProcessor extends AbstractAotProcessor { } + /** + * Get the classpath roots to scan for test classes. + */ + protected Set getClasspathRoots() { + return this.classpathRoots; + } + + /** * Trigger processing of the test classes by * {@linkplain #deleteExistingOutput() clearing output directories} first and @@ -79,7 +87,7 @@ public abstract class TestAotProcessor extends AbstractAotProcessor { * components used by the tests. */ protected void performAotProcessing() { - TestClassScanner scanner = new TestClassScanner(this.classpathRoots); + TestClassScanner scanner = new TestClassScanner(getClasspathRoots()); Stream> testClasses = scanner.scan(); GeneratedFiles generatedFiles = createFileSystemGeneratedFiles(); diff --git a/spring-test/src/main/java/org/springframework/test/context/aot/TestClassScanner.java b/spring-test/src/main/java/org/springframework/test/context/aot/TestClassScanner.java index 3f4c882692..574d9c0790 100644 --- a/spring-test/src/main/java/org/springframework/test/context/aot/TestClassScanner.java +++ b/spring-test/src/main/java/org/springframework/test/context/aot/TestClassScanner.java @@ -103,7 +103,7 @@ class TestClassScanner { * absolute path to the project's {@code build/classes/java/test} folder. * @param classpathRoots the classpath roots to scan */ - public TestClassScanner(Set classpathRoots) { + TestClassScanner(Set classpathRoots) { this.classpathRoots = assertPreconditions(classpathRoots); } @@ -111,7 +111,7 @@ class TestClassScanner { /** * Scan the configured classpath roots for Spring integration test classes. */ - public Stream> scan() { + Stream> scan() { return scan(new String[0]); } @@ -206,7 +206,6 @@ class TestClassScanner { mergedAnnotations.isPresent(BootstrapWith.class)); } - private static Set assertPreconditions(Set classpathRoots) { Assert.notEmpty(classpathRoots, "'classpathRoots' must not be null or empty"); Assert.noNullElements(classpathRoots, "'classpathRoots' must not contain null elements"); diff --git a/spring-test/src/main/java/org/springframework/test/context/aot/TestContextAotGenerator.java b/spring-test/src/main/java/org/springframework/test/context/aot/TestContextAotGenerator.java index d71a1cf22d..8b81e544d3 100644 --- a/spring-test/src/main/java/org/springframework/test/context/aot/TestContextAotGenerator.java +++ b/spring-test/src/main/java/org/springframework/test/context/aot/TestContextAotGenerator.java @@ -126,8 +126,8 @@ public class TestContextAotGenerator { }); MultiValueMap> initializerClassMappings = processAheadOfTime(mergedConfigMappings); - generateTestAotMappings(initializerClassMappings); - generateAotTestAttributes(); + generateAotTestContextInitializerMappings(initializerClassMappings); + generateAotTestAttributeMappings(); } finally { resetAotFactories(); @@ -139,7 +139,9 @@ public class TestContextAotGenerator { AotTestContextInitializersFactory.reset(); } - private MultiValueMap> processAheadOfTime(MultiValueMap> mergedConfigMappings) { + private MultiValueMap> processAheadOfTime( + MultiValueMap> mergedConfigMappings) { + ClassLoader classLoader = getClass().getClassLoader(); MultiValueMap> initializerClassMappings = new LinkedMultiValueMap<>(); mergedConfigMappings.forEach((mergedConfig, testClasses) -> { @@ -251,9 +253,8 @@ public class TestContextAotGenerator { return "TestContext%03d_".formatted(this.sequence.incrementAndGet()); } - private void generateTestAotMappings(MultiValueMap> initializerClassMappings) { - ClassNameGenerator classNameGenerator = new ClassNameGenerator( - ClassName.get(AotTestContextInitializers.class)); + private void generateAotTestContextInitializerMappings(MultiValueMap> initializerClassMappings) { + ClassNameGenerator classNameGenerator = new ClassNameGenerator(ClassName.get(AotTestContextInitializers.class)); DefaultGenerationContext generationContext = new DefaultGenerationContext(classNameGenerator, this.generatedFiles, this.runtimeHints); GeneratedClasses generatedClasses = generationContext.getGeneratedClasses(); @@ -265,9 +266,8 @@ public class TestContextAotGenerator { registerPublicMethods(className); } - private void generateAotTestAttributes() { - ClassNameGenerator classNameGenerator = new ClassNameGenerator( - ClassName.get(AotTestAttributes.class)); + private void generateAotTestAttributeMappings() { + ClassNameGenerator classNameGenerator = new ClassNameGenerator(ClassName.get(AotTestAttributes.class)); DefaultGenerationContext generationContext = new DefaultGenerationContext(classNameGenerator, this.generatedFiles, this.runtimeHints); GeneratedClasses generatedClasses = generationContext.getGeneratedClasses();