Skip to content

Commit 564d112

Browse files
committed
Do not remove ConfigMappings marked as not removable via build item
1 parent 71e0df3 commit 564d112

File tree

6 files changed

+83
-4
lines changed

6 files changed

+83
-4
lines changed

extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/ConfigBuildStep.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,7 @@ void registerConfigMappingConverters(CombinedIndexBuildItem indexBuildItem,
383383
void validateConfigMappingsInjectionPoints(
384384
ArcConfig arcConfig,
385385
ValidationPhaseBuildItem validationPhase,
386+
List<UnremovableBeanBuildItem> unremovableBeans,
386387
List<ConfigClassBuildItem> configClasses,
387388
BuildProducer<ConfigMappingBuildItem> configMappings) {
388389

@@ -422,10 +423,17 @@ void validateConfigMappingsInjectionPoints(
422423
}
423424
}
424425

425-
for (ConfigClassBuildItem configClass : configMappingTypes.values()) {
426-
// We don't look in the beans here, because SR Config has an API that can retrieve the mapping without CDI
427-
if (!arcConfig.shouldEnableBeanRemoval() || configClass.getConfigClass().isAnnotationPresent(Unremovable.class)) {
428-
toRegister.add(new ConfigMappingBuildItem(configClass.getConfigClass(), configClass.getPrefix()));
426+
if (arcConfig.shouldEnableBeanRemoval()) {
427+
Set<String> unremovableClassNames = unremovableBeans.stream()
428+
.map(UnremovableBeanBuildItem::getClassNames)
429+
.flatMap(Collection::stream)
430+
.collect(toSet());
431+
432+
for (ConfigClassBuildItem configClass : configMappingTypes.values()) {
433+
if (configClass.getConfigClass().isAnnotationPresent(Unremovable.class)
434+
|| unremovableClassNames.contains(configClass.getName().toString())) {
435+
toRegister.add(new ConfigMappingBuildItem(configClass.getConfigClass(), configClass.getPrefix()));
436+
}
429437
}
430438
}
431439

extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/UnremovableBeanBuildItem.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,41 @@
4747
public final class UnremovableBeanBuildItem extends MultiBuildItem {
4848

4949
private final Predicate<BeanInfo> predicate;
50+
private final Set<String> classNames;
5051

5152
public UnremovableBeanBuildItem(Predicate<BeanInfo> predicate) {
5253
this.predicate = predicate;
54+
this.classNames = Collections.emptySet();
55+
}
56+
57+
public UnremovableBeanBuildItem(BeanClassNameExclusion predicate) {
58+
this.predicate = predicate;
59+
this.classNames = Collections.singleton(predicate.className);
60+
}
61+
62+
public UnremovableBeanBuildItem(BeanClassNamesExclusion predicate) {
63+
this.predicate = predicate;
64+
this.classNames = predicate.classNames;
65+
}
66+
67+
public UnremovableBeanBuildItem(BeanTypeExclusion predicate) {
68+
this.predicate = predicate;
69+
this.classNames = Collections.singleton(predicate.dotName.toString());
70+
}
71+
72+
public UnremovableBeanBuildItem(BeanTypesExclusion predicate) {
73+
this.predicate = predicate;
74+
this.classNames = predicate.dotNames.stream().map(DotName::toString).collect(Collectors.toSet());
5375
}
5476

5577
public Predicate<BeanInfo> getPredicate() {
5678
return predicate;
5779
}
5880

81+
public Set<String> getClassNames() {
82+
return classNames;
83+
}
84+
5985
/**
6086
* Match beans whose bean class matches any of the specified class names.
6187
*

integration-tests/test-extension/extension/deployment/src/main/java/io/quarkus/extest/deployment/TestProcessor.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
3333
import io.quarkus.arc.deployment.BeanContainerBuildItem;
3434
import io.quarkus.arc.deployment.ConfigPropertyBuildItem;
35+
import io.quarkus.arc.deployment.UnremovableBeanBuildItem;
3536
import io.quarkus.deployment.annotations.BuildProducer;
3637
import io.quarkus.deployment.annotations.BuildStep;
3738
import io.quarkus.deployment.annotations.Record;
@@ -62,6 +63,7 @@
6263
import io.quarkus.extest.runtime.config.TestMappingBuildTime;
6364
import io.quarkus.extest.runtime.config.TestMappingBuildTimeRunTime;
6465
import io.quarkus.extest.runtime.config.TestMappingRunTime;
66+
import io.quarkus.extest.runtime.config.UnremovableMappingFromBuildItem;
6567
import io.quarkus.extest.runtime.config.XmlConfig;
6668
import io.quarkus.extest.runtime.logging.AdditionalLogHandlerValueFactory;
6769
import io.quarkus.extest.runtime.runtimeinitializedpackage.RuntimeInitializedClass;
@@ -475,6 +477,11 @@ void runTimeConfigBuilder(BuildProducer<RunTimeConfigBuilderBuildItem> configBui
475477
configBuilders.produce(new RunTimeConfigBuilderBuildItem(RunTimeConfigBuilder.class.getName()));
476478
}
477479

480+
@BuildStep
481+
void unremoveableBeans(BuildProducer<UnremovableBeanBuildItem> unremovableBeans) {
482+
unremovableBeans.produce(UnremovableBeanBuildItem.beanTypes(UnremovableMappingFromBuildItem.class));
483+
}
484+
478485
@BuildStep(onlyIf = Never.class)
479486
void neverRunThisOne() {
480487
throw new IllegalStateException("Not supposed to run!");

integration-tests/test-extension/extension/deployment/src/main/resources/application.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,3 +184,5 @@ my.prefix.bt.nested.oov=nested-1234+nested-5678
184184

185185
another.another-prefix.prop=5678
186186
another.another-prefix.map.prop=5678
187+
188+
unremoveable.value=1234
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.quarkus.config;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import javax.inject.Inject;
6+
7+
import org.junit.jupiter.api.Test;
8+
import org.junit.jupiter.api.extension.RegisterExtension;
9+
10+
import io.quarkus.extest.runtime.config.UnremovableMappingFromBuildItem;
11+
import io.quarkus.test.QuarkusUnitTest;
12+
import io.smallrye.config.SmallRyeConfig;
13+
14+
public class UnremoveableConfigMappingTest {
15+
@RegisterExtension
16+
static final QuarkusUnitTest TEST = new QuarkusUnitTest()
17+
.withApplicationRoot((jar) -> jar
18+
.addClass(UnremovableMappingFromBuildItem.class));
19+
20+
@Inject
21+
SmallRyeConfig config;
22+
23+
@Test
24+
void unremoveableMapping() {
25+
UnremovableMappingFromBuildItem mapping = config.getConfigMapping(UnremovableMappingFromBuildItem.class);
26+
assertEquals("1234", mapping.value());
27+
}
28+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package io.quarkus.extest.runtime.config;
2+
3+
import io.smallrye.config.ConfigMapping;
4+
5+
@ConfigMapping(prefix = "unremoveable")
6+
public interface UnremovableMappingFromBuildItem {
7+
String value();
8+
}

0 commit comments

Comments
 (0)