Support <import> in logback.xml during AOT processing

See gh-32756
This commit is contained in:
Andy Wilkinson
2022-10-20 14:56:25 +01:00
parent 685fa900f8
commit 482eb49391
2 changed files with 27 additions and 17 deletions

View File

@@ -36,15 +36,14 @@ import java.util.stream.Stream;
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.joran.spi.DefaultNestedComponentRegistry;
import ch.qos.logback.core.joran.spi.ElementSelector;
import ch.qos.logback.core.joran.spi.RuleStore;
import ch.qos.logback.core.joran.util.beans.BeanDescription;
import ch.qos.logback.core.joran.util.beans.BeanDescriptionCache;
import ch.qos.logback.core.model.ComponentModel;
import ch.qos.logback.core.model.Model;
import ch.qos.logback.core.model.ModelUtil;
import ch.qos.logback.core.model.processor.DefaultProcessor;
import ch.qos.logback.core.model.processor.ModelInterpretationContext;
import ch.qos.logback.core.spi.ContextAware;
import ch.qos.logback.core.spi.ContextAwareBase;
@@ -113,9 +112,7 @@ class SpringBootJoranConfigurator extends JoranConfigurator {
super.processModel(model);
if (!NativeDetector.inNativeImage() && isAotProcessingInProgress()) {
getContext().putObject(BeanFactoryInitializationAotContribution.class.getName(),
new LogbackConfigurationAotContribution(model,
getModelInterpretationContext().getBeanDescriptionCache(),
getModelInterpretationContext().getDefaultNestedComponentRegistry(), getContext()));
new LogbackConfigurationAotContribution(model, getModelInterpretationContext(), getContext()));
}
}
@@ -129,9 +126,9 @@ class SpringBootJoranConfigurator extends JoranConfigurator {
private final PatternRules patternRules;
private LogbackConfigurationAotContribution(Model model, BeanDescriptionCache beanDescriptionCache,
DefaultNestedComponentRegistry nestedComponentRegistry, Context context) {
this.modelWriter = new ModelWriter(model, beanDescriptionCache, nestedComponentRegistry);
private LogbackConfigurationAotContribution(Model model, ModelInterpretationContext interpretationContext,
Context context) {
this.modelWriter = new ModelWriter(model, interpretationContext);
this.patternRules = new PatternRules(context);
}
@@ -150,15 +147,11 @@ class SpringBootJoranConfigurator extends JoranConfigurator {
private final Model model;
private final BeanDescriptionCache beanDescriptionCache;
private final ModelInterpretationContext modelInterpretationContext;
private final DefaultNestedComponentRegistry nestedComponentRegistry;
private ModelWriter(Model model, BeanDescriptionCache beanDescriptionCache,
DefaultNestedComponentRegistry nestedComponentRegistry) {
private ModelWriter(Model model, ModelInterpretationContext modelInterpretationContext) {
this.model = model;
this.beanDescriptionCache = beanDescriptionCache;
this.nestedComponentRegistry = nestedComponentRegistry;
this.modelInterpretationContext = modelInterpretationContext;
}
private void writeTo(GenerationContext generationContext) {
@@ -215,7 +208,8 @@ class SpringBootJoranConfigurator extends JoranConfigurator {
}
String tag = model.getTag();
if (tag != null) {
String componentType = this.nestedComponentRegistry.findDefaultComponentTypeByTag(tag);
String componentType = this.modelInterpretationContext.getDefaultNestedComponentRegistry()
.findDefaultComponentTypeByTag(tag);
processComponent(componentType, reflectionTypes);
}
for (Model submodel : model.getSubModels()) {
@@ -226,7 +220,8 @@ class SpringBootJoranConfigurator extends JoranConfigurator {
private void processComponent(String componentTypeName, Set<String> reflectionTypes) {
if (componentTypeName != null) {
BeanDescription beanDescription = this.beanDescriptionCache
componentTypeName = this.modelInterpretationContext.getImport(componentTypeName);
BeanDescription beanDescription = this.modelInterpretationContext.getBeanDescriptionCache()
.getBeanDescription(loadComponentType(componentTypeName));
reflectionTypes.addAll(parameterTypesNames(beanDescription.getPropertyNameToAdder().values()));
reflectionTypes.addAll(parameterTypesNames(beanDescription.getPropertyNameToSetter().values()));

View File

@@ -20,6 +20,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.function.Predicate;
@@ -32,6 +33,7 @@ import ch.qos.logback.core.FileAppender;
import ch.qos.logback.core.Layout;
import ch.qos.logback.core.model.ComponentModel;
import ch.qos.logback.core.model.ImplicitModel;
import ch.qos.logback.core.model.ImportModel;
import ch.qos.logback.core.model.Model;
import ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy;
import ch.qos.logback.core.rolling.TimeBasedFileNamingAndTriggeringPolicy;
@@ -134,6 +136,19 @@ class LogbackConfigurationAotContributionTests {
.accepts(generationContext.getRuntimeHints());
}
@Test
void componentModelReferencingImportedClassNameIsRegisteredForReflection() {
ImportModel importModel = new ImportModel();
importModel.setClassName(SizeAndTimeBasedRollingPolicy.class.getName());
ComponentModel component = new ComponentModel();
component.setClassName(SizeAndTimeBasedRollingPolicy.class.getSimpleName());
Model model = new Model();
model.getSubModels().addAll(List.of(importModel, component));
TestGenerationContext generationContext = applyContribution(model);
assertThat(invokePublicConstructorsAndInspectAndInvokePublicMethodsOf(SizeAndTimeBasedRollingPolicy.class))
.accepts(generationContext.getRuntimeHints());
}
private Predicate<RuntimeHints> invokePublicConstructorsOf(String name) {
return RuntimeHintsPredicates.reflection().onType(TypeReference.of(name))
.withMemberCategory(MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS);