Skip to content

Commit 9aa28e3

Browse files
authored
Merge pull request #33228 from gsmet/config-mapping-vertx
Switch Vert.x, datasource, reactive datasource and Agroal to @ConfigMapping
2 parents 4e0fac1 + e244bbe commit 9aa28e3

File tree

119 files changed

+1967
-1807
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

119 files changed

+1967
-1807
lines changed

core/processor/src/main/java/io/quarkus/annotation/processor/Constants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ final public class Constants {
5858
public static final String ANNOTATION_DEFAULT_CONVERTER = "io.quarkus.runtime.annotations.DefaultConverter";
5959
public static final String ANNOTATION_CONVERT_WITH = "io.quarkus.runtime.annotations.ConvertWith";
6060
public static final String ANNOTATION_CONFIG_GROUP = "io.quarkus.runtime.annotations.ConfigGroup";
61+
public static final String ANNOTATION_CONFIG_DOC_IGNORE = "io.quarkus.runtime.annotations.ConfigDocIgnore";
6162
public static final String ANNOTATION_CONFIG_DOC_MAP_KEY = "io.quarkus.runtime.annotations.ConfigDocMapKey";
6263
public static final String ANNOTATION_CONFIG_DOC_SECTION = "io.quarkus.runtime.annotations.ConfigDocSection";
6364
public static final String ANNOTATION_CONFIG_DOC_ENUM_VALUE = "io.quarkus.runtime.annotations.ConfigDocEnumValue";

core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,9 @@ private void recordMappingJavadoc(final TypeElement clazz, final Properties java
488488
}
489489

490490
case METHOD: {
491-
processMethodConfigMapping((ExecutableElement) e, javadocProps, className);
491+
if (!isConfigMappingMethodIgnored(e)) {
492+
processMethodConfigMapping((ExecutableElement) e, javadocProps, className);
493+
}
492494
break;
493495
}
494496
default:
@@ -869,6 +871,17 @@ private static boolean isDocumentedConfigItem(Element element) {
869871
return hasAnnotation;
870872
}
871873

874+
private static boolean isConfigMappingMethodIgnored(Element element) {
875+
for (AnnotationMirror annotationMirror : element.getAnnotationMirrors()) {
876+
String annotationName = ((TypeElement) annotationMirror.getAnnotationType().asElement())
877+
.getQualifiedName().toString();
878+
if (Constants.ANNOTATION_CONFIG_DOC_IGNORE.equals(annotationName)) {
879+
return true;
880+
}
881+
}
882+
return false;
883+
}
884+
872885
private static Object getAnnotationAttribute(AnnotationMirror annotationMirror, String attributeName) {
873886
for (Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> entry : annotationMirror
874887
.getElementValues().entrySet()) {

core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItemFinder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,8 @@ private List<ConfigDocItem> recursivelyFindConfigItems(Element element, String r
236236
} else if (annotationName.equals(ANNOTATION_CONFIG_DOC_DEFAULT)) {
237237
defaultValueDoc = annotationMirror.getElementValues().values().iterator().next().getValue().toString();
238238
} else if (annotationName.equals(ANNOTATION_CONFIG_WITH_DEFAULT)) {
239-
defaultValue = annotationMirror.getElementValues().values().iterator().next().getValue().toString();
239+
defaultValue = annotationMirror.getElementValues().values().isEmpty() ? null
240+
: annotationMirror.getElementValues().values().iterator().next().getValue().toString();
240241
} else if (annotationName.equals(ANNOTATION_CONFIG_WITH_UNNAMED_KEY)) {
241242
unnamedMapKey = true;
242243
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package io.quarkus.runtime.annotations;
2+
3+
import static java.lang.annotation.ElementType.METHOD;
4+
import static java.lang.annotation.RetentionPolicy.SOURCE;
5+
6+
import java.lang.annotation.Documented;
7+
import java.lang.annotation.Retention;
8+
import java.lang.annotation.Target;
9+
10+
/**
11+
* A marker indicating that the configuration method should be ignored
12+
* when generating documentation.
13+
*/
14+
@Documented
15+
@Retention(SOURCE)
16+
@Target({ METHOD })
17+
public @interface ConfigDocIgnore {
18+
}

docs/src/main/asciidoc/dev-services.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ The Redis Dev Service will be enabled when the `quarkus-redis-client` extension
105105
the server address has not been explicitly configured. More information can be found in the
106106
xref:redis-dev-services.adoc[Redis Dev Services Guide].
107107

108-
include::{generated-dir}/config/quarkus-redis-client-config-group-dev-services-config.adoc[opts=optional, leveloffset=+1]
108+
include::{generated-dir}/config/quarkus-redis-config-group-client-dev-services-config.adoc[opts=optional, leveloffset=+1]
109109

110110
== Vault
111111

docs/src/main/asciidoc/redis-dev-services.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ Quarkus will automatically start a Redis container when running tests or dev mod
1515

1616
Available properties to customize the Redis DevService.
1717

18-
include::{generated-dir}/config/quarkus-redis-client-config-group-dev-services-config.adoc[opts=optional, leveloffset=+1]
18+
include::{generated-dir}/config/quarkus-redis-config-group-client-dev-services-config.adoc[opts=optional, leveloffset=+1]
1919

2020
When running the production version of the application, the Redis connection need to be configured as normal,
2121
so if you want to include a production database config in your `application.properties` and continue to use Dev Services

docs/src/main/asciidoc/redis-reference.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -954,4 +954,4 @@ quarkus.micrometer.binder.redis.enabled=false
954954
[[redis-configuration-reference]]
955955
== Configuration reference
956956

957-
include::{generated-dir}/config/quarkus-redis-client.adoc[opts=optional,leveloffset=+1]
957+
include::{generated-dir}/config/quarkus-redis.adoc[opts=optional, leveloffset=+1]

extensions/agroal/deployment/src/main/java/io/quarkus/agroal/deployment/AgroalMetricsProcessor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ void registerMetrics(AgroalMetricsRecorder recorder,
2323
// Create a MetricsFactory consumer to register metrics for a data source
2424
// IFF metrics are enabled globally and for the data source
2525
// (they are enabled for each data source by default if they are also enabled globally)
26-
if (dataSourcesBuildTimeConfig.metricsEnabled &&
27-
aggregatedDataSourceBuildTimeConfig.getJdbcConfig().enableMetrics.orElse(true)) {
26+
if (dataSourcesBuildTimeConfig.metricsEnabled() &&
27+
aggregatedDataSourceBuildTimeConfig.getJdbcConfig().enableMetrics().orElse(true)) {
2828
datasourceMetrics.produce(new MetricsFactoryConsumerBuildItem(
2929
recorder.registerDataSourceMetrics(aggregatedDataSourceBuildTimeConfig.getName())));
3030
}

extensions/agroal/deployment/src/main/java/io/quarkus/agroal/deployment/AgroalProcessor.java

Lines changed: 29 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ void build(
9090
BuildProducer<AggregatedDataSourceBuildTimeConfigBuildItem> aggregatedConfig,
9191
BuildProducer<AdditionalBeanBuildItem> additionalBeans,
9292
CurateOutcomeBuildItem curateOutcomeBuildItem) throws Exception {
93-
if (dataSourcesBuildTimeConfig.driver.isPresent() || dataSourcesBuildTimeConfig.url.isPresent()) {
93+
if (dataSourcesBuildTimeConfig.driver().isPresent() || dataSourcesBuildTimeConfig.url().isPresent()) {
9494
throw new ConfigurationException(
9595
"quarkus.datasource.url and quarkus.datasource.driver have been deprecated in Quarkus 1.3 and removed in 1.9. "
9696
+ "Please use the new datasource configuration as explained in https://quarkus.io/guides/datasource.");
@@ -110,13 +110,13 @@ void build(
110110
for (AggregatedDataSourceBuildTimeConfigBuildItem aggregatedDataSourceBuildTimeConfig : aggregatedDataSourceBuildTimeConfigs) {
111111
validateBuildTimeConfig(aggregatedDataSourceBuildTimeConfig);
112112

113-
if (aggregatedDataSourceBuildTimeConfig.getJdbcConfig().tracing) {
113+
if (aggregatedDataSourceBuildTimeConfig.getJdbcConfig().tracing()) {
114114
reflectiveClass
115115
.produce(ReflectiveClassBuildItem.builder(DataSources.TRACING_DRIVER_CLASSNAME).methods()
116116
.build());
117117
}
118118

119-
if (aggregatedDataSourceBuildTimeConfig.getJdbcConfig().telemetry) {
119+
if (aggregatedDataSourceBuildTimeConfig.getJdbcConfig().telemetry()) {
120120
otelJdbcInstrumentationActive = true;
121121
}
122122

@@ -160,7 +160,7 @@ private static void validateBuildTimeConfig(AggregatedDataSourceBuildTimeConfigB
160160
String fullDataSourceName = aggregatedConfig.isDefault() ? "default datasource"
161161
: "datasource named '" + aggregatedConfig.getName() + "'";
162162

163-
if (jdbcBuildTimeConfig.tracing) {
163+
if (jdbcBuildTimeConfig.tracing()) {
164164
if (!QuarkusClassLoader.isClassPresentAtRuntime(DataSources.TRACING_DRIVER_CLASSNAME)) {
165165
throw new ConfigurationException(
166166
"Unable to load the tracing driver " + DataSources.TRACING_DRIVER_CLASSNAME + " for the "
@@ -176,7 +176,7 @@ private static void validateBuildTimeConfig(AggregatedDataSourceBuildTimeConfigB
176176
throw new ConfigurationException(
177177
"Unable to load the datasource driver " + driverName + " for the " + fullDataSourceName, e);
178178
}
179-
if (jdbcBuildTimeConfig.transactions == TransactionIntegration.XA) {
179+
if (jdbcBuildTimeConfig.transactions() == TransactionIntegration.XA) {
180180
if (!XADataSource.class.isAssignableFrom(driver)) {
181181
throw new ConfigurationException(
182182
"Driver is not an XA dataSource, while XA has been enabled in the configuration of the "
@@ -208,7 +208,7 @@ private DataSourceSupport getDataSourceSupport(
208208
String dataSourceName = aggregatedDataSourceBuildTimeConfig.getName();
209209
dataSourceSupportEntries.put(dataSourceName,
210210
new DataSourceSupport.Entry(dataSourceName, aggregatedDataSourceBuildTimeConfig.getDbKind(),
211-
aggregatedDataSourceBuildTimeConfig.getDataSourceConfig().dbVersion,
211+
aggregatedDataSourceBuildTimeConfig.getDataSourceConfig().dbVersion(),
212212
aggregatedDataSourceBuildTimeConfig.getResolvedDriverClass(),
213213
aggregatedDataSourceBuildTimeConfig.isDefault()));
214214
}
@@ -297,8 +297,8 @@ void generateDataSourceBeans(AgroalRecorder recorder,
297297

298298
jdbcDataSource.produce(new JdbcDataSourceBuildItem(dataSourceName,
299299
aggregatedBuildTimeConfigBuildItem.getDbKind(),
300-
aggregatedBuildTimeConfigBuildItem.getDataSourceConfig().dbVersion,
301-
aggregatedBuildTimeConfigBuildItem.getJdbcConfig().transactions != TransactionIntegration.DISABLED,
300+
aggregatedBuildTimeConfigBuildItem.getDataSourceConfig().dbVersion(),
301+
aggregatedBuildTimeConfigBuildItem.getJdbcConfig().transactions() != TransactionIntegration.DISABLED,
302302
aggregatedBuildTimeConfigBuildItem.isDefault()));
303303
}
304304
}
@@ -311,58 +311,48 @@ private List<AggregatedDataSourceBuildTimeConfigBuildItem> getAggregatedConfigBu
311311
List<DefaultDataSourceDbKindBuildItem> defaultDbKinds) {
312312
List<AggregatedDataSourceBuildTimeConfigBuildItem> dataSources = new ArrayList<>();
313313

314-
Optional<String> effectiveDbKind = DefaultDataSourceDbKindBuildItem
315-
.resolve(dataSourcesBuildTimeConfig.defaultDataSource.dbKind, defaultDbKinds,
316-
dataSourcesBuildTimeConfig.defaultDataSource.devservices.enabled
317-
.orElse(dataSourcesBuildTimeConfig.namedDataSources.isEmpty()),
318-
curateOutcomeBuildItem);
319-
320-
if (effectiveDbKind.isPresent()) {
321-
if (dataSourcesJdbcBuildTimeConfig.jdbc.enabled) {
322-
dataSources.add(new AggregatedDataSourceBuildTimeConfigBuildItem(DataSourceUtil.DEFAULT_DATASOURCE_NAME,
323-
dataSourcesBuildTimeConfig.defaultDataSource,
324-
dataSourcesJdbcBuildTimeConfig.jdbc,
325-
effectiveDbKind.get(),
326-
resolveDriver(DataSourceUtil.DEFAULT_DATASOURCE_NAME, effectiveDbKind.get(),
327-
dataSourcesJdbcBuildTimeConfig.jdbc, jdbcDriverBuildItems)));
328-
}
329-
}
330-
for (Entry<String, DataSourceBuildTimeConfig> entry : dataSourcesBuildTimeConfig.namedDataSources.entrySet()) {
331-
DataSourceJdbcBuildTimeConfig jdbcBuildTimeConfig = dataSourcesJdbcBuildTimeConfig.namedDataSources
332-
.containsKey(entry.getKey()) ? dataSourcesJdbcBuildTimeConfig.namedDataSources.get(entry.getKey()).jdbc
333-
: new DataSourceJdbcBuildTimeConfig();
334-
if (!jdbcBuildTimeConfig.enabled) {
314+
for (Entry<String, DataSourceBuildTimeConfig> entry : dataSourcesBuildTimeConfig.dataSources().entrySet()) {
315+
DataSourceJdbcBuildTimeConfig jdbcBuildTimeConfig = dataSourcesJdbcBuildTimeConfig
316+
.dataSources().get(entry.getKey()).jdbc();
317+
if (!jdbcBuildTimeConfig.enabled()) {
335318
continue;
336319
}
337-
Optional<String> dbKind = DefaultDataSourceDbKindBuildItem
338-
.resolve(entry.getValue().dbKind, defaultDbKinds,
339-
true,
320+
321+
boolean enableImplicitResolution = DataSourceUtil.isDefault(entry.getKey())
322+
? entry.getValue().devservices().enabled().orElse(!dataSourcesBuildTimeConfig.hasNamedDataSources())
323+
: true;
324+
325+
Optional<String> effectiveDbKind = DefaultDataSourceDbKindBuildItem
326+
.resolve(entry.getValue().dbKind(), defaultDbKinds,
327+
enableImplicitResolution,
340328
curateOutcomeBuildItem);
341-
if (!dbKind.isPresent()) {
329+
330+
if (!effectiveDbKind.isPresent()) {
342331
continue;
343332
}
333+
344334
dataSources.add(new AggregatedDataSourceBuildTimeConfigBuildItem(entry.getKey(),
345335
entry.getValue(),
346336
jdbcBuildTimeConfig,
347-
dbKind.get(),
348-
resolveDriver(entry.getKey(), dbKind.get(), jdbcBuildTimeConfig, jdbcDriverBuildItems)));
337+
effectiveDbKind.get(),
338+
resolveDriver(entry.getKey(), effectiveDbKind.get(), jdbcBuildTimeConfig, jdbcDriverBuildItems)));
349339
}
350340

351341
return dataSources;
352342
}
353343

354344
private String resolveDriver(String dataSourceName, String dbKind,
355345
DataSourceJdbcBuildTimeConfig dataSourceJdbcBuildTimeConfig, List<JdbcDriverBuildItem> jdbcDriverBuildItems) {
356-
if (dataSourceJdbcBuildTimeConfig.driver.isPresent()) {
357-
return dataSourceJdbcBuildTimeConfig.driver.get();
346+
if (dataSourceJdbcBuildTimeConfig.driver().isPresent()) {
347+
return dataSourceJdbcBuildTimeConfig.driver().get();
358348
}
359349

360350
Optional<JdbcDriverBuildItem> matchingJdbcDriver = jdbcDriverBuildItems.stream()
361351
.filter(i -> dbKind.equals(i.getDbKind()))
362352
.findFirst();
363353

364354
if (matchingJdbcDriver.isPresent()) {
365-
if (io.quarkus.agroal.runtime.TransactionIntegration.XA == dataSourceJdbcBuildTimeConfig.transactions) {
355+
if (io.quarkus.agroal.runtime.TransactionIntegration.XA == dataSourceJdbcBuildTimeConfig.transactions()) {
366356
if (matchingJdbcDriver.get().getDriverXAClass().isPresent()) {
367357
return matchingJdbcDriver.get().getDriverXAClass().get();
368358
}
@@ -384,7 +374,7 @@ private String resolveDriver(String dataSourceName, String dbKind,
384374
HealthBuildItem addHealthCheck(Capabilities capabilities, DataSourcesBuildTimeConfig dataSourcesBuildTimeConfig) {
385375
if (capabilities.isPresent(Capability.SMALLRYE_HEALTH)) {
386376
return new HealthBuildItem("io.quarkus.agroal.runtime.health.DataSourceHealthCheck",
387-
dataSourcesBuildTimeConfig.healthEnabled);
377+
dataSourcesBuildTimeConfig.healthEnabled());
388378
} else {
389379
return null;
390380
}

extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSourceJdbcBuildTimeConfig.java

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,50 +3,50 @@
33
import java.util.Optional;
44

55
import io.quarkus.runtime.annotations.ConfigGroup;
6-
import io.quarkus.runtime.annotations.ConfigItem;
7-
import io.quarkus.runtime.annotations.ConvertWith;
86
import io.quarkus.runtime.configuration.TrimmedStringConverter;
7+
import io.smallrye.config.WithConverter;
8+
import io.smallrye.config.WithDefault;
9+
import io.smallrye.config.WithParentName;
910

1011
@ConfigGroup
11-
public class DataSourceJdbcBuildTimeConfig {
12+
public interface DataSourceJdbcBuildTimeConfig {
1213

1314
/**
1415
* If we create a JDBC datasource for this datasource.
1516
*/
16-
@ConfigItem(name = ConfigItem.PARENT, defaultValue = "true")
17-
public boolean enabled = true;
17+
@WithParentName
18+
@WithDefault("true")
19+
boolean enabled();
1820

1921
/**
2022
* The datasource driver class name
2123
*/
22-
@ConfigItem
23-
@ConvertWith(TrimmedStringConverter.class)
24-
public Optional<String> driver = Optional.empty();
24+
@WithConverter(TrimmedStringConverter.class)
25+
Optional<String> driver();
2526

2627
/**
2728
* Whether we want to use regular JDBC transactions, XA, or disable all transactional capabilities.
2829
* <p>
2930
* When enabling XA you will need a driver implementing {@link javax.sql.XADataSource}.
3031
*/
31-
@ConfigItem(defaultValue = "enabled")
32-
public TransactionIntegration transactions = TransactionIntegration.ENABLED;
32+
@WithDefault("enabled")
33+
TransactionIntegration transactions();
3334

3435
/**
3536
* Enable datasource metrics collection. If unspecified, collecting metrics will be enabled by default if
3637
* a metrics extension is active.
3738
*/
38-
@ConfigItem
39-
public Optional<Boolean> enableMetrics = Optional.empty();
39+
Optional<Boolean> enableMetrics();
4040

4141
/**
4242
* Enable JDBC tracing. Disabled by default.
4343
*/
44-
@ConfigItem(defaultValue = "false")
45-
public boolean tracing = false;
44+
@WithDefault("false")
45+
boolean tracing();
4646

4747
/**
4848
* Enable OpenTelemetry JDBC instrumentation.
4949
*/
50-
@ConfigItem(defaultValue = "false")
51-
public boolean telemetry = false;
50+
@WithDefault("false")
51+
boolean telemetry();
5252
}

0 commit comments

Comments
 (0)