From 1ded5a33004a93f6e5a8f3816675364911429abc Mon Sep 17 00:00:00 2001 From: Roberto Cortez Date: Wed, 23 Jun 2021 13:13:17 +0100 Subject: [PATCH] Do not record Env values in the runtime defaults --- .../BuildTimeConfigurationReader.java | 29 ++++++++++++- .../src/main/resources/application.properties | 3 ++ .../quarkus/extest/RuntimeDefaultsTest.java | 42 +++++++++++++++++++ .../config/EnvBuildTimeConfigSource.java | 15 +++++++ 4 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 core/test-extension/deployment/src/test/java/io/quarkus/extest/RuntimeDefaultsTest.java create mode 100644 core/test-extension/runtime/src/main/java/io/quarkus/extest/runtime/config/EnvBuildTimeConfigSource.java diff --git a/core/deployment/src/main/java/io/quarkus/deployment/configuration/BuildTimeConfigurationReader.java b/core/deployment/src/main/java/io/quarkus/deployment/configuration/BuildTimeConfigurationReader.java index 9735c12eb8785..b9cbef757c818 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/configuration/BuildTimeConfigurationReader.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/configuration/BuildTimeConfigurationReader.java @@ -54,8 +54,10 @@ import io.quarkus.runtime.configuration.HyphenateEnumConverter; import io.quarkus.runtime.configuration.NameIterator; import io.smallrye.config.Converters; +import io.smallrye.config.EnvConfigSource; import io.smallrye.config.Expressions; import io.smallrye.config.SmallRyeConfig; +import io.smallrye.config.SmallRyeConfigBuilder; /** * A configuration reader. @@ -296,6 +298,7 @@ ReadResult run() { nameBuilder.setLength(len); } // sweep-up + SmallRyeConfig runtimeDefaultsConfig = getConfigForRuntimeDefaults(); for (String propertyName : getAllProperties()) { if (propertyName.equals(ConfigSource.CONFIG_ORDINAL)) { continue; @@ -380,12 +383,12 @@ ReadResult run() { if (matched != null) { // it's a specified run-time default (record for later) specifiedRunTimeDefaultValues.put(propertyName, Expressions.withoutExpansion( - () -> config.getOptionalValue(propertyName, String.class).orElse(""))); + () -> runtimeDefaultsConfig.getOptionalValue(propertyName, String.class).orElse(""))); } } else { // it's not managed by us; record it specifiedRunTimeDefaultValues.put(propertyName, Expressions.withoutExpansion( - () -> config.getOptionalValue(propertyName, String.class).orElse(""))); + () -> runtimeDefaultsConfig.getOptionalValue(propertyName, String.class).orElse(""))); } } return new ReadResult(objectsByRootClass, specifiedRunTimeDefaultValues, buildTimeRunTimeVisibleValues, @@ -734,6 +737,28 @@ private Set getAllProperties() { } return properties; } + + /** + * Use this Config instance to record the specified runtime default values. We cannot use the main Config + * instance because it may record values coming from the EnvSource in build time. We do exclude the properties + * coming from the EnvSource, but a call to getValue may still provide values coming from the EnvSource, so we + * need to exclude it from sources when recoding values. + * + * We also do not want to completely exclude the EnvSource, because it may provide values for the build. This + * is only specific when recording the defaults. + * + * @return a new SmallRye instance without the EnvSources. + */ + private SmallRyeConfig getConfigForRuntimeDefaults() { + SmallRyeConfigBuilder builder = ConfigUtils.emptyConfigBuilder(); + for (ConfigSource configSource : config.getConfigSources()) { + if (configSource instanceof EnvConfigSource) { + continue; + } + builder.withSources(configSource); + } + return builder.build(); + } } public static final class ReadResult { diff --git a/core/test-extension/deployment/src/main/resources/application.properties b/core/test-extension/deployment/src/main/resources/application.properties index 5cac50b9e892f..ba740ffec768c 100644 --- a/core/test-extension/deployment/src/main/resources/application.properties +++ b/core/test-extension/deployment/src/main/resources/application.properties @@ -145,3 +145,6 @@ QUARKUS_HTTP_NON_APPLICATION_ROOT_PATH=/1234 quarkus.http.non.application.root.path=/1234 QUARKUS_HTTP_SSL_PORT=4443 quarkus.http.ssl.port=4443 + +### Do not record env values in build time +bt.do.not.record=properties diff --git a/core/test-extension/deployment/src/test/java/io/quarkus/extest/RuntimeDefaultsTest.java b/core/test-extension/deployment/src/test/java/io/quarkus/extest/RuntimeDefaultsTest.java new file mode 100644 index 0000000000000..37a0bf27db30c --- /dev/null +++ b/core/test-extension/deployment/src/test/java/io/quarkus/extest/RuntimeDefaultsTest.java @@ -0,0 +1,42 @@ +package io.quarkus.extest; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import javax.inject.Inject; + +import org.eclipse.microprofile.config.Config; +import org.eclipse.microprofile.config.spi.ConfigSource; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.test.QuarkusUnitTest; + +public class RuntimeDefaultsTest { + @RegisterExtension + static final QuarkusUnitTest TEST = new QuarkusUnitTest() + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) + // Don't change this to types, because of classloader class cast exception. + .addAsServiceProvider("org.eclipse.microprofile.config.spi.ConfigSource", + "io.quarkus.extest.runtime.config.EnvBuildTimeConfigSource") + .addAsResource("application.properties")); + + @Inject + Config config; + + @Test + void doNotRecordEnvRuntimeDefaults() { + ConfigSource defaultValues = null; + for (ConfigSource configSource : config.getConfigSources()) { + if (configSource.getName().contains("PropertiesConfigSource[source=Specified default values]")) { + defaultValues = configSource; + break; + } + } + assertNotNull(defaultValues); + + assertEquals("properties", defaultValues.getValue("bt.do.not.record")); + } +} diff --git a/core/test-extension/runtime/src/main/java/io/quarkus/extest/runtime/config/EnvBuildTimeConfigSource.java b/core/test-extension/runtime/src/main/java/io/quarkus/extest/runtime/config/EnvBuildTimeConfigSource.java new file mode 100644 index 0000000000000..ebfc255b2d0e2 --- /dev/null +++ b/core/test-extension/runtime/src/main/java/io/quarkus/extest/runtime/config/EnvBuildTimeConfigSource.java @@ -0,0 +1,15 @@ +package io.quarkus.extest.runtime.config; + +import java.util.HashMap; + +import io.smallrye.config.EnvConfigSource; + +public class EnvBuildTimeConfigSource extends EnvConfigSource { + public EnvBuildTimeConfigSource() { + super(new HashMap() { + { + put("BT_DO_NOT_RECORD", "env-source"); + } + }, Integer.MAX_VALUE); + } +}