Skip to content

Commit d59d0a1

Browse files
authored
Merge pull request #50745 from radcortez/fix-50652
Record runtime configuration in its own ConfigSource
2 parents d714c58 + 72cab0e commit d59d0a1

File tree

12 files changed

+106
-104
lines changed

12 files changed

+106
-104
lines changed

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

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,6 @@ final class ReadOperation {
217217
final ConfigTrackingInterceptor buildConfigTracker;
218218
final Map<String, ConfigValue> allBuildTimeValues = new TreeMap<>();
219219
final Map<String, ConfigValue> buildTimeRunTimeValues = new TreeMap<>();
220-
final Map<String, ConfigValue> runTimeDefaultValues = new TreeMap<>();
221220
final Map<String, ConfigValue> runTimeValues = new TreeMap<>();
222221

223222
ReadOperation(final SmallRyeConfig config, ConfigTrackingInterceptor buildConfigTracker) {
@@ -334,7 +333,6 @@ public void accept(final ConfigSource buildSystem) {
334333
return new ReadResult.Builder()
335334
.setAllBuildTimeValues(allBuildTimeValues)
336335
.setBuildTimeRunTimeValues(filterActiveProfileProperties(buildTimeRunTimeValues))
337-
.setRunTimeDefaultValues(filterActiveProfileProperties(runTimeDefaultValues))
338336
.setRuntimeValues(runTimeValues)
339337
.setBuildTimeMappings(buildTimeMappings)
340338
.setBuildTimeRunTimeMappings(buildTimeRunTimeMappings)
@@ -540,7 +538,6 @@ private static Map<PropertyName, String> mappingsToNames(final List<ConfigClass>
540538
public static final class ReadResult {
541539
final Map<String, ConfigValue> allBuildTimeValues;
542540
final Map<String, ConfigValue> buildTimeRunTimeValues;
543-
final Map<String, ConfigValue> runTimeDefaultValues;
544541
final Map<String, ConfigValue> runTimeValues;
545542

546543
final List<ConfigClass> buildTimeMappings;
@@ -556,7 +553,6 @@ public static final class ReadResult {
556553
public ReadResult(final Builder builder) {
557554
this.allBuildTimeValues = builder.getAllBuildTimeValues();
558555
this.buildTimeRunTimeValues = builder.getBuildTimeRunTimeValues();
559-
this.runTimeDefaultValues = builder.getRunTimeDefaultValues();
560556
this.runTimeValues = builder.getRuntimeValues();
561557

562558
this.buildTimeMappings = builder.getBuildTimeMappings();
@@ -593,10 +589,6 @@ public Map<String, ConfigValue> getBuildTimeRunTimeValues() {
593589
return buildTimeRunTimeValues;
594590
}
595591

596-
public Map<String, ConfigValue> getRunTimeDefaultValues() {
597-
return runTimeDefaultValues;
598-
}
599-
600592
public Map<String, ConfigValue> getRunTimeValues() {
601593
return runTimeValues;
602594
}
@@ -636,7 +628,6 @@ public ConfigTrackingInterceptor.ReadOptionsProvider getReadOptionsProvider() {
636628
static class Builder {
637629
private Map<String, ConfigValue> allBuildTimeValues;
638630
private Map<String, ConfigValue> buildTimeRunTimeValues;
639-
private Map<String, ConfigValue> runTimeDefaultValues;
640631
private Map<String, ConfigValue> runtimeValues;
641632
private List<ConfigClass> buildTimeMappings;
642633
private List<ConfigClass> buildTimeRunTimeMappings;
@@ -663,15 +654,6 @@ Builder setBuildTimeRunTimeValues(final Map<String, ConfigValue> buildTimeRunTim
663654
return this;
664655
}
665656

666-
Map<String, ConfigValue> getRunTimeDefaultValues() {
667-
return runTimeDefaultValues;
668-
}
669-
670-
Builder setRunTimeDefaultValues(final Map<String, ConfigValue> runTimeDefaultValues) {
671-
this.runTimeDefaultValues = runTimeDefaultValues;
672-
return this;
673-
}
674-
675657
Map<String, ConfigValue> getRuntimeValues() {
676658
return runtimeValues;
677659
}

core/deployment/src/main/java/io/quarkus/deployment/steps/ConfigGenerationBuildStep.java

Lines changed: 36 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import static io.quarkus.deployment.util.ServiceUtil.classNamesNamedIn;
1010
import static io.smallrye.config.SmallRyeConfig.SMALLRYE_CONFIG_LOCATIONS;
1111
import static java.util.stream.Collectors.toSet;
12+
import static org.objectweb.asm.Opcodes.ACC_STATIC;
1213

1314
import java.io.Closeable;
1415
import java.io.IOException;
@@ -24,6 +25,7 @@
2425
import java.util.LinkedHashSet;
2526
import java.util.List;
2627
import java.util.Map;
28+
import java.util.Map.Entry;
2729
import java.util.Objects;
2830
import java.util.Optional;
2931
import java.util.Set;
@@ -110,7 +112,6 @@
110112
import io.smallrye.config.ConfigSourceInterceptorFactory;
111113
import io.smallrye.config.ConfigValue;
112114
import io.smallrye.config.DefaultValuesConfigSource;
113-
import io.smallrye.config.ProfileConfigSourceInterceptor;
114115
import io.smallrye.config.SecretKeysHandler;
115116
import io.smallrye.config.SecretKeysHandlerFactory;
116117
import io.smallrye.config.SmallRyeConfig;
@@ -148,10 +149,10 @@ void buildTimeRunTimeConfig(
148149
.build()) {
149150

150151
FieldDescriptor source = FieldDescriptor.of(classCreator.getClassName(), "source", ConfigSource.class);
151-
classCreator.getFieldCreator(source).setModifiers(Opcodes.ACC_STATIC | Opcodes.ACC_FINAL);
152+
classCreator.getFieldCreator(source).setModifiers(ACC_STATIC | Opcodes.ACC_FINAL);
152153

153154
MethodCreator clinit = classCreator.getMethodCreator("<clinit>", void.class);
154-
clinit.setModifiers(Opcodes.ACC_STATIC);
155+
clinit.setModifiers(ACC_STATIC);
155156

156157
ResultHandle map = clinit.newInstance(MethodDescriptor.ofConstructor(HashMap.class));
157158
MethodDescriptor put = MethodDescriptor.ofMethod(Map.class, "put", Object.class, Object.class, Object.class);
@@ -239,30 +240,9 @@ void generateBuilders(
239240
BuildProducer<ReflectiveClassBuildItem> reflectiveClass) throws Exception {
240241

241242
Map<String, String> defaultValues = new HashMap<>();
242-
// Default values from @ConfigRoot
243-
for (Map.Entry<String, ConfigValue> entry : configItem.getReadResult().getRunTimeDefaultValues().entrySet()) {
244-
defaultValues.put(entry.getKey(), entry.getValue().getRawValue());
245-
}
246-
// Default values from build item RunTimeConfigurationDefaultBuildItem override
247243
for (RunTimeConfigurationDefaultBuildItem e : runTimeDefaults) {
248244
defaultValues.put(e.getKey(), e.getValue());
249245
}
250-
// Recorded values from build time from any other source (higher ordinal then defaults, so override)
251-
SmallRyeConfig config = ConfigProvider.getConfig().unwrap(SmallRyeConfig.class);
252-
List<String> profiles = config.getProfiles();
253-
for (Map.Entry<String, ConfigValue> entry : configItem.getReadResult().getRunTimeValues().entrySet()) {
254-
if (DefaultValuesConfigSource.NAME.equals(entry.getValue().getConfigSourceName())) {
255-
continue;
256-
}
257-
// Runtime values may contain active profiled names that override sames names in defaults
258-
// We need to keep the original name definition in case a different profile is used to run the app
259-
String activeName = ProfileConfigSourceInterceptor.activeName(entry.getKey(), profiles);
260-
// But keep the default
261-
if (!configItem.getReadResult().getRunTimeDefaultValues().containsKey(activeName)) {
262-
defaultValues.remove(activeName);
263-
}
264-
defaultValues.put(entry.getKey(), entry.getValue().getRawValue());
265-
}
266246

267247
Set<String> converters = discoverService(Converter.class, reflectiveClass);
268248
Set<String> interceptors = discoverService(ConfigSourceInterceptor.class, reflectiveClass);
@@ -303,6 +283,7 @@ void generateBuilders(
303283
combinedIndex,
304284
sharedFields,
305285
defaultValues,
286+
Map.of(),
306287
converters,
307288
interceptors,
308289
staticSafeServices(interceptorFactories),
@@ -319,6 +300,10 @@ void generateBuilders(
319300
reflectiveClass.produce(ReflectiveClassBuildItem.builder(CONFIG_STATIC_NAME).build());
320301

321302
// For RunTime Config
303+
Map<String, String> runtimeValues = new HashMap<>();
304+
for (Entry<String, ConfigValue> entry : configItem.getReadResult().getRunTimeValues().entrySet()) {
305+
runtimeValues.put(entry.getKey(), entry.getValue().getRawValue());
306+
}
322307
Set<ConfigClass> runTimeMappings = new LinkedHashSet<>();
323308
runTimeMappings.addAll(runtimeConfigMappings(configMappings));
324309
runTimeMappings.addAll(configItem.getReadResult().getBuildTimeRunTimeMappings());
@@ -331,6 +316,7 @@ void generateBuilders(
331316
combinedIndex,
332317
sharedFields,
333318
defaultValues,
319+
runtimeValues,
334320
converters,
335321
interceptors,
336322
interceptorFactories,
@@ -609,6 +595,9 @@ private static String getPathWithoutExtension(Path path) {
609595
private static final MethodDescriptor WITH_DEFAULTS = MethodDescriptor.ofMethod(AbstractConfigBuilder.class,
610596
"withDefaultValues",
611597
void.class, SmallRyeConfigBuilder.class, Map.class);
598+
private static final MethodDescriptor WITH_RUNTIME_VALUES = MethodDescriptor.ofMethod(AbstractConfigBuilder.class,
599+
"withRuntimeValues",
600+
void.class, SmallRyeConfigBuilder.class, Map.class);
612601
private static final MethodDescriptor WITH_CONVERTER = MethodDescriptor.ofMethod(AbstractConfigBuilder.class,
613602
"withConverter",
614603
void.class, SmallRyeConfigBuilder.class, String.class, int.class, Converter.class);
@@ -654,6 +643,10 @@ private static String getPathWithoutExtension(Path path) {
654643
private static final MethodDescriptor ENSURE_LOADED = MethodDescriptor.ofMethod(AbstractConfigBuilder.class,
655644
"ensureLoaded",
656645
void.class, String.class);
646+
private static final MethodDescriptor MAP_NEW = MethodDescriptor.ofConstructor(HashMap.class, int.class);
647+
private static final MethodDescriptor MAP_PUT = MethodDescriptor.ofMethod(HashMap.class,
648+
"put",
649+
Object.class, Object.class, Object.class);
657650

658651
private static final DotName CONVERTER_NAME = DotName.createSimple(Converter.class.getName());
659652
private static final DotName PRIORITY_NAME = DotName.createSimple(Priority.class.getName());
@@ -672,21 +665,21 @@ private static Map<Object, FieldDescriptor> generateSharedConfig(
672665
.build()) {
673666

674667
MethodCreator clinit = classCreator.getMethodCreator("<clinit>", void.class);
675-
clinit.setModifiers(Opcodes.ACC_STATIC);
668+
clinit.setModifiers(ACC_STATIC);
676669

677670
int converterIndex = 0;
678671
for (String converter : converters) {
679672
String fieldName = "conv$" + converterIndex++;
680673
FieldDescriptor converterField = classCreator.getFieldCreator(fieldName, Converter.class)
681-
.setModifiers(Opcodes.ACC_STATIC).getFieldDescriptor();
674+
.setModifiers(ACC_STATIC).getFieldDescriptor();
682675
clinit.writeStaticField(converterField, clinit.newInstance(MethodDescriptor.ofConstructor(converter)));
683676
fields.put(converter, converterField);
684677
}
685678

686679
int mappingIndex = 0;
687680
for (ConfigClass mapping : mappings) {
688681
FieldDescriptor mappingField = classCreator.getFieldCreator("mapping$" + mappingIndex++, ConfigClass.class)
689-
.setModifiers(Opcodes.ACC_STATIC).getFieldDescriptor();
682+
.setModifiers(ACC_STATIC).getFieldDescriptor();
690683
clinit.writeStaticField(mappingField, clinit.invokeStaticMethod(CONFIG_CLASS,
691684
clinit.load(mapping.getType().getName()), clinit.load(mapping.getPrefix())));
692685

@@ -713,6 +706,7 @@ private static void generateConfigBuilder(
713706
CombinedIndexBuildItem combinedIndex,
714707
Map<Object, FieldDescriptor> sharedFields,
715708
Map<String, String> defaultValues,
709+
Map<String, String> runtimeValues,
716710
Set<String> converters,
717711
Set<String> interceptors,
718712
Set<String> interceptorFactories,
@@ -737,22 +731,31 @@ private static void generateConfigBuilder(
737731
.build()) {
738732

739733
MethodCreator clinit = classCreator.getMethodCreator("<clinit>", void.class);
740-
clinit.setModifiers(Opcodes.ACC_STATIC);
734+
clinit.setModifiers(ACC_STATIC);
741735

742736
MethodCreator method = classCreator.getMethodCreator(BUILDER_CUSTOMIZER);
743737
ResultHandle configBuilder = method.getMethodParam(0);
744738

745-
FieldDescriptor defaultsField = classCreator.getFieldCreator("defaults", Map.class).setModifiers(Opcodes.ACC_STATIC)
739+
FieldDescriptor defaultsField = classCreator.getFieldCreator("defaults", Map.class).setModifiers(ACC_STATIC)
746740
.getFieldDescriptor();
747-
clinit.writeStaticField(defaultsField, clinit.newInstance(MethodDescriptor.ofConstructor(HashMap.class, int.class),
748-
clinit.load((int) ((float) defaultValues.size() / 0.75f + 1.0f))));
749-
MethodDescriptor put = MethodDescriptor.ofMethod(HashMap.class, "put", Object.class, Object.class, Object.class);
741+
clinit.writeStaticField(defaultsField,
742+
clinit.newInstance(MAP_NEW, clinit.load((int) ((float) defaultValues.size() / 0.75f + 1.0f))));
750743
for (Map.Entry<String, String> entry : defaultValues.entrySet()) {
751-
clinit.invokeVirtualMethod(put, clinit.readStaticField(defaultsField), clinit.load(entry.getKey()),
744+
clinit.invokeVirtualMethod(MAP_PUT, clinit.readStaticField(defaultsField), clinit.load(entry.getKey()),
752745
clinit.load(entry.getValue()));
753746
}
754747
method.invokeStaticMethod(WITH_DEFAULTS, configBuilder, method.readStaticField(defaultsField));
755748

749+
FieldDescriptor runtimeValuesField = classCreator.getFieldCreator("runtimeValues", Map.class)
750+
.setModifiers(ACC_STATIC).getFieldDescriptor();
751+
clinit.writeStaticField(runtimeValuesField,
752+
clinit.newInstance(MAP_NEW, clinit.load((int) ((float) runtimeValues.size() / 0.75f + 1.0f))));
753+
for (Map.Entry<String, String> entry : runtimeValues.entrySet()) {
754+
clinit.invokeVirtualMethod(MAP_PUT, clinit.readStaticField(runtimeValuesField), clinit.load(entry.getKey()),
755+
clinit.load(entry.getValue()));
756+
}
757+
method.invokeStaticMethod(WITH_RUNTIME_VALUES, configBuilder, method.readStaticField(runtimeValuesField));
758+
756759
for (String converter : converters) {
757760
ClassInfo converterClass = combinedIndex.getComputingIndex().getClassByName(converter);
758761
Type type = getConverterType(converterClass, combinedIndex);

core/runtime/src/main/java/io/quarkus/runtime/configuration/AbstractConfigBuilder.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import io.smallrye.config.SmallRyeConfig;
1818
import io.smallrye.config.SmallRyeConfigBuilder;
1919
import io.smallrye.config.SmallRyeConfigBuilderCustomizer;
20+
import io.smallrye.config.common.MapBackedConfigSource;
2021

2122
/**
2223
* Convenience helper to generate the {@link SmallRyeConfigBuilderCustomizer} bytecode, by wrapping methods that
@@ -28,6 +29,11 @@ protected static void withDefaultValues(SmallRyeConfigBuilder builder, Map<Strin
2829
builder.withDefaultValues(values);
2930
}
3031

32+
protected static void withRuntimeValues(SmallRyeConfigBuilder builder, Map<String, String> values) {
33+
builder.withSources(new MapBackedConfigSource("Runtime Values", values, 0) {
34+
});
35+
}
36+
3137
@SuppressWarnings("unchecked")
3238
protected static <T> void withConverter(SmallRyeConfigBuilder builder, String type, int priority, Converter<T> converter) {
3339
try {

extensions/picocli/deployment/src/test/java/io/quarkus/picocli/deployment/AvailableConfigSourcesTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public class AvailableConfigSourcesTest {
2727
void sources() {
2828
ConfigValue value = config.getConfigValue("my.prop");
2929
assertEquals("1234", value.getValue());
30-
assertEquals("DefaultValuesConfigSource", value.getConfigSourceName());
30+
assertEquals("Runtime Values", value.getConfigSourceName());
3131

3232
for (final ConfigSource configSource : config.getConfigSources()) {
3333
if (configSource.getName().contains("application.properties")) {

extensions/resteasy-classic/rest-client-config/runtime/src/main/java/io/quarkus/restclient/config/AbstractRestClientConfigBuilder.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,10 @@ private record MicroProfileFallbacks(Map<String, String> names) implements Funct
277277
public String apply(final String name) {
278278
int indexOfRestClient = indexOfRestClient(name);
279279
if (indexOfRestClient != -1) {
280+
int disableDefaultMapper = name.indexOf(".disable-default-mapper", indexOfRestClient);
281+
if (disableDefaultMapper != -1) {
282+
return "microprofile.rest.client.disable.default.mapper";
283+
}
280284
for (Map.Entry<String, String> entry : names.entrySet()) {
281285
String original = entry.getKey();
282286
String target = entry.getValue();

extensions/resteasy-classic/rest-client-config/runtime/src/main/java/io/quarkus/restclient/config/RestClientsConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -675,7 +675,7 @@ default Optional<String> uriReload() {
675675
* <p>
676676
* This property is not applicable to the RESTEasy Client.
677677
*/
678-
@WithDefault("${microprofile.rest.client.disable.default.mapper:false}")
678+
@WithDefault("false")
679679
Boolean disableDefaultMapper();
680680

681681
/**

extensions/resteasy-classic/rest-client-config/runtime/src/test/java/io/quarkus/restclient/config/RestClientConfigTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import java.math.BigInteger;
99
import java.util.List;
10+
import java.util.Map;
1011

1112
import org.eclipse.microprofile.rest.client.ext.QueryParamStyle;
1213
import org.junit.jupiter.api.Test;
@@ -16,6 +17,7 @@
1617
import io.quarkus.restclient.config.key.SharedThreeConfigKeyRestClient;
1718
import io.quarkus.restclient.config.key.SharedTwoConfigKeyRestClient;
1819
import io.quarkus.runtime.configuration.ConfigUtils;
20+
import io.smallrye.config.PropertiesConfigSource;
1921
import io.smallrye.config.SmallRyeConfig;
2022
import io.smallrye.config.SmallRyeConfigBuilder;
2123
import io.smallrye.config.SmallRyeConfigBuilderCustomizer;
@@ -69,6 +71,7 @@ public List<RegisteredRestClient> getRestClients() {
6971
assertEquals(1, restClientsConfig.clients().size());
7072
assertTrue(restClientsConfig.clients().containsKey(ConfigKeyRestClient.class.getName()));
7173
verifyConfig(restClientsConfig.getClient(ConfigKeyRestClient.class));
74+
assertTrue(restClientsConfig.getClient(ConfigKeyRestClient.class).disableDefaultMapper());
7275
}
7376

7477
@Test
@@ -125,6 +128,7 @@ public List<RegisteredRestClient> getRestClients() {
125128
}.configBuilder(builder);
126129
}
127130
})
131+
.withSources(new PropertiesConfigSource(Map.of("microprofile.rest.client.disable.default.mapper", "true"), ""))
128132
.build();
129133

130134
RestClientsConfig restClientsConfig = config.getConfigMapping(RestClientsConfig.class);
@@ -147,6 +151,7 @@ public List<RegisteredRestClient> getRestClients() {
147151
assertTrue(clientConfig.proxyAddress().isPresent());
148152
assertTrue(clientConfig.queryParamStyle().isPresent());
149153
assertThat(clientConfig.queryParamStyle().get()).isEqualTo(QueryParamStyle.COMMA_SEPARATED);
154+
assertThat(clientConfig.disableDefaultMapper()).isTrue();
150155
}
151156

152157
@Test

extensions/resteasy-classic/rest-client-config/runtime/src/test/resources/application.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ quarkus.rest-client.key.hostname-verifier=io.quarkus.restclient.configuration.My
2929
quarkus.rest-client.key.connection-ttl=30000
3030
quarkus.rest-client.key.connection-pool-size=10
3131
quarkus.rest-client.key.max-chunk-size=1024
32+
quarkus.rest-client.key.disable-default-mapper=true
3233

3334
quarkus.rest-client."io.quarkus.restclient.config.MPRestClient".url=http://localhost:8080
3435
io.quarkus.restclient.config.MPRestClient/mp-rest/url=http://localhost:8081

0 commit comments

Comments
 (0)