1
1
package io .quarkus .deployment .configuration ;
2
2
3
+ import static io .quarkus .bootstrap .classloading .QuarkusClassLoader .isApplicationClass ;
3
4
import static io .smallrye .config .ConfigMappings .ConfigClass .configClass ;
4
5
import static org .jboss .jandex .AnnotationTarget .Kind .CLASS ;
5
6
21
22
import io .quarkus .deployment .builditem .CombinedIndexBuildItem ;
22
23
import io .quarkus .deployment .builditem .ConfigClassBuildItem ;
23
24
import io .quarkus .deployment .builditem .ConfigClassBuildItem .Kind ;
25
+ import io .quarkus .deployment .builditem .ConfigurationBuildItem ;
24
26
import io .quarkus .deployment .builditem .GeneratedClassBuildItem ;
25
27
import io .quarkus .deployment .builditem .nativeimage .ReflectiveClassBuildItem ;
26
28
import io .quarkus .deployment .builditem .nativeimage .ReflectiveMethodBuildItem ;
27
29
import io .quarkus .deployment .util .ReflectUtil ;
28
30
import io .quarkus .hibernate .validator .spi .AdditionalConstrainedClassBuildItem ;
29
- import io .quarkus .runtime .annotations .ConfigRoot ;
30
31
import io .smallrye .config .ConfigMapping ;
31
32
import io .smallrye .config .ConfigMappingInterface ;
32
33
import io .smallrye .config .ConfigMappingInterface .LeafProperty ;
38
39
39
40
public class ConfigMappingUtils {
40
41
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 ());
42
42
43
43
private ConfigMappingUtils () {
44
44
throw new UnsupportedOperationException ();
45
45
}
46
46
47
47
// Used for application Mappings and MP ConfigProperties
48
48
public static void processConfigClasses (
49
+ ConfigurationBuildItem configItem ,
49
50
CombinedIndexBuildItem combinedIndex ,
50
51
BuildProducer <GeneratedClassBuildItem > generatedClasses ,
51
52
BuildProducer <ReflectiveClassBuildItem > reflectiveClasses ,
@@ -62,27 +63,31 @@ public static void processConfigClasses(
62
63
continue ;
63
64
}
64
65
65
- // Skip roots
66
- if (target .hasAnnotation (CONFIG_ROOT_NAME )) {
66
+ // Ignore scanned classes from the processor.
67
+ // Usually they are not available in Jandex, but there are cases where extensions have jandex to their
68
+ // own classes, or user applications adding @ConfigRoot to generate documentation. In that case, it would
69
+ // generate duplicates.
70
+ ConfigClass configClass = configClass (
71
+ toClass (target .asClass ().name ()),
72
+ Optional .ofNullable (annotationPrefix ).map (AnnotationValue ::asString ).orElse ("" ));
73
+ if (configItem .getReadResult ().getAllMappingsByClass ().containsKey (configClass .getType ())) {
67
74
continue ;
68
75
}
69
-
70
- Class <?> configClass = toClass (target .asClass ().name ());
71
- String prefix = Optional .ofNullable (annotationPrefix ).map (AnnotationValue ::asString ).orElse ("" );
72
76
Kind configClassKind = getConfigClassType (instance );
73
- processConfigClass (configClass ( configClass , prefix ), configClassKind , true , combinedIndex ,
74
- generatedClasses , reflectiveClasses , reflectiveMethods , configClasses , additionalConstrainedClasses );
77
+ processConfigClass (configClass , configClassKind , combinedIndex , generatedClasses , reflectiveClasses ,
78
+ reflectiveMethods , configClasses , additionalConstrainedClasses );
75
79
}
76
80
}
77
81
78
82
public static void processConfigMapping (
83
+ ConfigurationBuildItem configItem ,
79
84
CombinedIndexBuildItem combinedIndex ,
80
85
BuildProducer <GeneratedClassBuildItem > generatedClasses ,
81
86
BuildProducer <ReflectiveClassBuildItem > reflectiveClasses ,
82
87
BuildProducer <ReflectiveMethodBuildItem > reflectiveMethods ,
83
88
BuildProducer <ConfigClassBuildItem > configClasses ,
84
89
BuildProducer <AdditionalConstrainedClassBuildItem > additionalConstrainedClasses ) {
85
- processConfigClasses (combinedIndex , generatedClasses , reflectiveClasses , reflectiveMethods , configClasses ,
90
+ processConfigClasses (configItem , combinedIndex , generatedClasses , reflectiveClasses , reflectiveMethods , configClasses ,
86
91
additionalConstrainedClasses , CONFIG_MAPPING_NAME );
87
92
}
88
93
@@ -95,14 +100,13 @@ public static void processExtensionConfigMapping(
95
100
BuildProducer <ConfigClassBuildItem > configClasses ,
96
101
BuildProducer <AdditionalConstrainedClassBuildItem > additionalConstrainedClasses ) {
97
102
98
- processConfigClass (configClass , Kind .MAPPING , false , combinedIndex , generatedClasses , reflectiveClasses ,
103
+ processConfigClass (configClass , Kind .MAPPING , combinedIndex , generatedClasses , reflectiveClasses ,
99
104
reflectiveMethods , configClasses , additionalConstrainedClasses );
100
105
}
101
106
102
107
private static void processConfigClass (
103
108
ConfigClass configClassWithPrefix ,
104
109
Kind configClassKind ,
105
- boolean isApplicationClass ,
106
110
CombinedIndexBuildItem combinedIndex ,
107
111
BuildProducer <GeneratedClassBuildItem > generatedClasses ,
108
112
BuildProducer <ReflectiveClassBuildItem > reflectiveClasses ,
@@ -121,7 +125,8 @@ private static void processConfigClass(
121
125
generatedClassesNames .add (mappingMetadata .getClassName ());
122
126
// This is the generated implementation of the mapping by SmallRye Config.
123
127
byte [] classBytes = mappingMetadata .getClassBytes ();
124
- generatedClasses .produce (new GeneratedClassBuildItem (isApplicationClass , mappingMetadata .getClassName (),
128
+ generatedClasses .produce (new GeneratedClassBuildItem (isApplicationClass (configClass .getName ()),
129
+ mappingMetadata .getClassName (),
125
130
classBytes ));
126
131
additionalConstrainedClasses .produce (AdditionalConstrainedClassBuildItem .of (mappingMetadata .getClassName (),
127
132
classBytes ));
0 commit comments