Skip to content

Commit 52989c6

Browse files
authored
Merge pull request #10070 from geoand/#9973
Make YAML configuration work for Bootstrap Config
2 parents 60c4c99 + b7cff0d commit 52989c6

File tree

7 files changed

+86
-12
lines changed

7 files changed

+86
-12
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package io.quarkus.deployment.builditem;
2+
3+
import org.eclipse.microprofile.config.spi.ConfigSourceProvider;
4+
5+
import io.quarkus.builder.item.MultiBuildItem;
6+
7+
/**
8+
* Build item to use when an additional {@link ConfigSourceProvider} needs to be
9+
* registered to the Bootstrap Config setup.
10+
* This is needed because during Bootstrap Config setup, we don't auto-discover providers
11+
* but we do want for example the YAML provider to be enabled.
12+
*/
13+
public final class AdditionalBootstrapConfigSourceProviderBuildItem extends MultiBuildItem {
14+
15+
private final String providerClassName;
16+
17+
public AdditionalBootstrapConfigSourceProviderBuildItem(String providerClassName) {
18+
this.providerClassName = providerClassName;
19+
}
20+
21+
public String getProviderClassName() {
22+
return providerClassName;
23+
}
24+
}

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

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,9 +242,11 @@ private RunTimeConfigurationGenerator() {
242242

243243
public static void generate(BuildTimeConfigurationReader.ReadResult readResult, final ClassOutput classOutput,
244244
boolean devMode,
245-
final Map<String, String> runTimeDefaults, List<Class<?>> additionalTypes) {
245+
final Map<String, String> runTimeDefaults, List<Class<?>> additionalTypes,
246+
List<String> additionalBootstrapConfigSourceProviders) {
246247
new GenerateOperation.Builder().setBuildTimeReadResult(readResult).setClassOutput(classOutput).setDevMode(devMode)
247-
.setRunTimeDefaults(runTimeDefaults).setAdditionalTypes(additionalTypes).build().run();
248+
.setRunTimeDefaults(runTimeDefaults).setAdditionalTypes(additionalTypes)
249+
.setAdditionalBootstrapConfigSourceProviders(additionalBootstrapConfigSourceProviders).build().run();
248250
}
249251

250252
static final class GenerateOperation implements AutoCloseable {
@@ -273,6 +275,7 @@ static final class GenerateOperation implements AutoCloseable {
273275
final ResultHandle clinitConfig;
274276
final Map<FieldDescriptor, Class<?>> convertersToRegister = new HashMap<>();
275277
final List<Class<?>> additionalTypes;
278+
final List<String> additionalBootstrapConfigSourceProviders;
276279
/**
277280
* Regular converters organized by type. Each converter is stored in a separate field. Some are used
278281
* only at build time, some only at run time, and some at both times.
@@ -302,6 +305,7 @@ static final class GenerateOperation implements AutoCloseable {
302305
roots = Assert.checkNotNullParam("builder.roots", builder.getBuildTimeReadResult().getAllRoots());
303306
runTimeDefaults = Assert.checkNotNullParam("runTimeDefaults", builder.getRunTimeDefaults());
304307
additionalTypes = Assert.checkNotNullParam("additionalTypes", builder.getAdditionalTypes());
308+
additionalBootstrapConfigSourceProviders = builder.additionalBootstrapConfigSourceProviders;
305309
cc = ClassCreator.builder().classOutput(classOutput).className(CONFIG_CLASS_NAME).setFinal(true).build();
306310
generateEmptyParsers(cc);
307311
// not instantiable
@@ -564,6 +568,13 @@ public void run() {
564568
// put sources in the bootstrap builder
565569
if (bootstrapConfigSetupNeeded()) {
566570
readBootstrapConfig.invokeVirtualMethod(SRCB_WITH_SOURCES, bootstrapBuilder, bootstrapConfigSourcesArray);
571+
572+
// add additional providers
573+
for (String providerClass : additionalBootstrapConfigSourceProviders) {
574+
ResultHandle providerInstance = readBootstrapConfig
575+
.newInstance(MethodDescriptor.ofConstructor(providerClass));
576+
readBootstrapConfig.invokeStaticMethod(CU_ADD_SOURCE_PROVIDER, bootstrapBuilder, providerInstance);
577+
}
567578
}
568579
// put sources in the builder
569580
readConfig.invokeVirtualMethod(SRCB_WITH_SOURCES, runTimeBuilder, runtimeConfigSourcesArray);
@@ -1547,6 +1558,7 @@ static final class Builder {
15471558
private BuildTimeConfigurationReader.ReadResult buildTimeReadResult;
15481559
private Map<String, String> runTimeDefaults;
15491560
private List<Class<?>> additionalTypes;
1561+
private List<String> additionalBootstrapConfigSourceProviders;
15501562

15511563
Builder() {
15521564
}
@@ -1596,6 +1608,11 @@ public Builder setDevMode(boolean devMode) {
15961608
return this;
15971609
}
15981610

1611+
Builder setAdditionalBootstrapConfigSourceProviders(List<String> additionalBootstrapConfigSourceProviders) {
1612+
this.additionalBootstrapConfigSourceProviders = additionalBootstrapConfigSourceProviders;
1613+
return this;
1614+
}
1615+
15991616
GenerateOperation build() {
16001617
return new GenerateOperation(this);
16011618
}

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

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.quarkus.deployment.steps;
22

3+
import java.util.ArrayList;
4+
import java.util.Collections;
35
import java.util.HashMap;
46
import java.util.List;
57
import java.util.Map;
@@ -14,6 +16,7 @@
1416
import io.quarkus.deployment.annotations.BuildStep;
1517
import io.quarkus.deployment.annotations.ExecutionTime;
1618
import io.quarkus.deployment.annotations.Record;
19+
import io.quarkus.deployment.builditem.AdditionalBootstrapConfigSourceProviderBuildItem;
1720
import io.quarkus.deployment.builditem.ConfigurationBuildItem;
1821
import io.quarkus.deployment.builditem.ConfigurationTypeBuildItem;
1922
import io.quarkus.deployment.builditem.GeneratedClassBuildItem;
@@ -40,7 +43,8 @@ void generateConfigClass(ConfigurationBuildItem configItem, List<RunTimeConfigur
4043
List<ConfigurationTypeBuildItem> typeItems,
4144
LaunchModeBuildItem launchModeBuildItem,
4245
BuildProducer<GeneratedClassBuildItem> generatedClass,
43-
LiveReloadBuildItem liveReloadBuildItem) {
46+
LiveReloadBuildItem liveReloadBuildItem,
47+
List<AdditionalBootstrapConfigSourceProviderBuildItem> additionalBootstrapConfigSourceProviders) {
4448
if (liveReloadBuildItem.isLiveReload()) {
4549
return;
4650
}
@@ -56,7 +60,20 @@ void generateConfigClass(ConfigurationBuildItem configItem, List<RunTimeConfigur
5660

5761
ClassOutput classOutput = new GeneratedClassGizmoAdaptor(generatedClass, false);
5862
RunTimeConfigurationGenerator.generate(readResult, classOutput,
59-
launchModeBuildItem.getLaunchMode() == LaunchMode.DEVELOPMENT, defaults, additionalConfigTypes);
63+
launchModeBuildItem.getLaunchMode() == LaunchMode.DEVELOPMENT, defaults, additionalConfigTypes,
64+
getAdditionalBootstrapConfigSourceProviders(additionalBootstrapConfigSourceProviders));
65+
}
66+
67+
private List<String> getAdditionalBootstrapConfigSourceProviders(
68+
List<AdditionalBootstrapConfigSourceProviderBuildItem> additionalBootstrapConfigSourceProviders) {
69+
if (additionalBootstrapConfigSourceProviders.isEmpty()) {
70+
return Collections.emptyList();
71+
}
72+
List<String> result = new ArrayList<>(additionalBootstrapConfigSourceProviders.size());
73+
for (AdditionalBootstrapConfigSourceProviderBuildItem provider : additionalBootstrapConfigSourceProviders) {
74+
result.add(provider.getProviderClassName());
75+
}
76+
return result;
6077
}
6178

6279
/**

extensions/config-yaml/deployment/src/main/java/io/quarkus/config/yaml/deployment/ConfigYamlProcessor.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.quarkus.deployment.Feature;
55
import io.quarkus.deployment.annotations.BuildProducer;
66
import io.quarkus.deployment.annotations.BuildStep;
7+
import io.quarkus.deployment.builditem.AdditionalBootstrapConfigSourceProviderBuildItem;
78
import io.quarkus.deployment.builditem.FeatureBuildItem;
89
import io.quarkus.deployment.builditem.HotDeploymentWatchedFileBuildItem;
910

@@ -14,6 +15,11 @@ public FeatureBuildItem feature() {
1415
return new FeatureBuildItem(Feature.CONFIG_YAML);
1516
}
1617

18+
@BuildStep
19+
public AdditionalBootstrapConfigSourceProviderBuildItem bootstrap() {
20+
return new AdditionalBootstrapConfigSourceProviderBuildItem(ApplicationYamlProvider.class.getName());
21+
}
22+
1723
@BuildStep
1824
void watchYamlConfig(BuildProducer<HotDeploymentWatchedFileBuildItem> items) {
1925
items.produce(new HotDeploymentWatchedFileBuildItem(ApplicationYamlProvider.APPLICATION_YAML));

integration-tests/spring-cloud-config-client/pom.xml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@
2121
<groupId>io.quarkus</groupId>
2222
<artifactId>quarkus-spring-cloud-config-client</artifactId>
2323
</dependency>
24+
<dependency>
25+
<groupId>io.quarkus</groupId>
26+
<artifactId>quarkus-config-yaml</artifactId>
27+
</dependency>
2428
<dependency>
2529
<groupId>io.quarkus</groupId>
2630
<artifactId>quarkus-junit5</artifactId>
@@ -112,4 +116,4 @@
112116
</properties>
113117
</profile>
114118
</profiles>
115-
</project>
119+
</project>

integration-tests/spring-cloud-config-client/src/main/resources/application.properties

Lines changed: 0 additions & 7 deletions
This file was deleted.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
'%prod':
2+
quarkus:
3+
spring-cloud-config:
4+
url: http://localhost:8089
5+
username: user
6+
password: pass
7+
enabled: true
8+
quarkus:
9+
application:
10+
name: a-bootiful-client
11+
12+
greeting:
13+
message: hello from application.properties

0 commit comments

Comments
 (0)