Skip to content

Commit e649d18

Browse files
committed
Do not remove unused Mappings with Validator annotations
1 parent f9d0cfc commit e649d18

File tree

5 files changed

+41
-56
lines changed

5 files changed

+41
-56
lines changed

core/deployment/src/main/java/io/quarkus/deployment/configuration/ConfigMappingUtils.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import io.quarkus.deployment.builditem.nativeimage.ReflectiveMethodBuildItem;
2727
import io.quarkus.deployment.util.ReflectUtil;
2828
import io.quarkus.hibernate.validator.spi.AdditionalConstrainedClassBuildItem;
29+
import io.quarkus.runtime.annotations.ConfigRoot;
2930
import io.smallrye.config.ConfigMapping;
3031
import io.smallrye.config.ConfigMappingInterface;
3132
import io.smallrye.config.ConfigMappingInterface.LeafProperty;
@@ -36,12 +37,14 @@
3637
import io.smallrye.config.ConfigMappings.ConfigClass;
3738

3839
public class ConfigMappingUtils {
39-
4040
public static final DotName CONFIG_MAPPING_NAME = DotName.createSimple(ConfigMapping.class.getName());
41+
public static final DotName CONFIG_ROOT_NAME = DotName.createSimple(ConfigRoot.class.getName());
4142

4243
private ConfigMappingUtils() {
44+
throw new UnsupportedOperationException();
4345
}
4446

47+
// Used for application Mappings and MP ConfigProperties
4548
public static void processConfigClasses(
4649
CombinedIndexBuildItem combinedIndex,
4750
BuildProducer<GeneratedClassBuildItem> generatedClasses,
@@ -59,6 +62,11 @@ public static void processConfigClasses(
5962
continue;
6063
}
6164

65+
// Skip roots
66+
if (target.hasAnnotation(CONFIG_ROOT_NAME)) {
67+
continue;
68+
}
69+
6270
Class<?> configClass = toClass(target.asClass().name());
6371
String prefix = Optional.ofNullable(annotationPrefix).map(AnnotationValue::asString).orElse("");
6472
Kind configClassKind = getConfigClassType(instance);
@@ -102,7 +110,7 @@ private static void processConfigClass(
102110
BuildProducer<ConfigClassBuildItem> configClasses,
103111
BuildProducer<AdditionalConstrainedClassBuildItem> additionalConstrainedClasses) {
104112

105-
Class<?> configClass = configClassWithPrefix.getKlass();
113+
Class<?> configClass = configClassWithPrefix.getType();
106114
String prefix = configClassWithPrefix.getPrefix();
107115

108116
List<ConfigMappingMetadata> configMappingsMetadata = ConfigMappingLoader.getConfigMappingsMetadata(configClass);

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

Lines changed: 21 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -276,34 +276,18 @@ void generateConfigProperties(
276276
void registerConfigMappingsBean(
277277
BeanRegistrationPhaseBuildItem beanRegistration,
278278
List<ConfigClassBuildItem> configClasses,
279-
CombinedIndexBuildItem combinedIndex,
280279
BuildProducer<BeanConfiguratorBuildItem> beanConfigurator) {
281280

282281
if (configClasses.isEmpty()) {
283282
return;
284283
}
285284

286-
Set<ConfigClassBuildItem> configMappings = new HashSet<>();
287-
288-
// Add beans for all unremovable mappings
285+
// Generate the mappings beans
289286
for (ConfigClassBuildItem configClass : configClasses) {
290-
if (configClass.getConfigClass().isAnnotationPresent(Unremovable.class)) {
291-
configMappings.add(configClass);
292-
}
293-
}
294-
295-
// Add beans for all injection points
296-
Map<Type, ConfigClassBuildItem> configMappingTypes = configClassesToTypesMap(configClasses, MAPPING);
297-
for (InjectionPointInfo injectionPoint : beanRegistration.getInjectionPoints()) {
298-
Type type = Type.create(injectionPoint.getRequiredType().name(), Type.Kind.CLASS);
299-
ConfigClassBuildItem configClass = configMappingTypes.get(type);
300-
if (configClass != null) {
301-
configMappings.add(configClass);
287+
if (!configClass.isMapping()) {
288+
continue;
302289
}
303-
}
304290

305-
// Generate the mappings beans
306-
for (ConfigClassBuildItem configClass : configMappings) {
307291
BeanConfigurator<Object> bean = beanRegistration.getContext()
308292
.configure(configClass.getConfigClass())
309293
.types(configClass.getTypes().toArray(new Type[] {}))
@@ -324,41 +308,35 @@ void registerConfigMappingsBean(
324308
void registerConfigPropertiesBean(
325309
BeanRegistrationPhaseBuildItem beanRegistration,
326310
List<ConfigClassBuildItem> configClasses,
327-
CombinedIndexBuildItem combinedIndex,
328311
BuildProducer<BeanConfiguratorBuildItem> beanConfigurator) {
329312

330313
if (configClasses.isEmpty()) {
331314
return;
332315
}
333316

334-
Map<Type, ConfigClassBuildItem> configPropertiesTypes = configClassesToTypesMap(configClasses, PROPERTIES);
335-
Set<ConfigClassBuildItem> configProperties = new HashSet<>();
336-
for (InjectionPointInfo injectionPoint : beanRegistration.getInjectionPoints()) {
337-
AnnotationInstance instance = injectionPoint.getRequiredQualifier(MP_CONFIG_PROPERTIES_NAME);
338-
if (instance == null) {
317+
// Generate the mappings beans
318+
for (ConfigClassBuildItem configClass : configClasses) {
319+
if (!configClass.isProperties()) {
339320
continue;
340321
}
341322

342-
Type type = Type.create(injectionPoint.getRequiredType().name(), Type.Kind.CLASS);
343-
ConfigClassBuildItem configClass = configPropertiesTypes.get(type);
344-
if (configClass != null) {
345-
configProperties.add(configClass);
323+
BeanConfigurator<Object> bean = beanRegistration.getContext()
324+
.configure(configClass.getConfigClass())
325+
.types(configClass.getTypes().toArray(new Type[] {}))
326+
.addQualifier(create(MP_CONFIG_PROPERTIES_NAME, null,
327+
new AnnotationValue[] {
328+
createStringValue("prefix", configClass.getPrefix())
329+
}))
330+
.creator(ConfigMappingCreator.class)
331+
.addInjectionPoint(ClassType.create(DotNames.INJECTION_POINT))
332+
.param("type", configClass.getConfigClass())
333+
.param("prefix", configClass.getPrefix());
334+
335+
if (configClass.getConfigClass().isAnnotationPresent(Unremovable.class)) {
336+
bean.unremovable();
346337
}
347-
}
348338

349-
for (ConfigClassBuildItem configClass : configProperties) {
350-
beanConfigurator.produce(new BeanConfiguratorBuildItem(
351-
beanRegistration.getContext()
352-
.configure(configClass.getConfigClass())
353-
.types(configClass.getTypes().toArray(new Type[] {}))
354-
.addQualifier(create(MP_CONFIG_PROPERTIES_NAME, null,
355-
new AnnotationValue[] {
356-
createStringValue("prefix", configClass.getPrefix())
357-
}))
358-
.creator(ConfigMappingCreator.class)
359-
.addInjectionPoint(ClassType.create(DotNames.INJECTION_POINT))
360-
.param("type", configClass.getConfigClass())
361-
.param("prefix", configClass.getPrefix())));
339+
beanConfigurator.produce(new BeanConfiguratorBuildItem(bean));
362340
}
363341
}
364342

extensions/arc/deployment/src/test/java/io/quarkus/arc/test/config/UnremovedConfigMappingTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ void unremoved() {
3535
mapping = CDI.current().select(UnremovedConfigMapping.class).get();
3636
assertEquals("1234", mapping.prop());
3737

38-
UnremovedConfigProperties properties = CDI.current().select(UnremovedConfigProperties.class).get();
38+
UnremovedConfigProperties properties = CDI.current()
39+
.select(UnremovedConfigProperties.class, ConfigProperties.Literal.of("mapping")).get();
3940
assertEquals("1234", properties.prop);
4041
}
4142

extensions/hibernate-validator/deployment/src/main/java/io/quarkus/hibernate/validator/deployment/HibernateValidatorProcessor.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ void configValidator(
249249
CombinedIndexBuildItem combinedIndex,
250250
List<ConfigClassBuildItem> configClasses,
251251
BeanValidationAnnotationsBuildItem beanValidationAnnotations,
252+
BuildProducer<UnremovableBeanBuildItem> unremovableBeans,
252253
BuildProducer<GeneratedClassBuildItem> generatedClass,
253254
BuildProducer<GeneratedResourceBuildItem> generatedResource,
254255
BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
@@ -327,11 +328,13 @@ void configValidator(
327328
continue;
328329
}
329330

330-
embeddingMap.get(constrainedConfigMapping).values().stream()
331-
.map(c -> c.getConfigComponentInterfaces())
332-
.flatMap(Collection::stream)
333-
.map(DotName::createSimple)
334-
.forEach(configComponentsInterfacesToRegisterForReflection::add);
331+
for (ConfigClassBuildItem configClass : embeddingMap.get(constrainedConfigMapping).values()) {
332+
unremovableBeans.produce(UnremovableBeanBuildItem.beanTypes(configClass.getConfigClass()));
333+
configClass.getConfigComponentInterfaces()
334+
.stream()
335+
.map(DotName::createSimple)
336+
.forEach(configComponentsInterfacesToRegisterForReflection::add);
337+
}
335338
}
336339
reflectiveClass.produce(ReflectiveClassBuildItem
337340
.builder(configComponentsInterfacesToRegisterForReflection.stream().map(DotName::toString)

extensions/hibernate-validator/deployment/src/test/java/io/quarkus/hibernate/validator/test/config/ConfigMappingInvalidTest.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import org.junit.jupiter.api.Test;
3131
import org.junit.jupiter.api.extension.RegisterExtension;
3232

33-
import io.quarkus.arc.Unremovable;
3433
import io.quarkus.runtime.configuration.DurationConverter;
3534
import io.quarkus.test.QuarkusUnitTest;
3635
import io.smallrye.config.ConfigMapping;
@@ -73,7 +72,6 @@ void invalid() {
7372
fail();
7473
}
7574

76-
@Unremovable
7775
@ConfigMapping(prefix = "validator.server")
7876
public interface Server {
7977
@Max(3)
@@ -87,21 +85,18 @@ public interface Parent {
8785
Integer number();
8886
}
8987

90-
@Unremovable
9188
@ConfigMapping(prefix = "validator.hierarchy")
9289
public interface Child extends Parent {
9390

9491
}
9592

96-
@Unremovable
9793
@ConfigMapping(prefix = "validator.repeatable")
9894
public interface Repeatable {
9995
@Size(max = 10)
10096
@Size(min = 2)
10197
String name();
10298
}
10399

104-
@Unremovable
105100
@ConfigMapping(prefix = "cloud")
106101
@Prod
107102
public interface Cloud {

0 commit comments

Comments
 (0)