Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ final public class Constants {
public static final String ANNOTATION_DEFAULT_CONVERTER = "io.quarkus.runtime.annotations.DefaultConverter";
public static final String ANNOTATION_CONVERT_WITH = "io.quarkus.runtime.annotations.ConvertWith";
public static final String ANNOTATION_CONFIG_GROUP = "io.quarkus.runtime.annotations.ConfigGroup";
public static final String ANNOTATION_CONFIG_DOC_IGNORE = "io.quarkus.runtime.annotations.ConfigDocIgnore";
public static final String ANNOTATION_CONFIG_DOC_MAP_KEY = "io.quarkus.runtime.annotations.ConfigDocMapKey";
public static final String ANNOTATION_CONFIG_DOC_SECTION = "io.quarkus.runtime.annotations.ConfigDocSection";
public static final String ANNOTATION_CONFIG_DOC_ENUM_VALUE = "io.quarkus.runtime.annotations.ConfigDocEnumValue";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -488,7 +488,9 @@ private void recordMappingJavadoc(final TypeElement clazz, final Properties java
}

case METHOD: {
processMethodConfigMapping((ExecutableElement) e, javadocProps, className);
if (!isConfigMappingMethodIgnored(e)) {
processMethodConfigMapping((ExecutableElement) e, javadocProps, className);
}
break;
}
default:
Expand Down Expand Up @@ -869,6 +871,17 @@ private static boolean isDocumentedConfigItem(Element element) {
return hasAnnotation;
}

private static boolean isConfigMappingMethodIgnored(Element element) {
for (AnnotationMirror annotationMirror : element.getAnnotationMirrors()) {
String annotationName = ((TypeElement) annotationMirror.getAnnotationType().asElement())
.getQualifiedName().toString();
if (Constants.ANNOTATION_CONFIG_DOC_IGNORE.equals(annotationName)) {
return true;
}
}
return false;
}

private static Object getAnnotationAttribute(AnnotationMirror annotationMirror, String attributeName) {
for (Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> entry : annotationMirror
.getElementValues().entrySet()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,8 @@ private List<ConfigDocItem> recursivelyFindConfigItems(Element element, String r
} else if (annotationName.equals(ANNOTATION_CONFIG_DOC_DEFAULT)) {
defaultValueDoc = annotationMirror.getElementValues().values().iterator().next().getValue().toString();
} else if (annotationName.equals(ANNOTATION_CONFIG_WITH_DEFAULT)) {
defaultValue = annotationMirror.getElementValues().values().iterator().next().getValue().toString();
defaultValue = annotationMirror.getElementValues().values().isEmpty() ? null
: annotationMirror.getElementValues().values().iterator().next().getValue().toString();
} else if (annotationName.equals(ANNOTATION_CONFIG_WITH_UNNAMED_KEY)) {
unnamedMapKey = true;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package io.quarkus.runtime.annotations;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.SOURCE;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

/**
* A marker indicating that the configuration method should be ignored
* when generating documentation.
*/
@Documented
@Retention(SOURCE)
@Target({ METHOD })
public @interface ConfigDocIgnore {
}
2 changes: 1 addition & 1 deletion docs/src/main/asciidoc/dev-services.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ The Redis Dev Service will be enabled when the `quarkus-redis-client` extension
the server address has not been explicitly configured. More information can be found in the
xref:redis-dev-services.adoc[Redis Dev Services Guide].

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

== Vault

Expand Down
2 changes: 1 addition & 1 deletion docs/src/main/asciidoc/redis-dev-services.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ Quarkus will automatically start a Redis container when running tests or dev mod

Available properties to customize the Redis DevService.

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

When running the production version of the application, the Redis connection need to be configured as normal,
so if you want to include a production database config in your `application.properties` and continue to use Dev Services
Expand Down
2 changes: 1 addition & 1 deletion docs/src/main/asciidoc/redis-reference.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -954,4 +954,4 @@ quarkus.micrometer.binder.redis.enabled=false
[[redis-configuration-reference]]
== Configuration reference

include::{generated-dir}/config/quarkus-redis-client.adoc[opts=optional,leveloffset=+1]
include::{generated-dir}/config/quarkus-redis.adoc[opts=optional, leveloffset=+1]
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ void registerMetrics(AgroalMetricsRecorder recorder,
// Create a MetricsFactory consumer to register metrics for a data source
// IFF metrics are enabled globally and for the data source
// (they are enabled for each data source by default if they are also enabled globally)
if (dataSourcesBuildTimeConfig.metricsEnabled &&
aggregatedDataSourceBuildTimeConfig.getJdbcConfig().enableMetrics.orElse(true)) {
if (dataSourcesBuildTimeConfig.metricsEnabled() &&
aggregatedDataSourceBuildTimeConfig.getJdbcConfig().enableMetrics().orElse(true)) {
datasourceMetrics.produce(new MetricsFactoryConsumerBuildItem(
recorder.registerDataSourceMetrics(aggregatedDataSourceBuildTimeConfig.getName())));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ void build(
BuildProducer<AggregatedDataSourceBuildTimeConfigBuildItem> aggregatedConfig,
BuildProducer<AdditionalBeanBuildItem> additionalBeans,
CurateOutcomeBuildItem curateOutcomeBuildItem) throws Exception {
if (dataSourcesBuildTimeConfig.driver.isPresent() || dataSourcesBuildTimeConfig.url.isPresent()) {
if (dataSourcesBuildTimeConfig.driver().isPresent() || dataSourcesBuildTimeConfig.url().isPresent()) {
throw new ConfigurationException(
"quarkus.datasource.url and quarkus.datasource.driver have been deprecated in Quarkus 1.3 and removed in 1.9. "
+ "Please use the new datasource configuration as explained in https://quarkus.io/guides/datasource.");
Expand All @@ -110,13 +110,13 @@ void build(
for (AggregatedDataSourceBuildTimeConfigBuildItem aggregatedDataSourceBuildTimeConfig : aggregatedDataSourceBuildTimeConfigs) {
validateBuildTimeConfig(aggregatedDataSourceBuildTimeConfig);

if (aggregatedDataSourceBuildTimeConfig.getJdbcConfig().tracing) {
if (aggregatedDataSourceBuildTimeConfig.getJdbcConfig().tracing()) {
reflectiveClass
.produce(ReflectiveClassBuildItem.builder(DataSources.TRACING_DRIVER_CLASSNAME).methods()
.build());
}

if (aggregatedDataSourceBuildTimeConfig.getJdbcConfig().telemetry) {
if (aggregatedDataSourceBuildTimeConfig.getJdbcConfig().telemetry()) {
otelJdbcInstrumentationActive = true;
}

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

if (jdbcBuildTimeConfig.tracing) {
if (jdbcBuildTimeConfig.tracing()) {
if (!QuarkusClassLoader.isClassPresentAtRuntime(DataSources.TRACING_DRIVER_CLASSNAME)) {
throw new ConfigurationException(
"Unable to load the tracing driver " + DataSources.TRACING_DRIVER_CLASSNAME + " for the "
Expand All @@ -176,7 +176,7 @@ private static void validateBuildTimeConfig(AggregatedDataSourceBuildTimeConfigB
throw new ConfigurationException(
"Unable to load the datasource driver " + driverName + " for the " + fullDataSourceName, e);
}
if (jdbcBuildTimeConfig.transactions == TransactionIntegration.XA) {
if (jdbcBuildTimeConfig.transactions() == TransactionIntegration.XA) {
if (!XADataSource.class.isAssignableFrom(driver)) {
throw new ConfigurationException(
"Driver is not an XA dataSource, while XA has been enabled in the configuration of the "
Expand Down Expand Up @@ -208,7 +208,7 @@ private DataSourceSupport getDataSourceSupport(
String dataSourceName = aggregatedDataSourceBuildTimeConfig.getName();
dataSourceSupportEntries.put(dataSourceName,
new DataSourceSupport.Entry(dataSourceName, aggregatedDataSourceBuildTimeConfig.getDbKind(),
aggregatedDataSourceBuildTimeConfig.getDataSourceConfig().dbVersion,
aggregatedDataSourceBuildTimeConfig.getDataSourceConfig().dbVersion(),
aggregatedDataSourceBuildTimeConfig.getResolvedDriverClass(),
aggregatedDataSourceBuildTimeConfig.isDefault()));
}
Expand Down Expand Up @@ -297,8 +297,8 @@ void generateDataSourceBeans(AgroalRecorder recorder,

jdbcDataSource.produce(new JdbcDataSourceBuildItem(dataSourceName,
aggregatedBuildTimeConfigBuildItem.getDbKind(),
aggregatedBuildTimeConfigBuildItem.getDataSourceConfig().dbVersion,
aggregatedBuildTimeConfigBuildItem.getJdbcConfig().transactions != TransactionIntegration.DISABLED,
aggregatedBuildTimeConfigBuildItem.getDataSourceConfig().dbVersion(),
aggregatedBuildTimeConfigBuildItem.getJdbcConfig().transactions() != TransactionIntegration.DISABLED,
aggregatedBuildTimeConfigBuildItem.isDefault()));
}
}
Expand All @@ -311,58 +311,48 @@ private List<AggregatedDataSourceBuildTimeConfigBuildItem> getAggregatedConfigBu
List<DefaultDataSourceDbKindBuildItem> defaultDbKinds) {
List<AggregatedDataSourceBuildTimeConfigBuildItem> dataSources = new ArrayList<>();

Optional<String> effectiveDbKind = DefaultDataSourceDbKindBuildItem
.resolve(dataSourcesBuildTimeConfig.defaultDataSource.dbKind, defaultDbKinds,
dataSourcesBuildTimeConfig.defaultDataSource.devservices.enabled
.orElse(dataSourcesBuildTimeConfig.namedDataSources.isEmpty()),
curateOutcomeBuildItem);

if (effectiveDbKind.isPresent()) {
if (dataSourcesJdbcBuildTimeConfig.jdbc.enabled) {
dataSources.add(new AggregatedDataSourceBuildTimeConfigBuildItem(DataSourceUtil.DEFAULT_DATASOURCE_NAME,
dataSourcesBuildTimeConfig.defaultDataSource,
dataSourcesJdbcBuildTimeConfig.jdbc,
effectiveDbKind.get(),
resolveDriver(DataSourceUtil.DEFAULT_DATASOURCE_NAME, effectiveDbKind.get(),
dataSourcesJdbcBuildTimeConfig.jdbc, jdbcDriverBuildItems)));
}
}
for (Entry<String, DataSourceBuildTimeConfig> entry : dataSourcesBuildTimeConfig.namedDataSources.entrySet()) {
DataSourceJdbcBuildTimeConfig jdbcBuildTimeConfig = dataSourcesJdbcBuildTimeConfig.namedDataSources
.containsKey(entry.getKey()) ? dataSourcesJdbcBuildTimeConfig.namedDataSources.get(entry.getKey()).jdbc
: new DataSourceJdbcBuildTimeConfig();
if (!jdbcBuildTimeConfig.enabled) {
for (Entry<String, DataSourceBuildTimeConfig> entry : dataSourcesBuildTimeConfig.dataSources().entrySet()) {
DataSourceJdbcBuildTimeConfig jdbcBuildTimeConfig = dataSourcesJdbcBuildTimeConfig
.dataSources().get(entry.getKey()).jdbc();
if (!jdbcBuildTimeConfig.enabled()) {
continue;
}
Optional<String> dbKind = DefaultDataSourceDbKindBuildItem
.resolve(entry.getValue().dbKind, defaultDbKinds,
true,

boolean enableImplicitResolution = DataSourceUtil.isDefault(entry.getKey())
? entry.getValue().devservices().enabled().orElse(!dataSourcesBuildTimeConfig.hasNamedDataSources())
: true;

Optional<String> effectiveDbKind = DefaultDataSourceDbKindBuildItem
.resolve(entry.getValue().dbKind(), defaultDbKinds,
enableImplicitResolution,
curateOutcomeBuildItem);
if (!dbKind.isPresent()) {

if (!effectiveDbKind.isPresent()) {
continue;
}

dataSources.add(new AggregatedDataSourceBuildTimeConfigBuildItem(entry.getKey(),
entry.getValue(),
jdbcBuildTimeConfig,
dbKind.get(),
resolveDriver(entry.getKey(), dbKind.get(), jdbcBuildTimeConfig, jdbcDriverBuildItems)));
effectiveDbKind.get(),
resolveDriver(entry.getKey(), effectiveDbKind.get(), jdbcBuildTimeConfig, jdbcDriverBuildItems)));
}

return dataSources;
}

private String resolveDriver(String dataSourceName, String dbKind,
DataSourceJdbcBuildTimeConfig dataSourceJdbcBuildTimeConfig, List<JdbcDriverBuildItem> jdbcDriverBuildItems) {
if (dataSourceJdbcBuildTimeConfig.driver.isPresent()) {
return dataSourceJdbcBuildTimeConfig.driver.get();
if (dataSourceJdbcBuildTimeConfig.driver().isPresent()) {
return dataSourceJdbcBuildTimeConfig.driver().get();
}

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

if (matchingJdbcDriver.isPresent()) {
if (io.quarkus.agroal.runtime.TransactionIntegration.XA == dataSourceJdbcBuildTimeConfig.transactions) {
if (io.quarkus.agroal.runtime.TransactionIntegration.XA == dataSourceJdbcBuildTimeConfig.transactions()) {
if (matchingJdbcDriver.get().getDriverXAClass().isPresent()) {
return matchingJdbcDriver.get().getDriverXAClass().get();
}
Expand All @@ -384,7 +374,7 @@ private String resolveDriver(String dataSourceName, String dbKind,
HealthBuildItem addHealthCheck(Capabilities capabilities, DataSourcesBuildTimeConfig dataSourcesBuildTimeConfig) {
if (capabilities.isPresent(Capability.SMALLRYE_HEALTH)) {
return new HealthBuildItem("io.quarkus.agroal.runtime.health.DataSourceHealthCheck",
dataSourcesBuildTimeConfig.healthEnabled);
dataSourcesBuildTimeConfig.healthEnabled());
} else {
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,50 +3,50 @@
import java.util.Optional;

import io.quarkus.runtime.annotations.ConfigGroup;
import io.quarkus.runtime.annotations.ConfigItem;
import io.quarkus.runtime.annotations.ConvertWith;
import io.quarkus.runtime.configuration.TrimmedStringConverter;
import io.smallrye.config.WithConverter;
import io.smallrye.config.WithDefault;
import io.smallrye.config.WithParentName;

@ConfigGroup
public class DataSourceJdbcBuildTimeConfig {
public interface DataSourceJdbcBuildTimeConfig {

/**
* If we create a JDBC datasource for this datasource.
*/
@ConfigItem(name = ConfigItem.PARENT, defaultValue = "true")
public boolean enabled = true;
@WithParentName
@WithDefault("true")
boolean enabled();

/**
* The datasource driver class name
*/
@ConfigItem
@ConvertWith(TrimmedStringConverter.class)
public Optional<String> driver = Optional.empty();
@WithConverter(TrimmedStringConverter.class)
Optional<String> driver();

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

/**
* Enable datasource metrics collection. If unspecified, collecting metrics will be enabled by default if
* a metrics extension is active.
*/
@ConfigItem
public Optional<Boolean> enableMetrics = Optional.empty();
Optional<Boolean> enableMetrics();

/**
* Enable JDBC tracing. Disabled by default.
*/
@ConfigItem(defaultValue = "false")
public boolean tracing = false;
@WithDefault("false")
boolean tracing();

/**
* Enable OpenTelemetry JDBC instrumentation.
*/
@ConfigItem(defaultValue = "false")
public boolean telemetry = false;
@WithDefault("false")
boolean telemetry();
}
Loading