diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/Constants.java b/core/processor/src/main/java/io/quarkus/annotation/processor/Constants.java index 17895ba6a3180..743c1bbf00aa1 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/Constants.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/Constants.java @@ -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"; diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java b/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java index 4c90d114a1600..f6a585cd0bef0 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java @@ -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: @@ -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 entry : annotationMirror .getElementValues().entrySet()) { diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItemFinder.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItemFinder.java index 207574ad1ca44..589085573f4d5 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItemFinder.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItemFinder.java @@ -236,7 +236,8 @@ private List 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; } diff --git a/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocIgnore.java b/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocIgnore.java new file mode 100644 index 0000000000000..1bc1a8469c9e2 --- /dev/null +++ b/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocIgnore.java @@ -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 { +} diff --git a/docs/src/main/asciidoc/dev-services.adoc b/docs/src/main/asciidoc/dev-services.adoc index b4440dfeca43c..a2f76497e215a 100644 --- a/docs/src/main/asciidoc/dev-services.adoc +++ b/docs/src/main/asciidoc/dev-services.adoc @@ -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 diff --git a/docs/src/main/asciidoc/redis-dev-services.adoc b/docs/src/main/asciidoc/redis-dev-services.adoc index 001da2d2dc356..1daf74defbc98 100644 --- a/docs/src/main/asciidoc/redis-dev-services.adoc +++ b/docs/src/main/asciidoc/redis-dev-services.adoc @@ -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 diff --git a/docs/src/main/asciidoc/redis-reference.adoc b/docs/src/main/asciidoc/redis-reference.adoc index 187cf380812cd..a49ae779c37c1 100644 --- a/docs/src/main/asciidoc/redis-reference.adoc +++ b/docs/src/main/asciidoc/redis-reference.adoc @@ -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] diff --git a/extensions/agroal/deployment/src/main/java/io/quarkus/agroal/deployment/AgroalMetricsProcessor.java b/extensions/agroal/deployment/src/main/java/io/quarkus/agroal/deployment/AgroalMetricsProcessor.java index cc7f79e6cc31c..936383b11c9cf 100644 --- a/extensions/agroal/deployment/src/main/java/io/quarkus/agroal/deployment/AgroalMetricsProcessor.java +++ b/extensions/agroal/deployment/src/main/java/io/quarkus/agroal/deployment/AgroalMetricsProcessor.java @@ -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()))); } diff --git a/extensions/agroal/deployment/src/main/java/io/quarkus/agroal/deployment/AgroalProcessor.java b/extensions/agroal/deployment/src/main/java/io/quarkus/agroal/deployment/AgroalProcessor.java index b1151c1637a3b..7cc97b8983e63 100644 --- a/extensions/agroal/deployment/src/main/java/io/quarkus/agroal/deployment/AgroalProcessor.java +++ b/extensions/agroal/deployment/src/main/java/io/quarkus/agroal/deployment/AgroalProcessor.java @@ -90,7 +90,7 @@ void build( BuildProducer aggregatedConfig, BuildProducer 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."); @@ -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; } @@ -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 " @@ -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 " @@ -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())); } @@ -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())); } } @@ -311,41 +311,31 @@ private List getAggregatedConfigBu List defaultDbKinds) { List dataSources = new ArrayList<>(); - Optional 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 entry : dataSourcesBuildTimeConfig.namedDataSources.entrySet()) { - DataSourceJdbcBuildTimeConfig jdbcBuildTimeConfig = dataSourcesJdbcBuildTimeConfig.namedDataSources - .containsKey(entry.getKey()) ? dataSourcesJdbcBuildTimeConfig.namedDataSources.get(entry.getKey()).jdbc - : new DataSourceJdbcBuildTimeConfig(); - if (!jdbcBuildTimeConfig.enabled) { + for (Entry entry : dataSourcesBuildTimeConfig.dataSources().entrySet()) { + DataSourceJdbcBuildTimeConfig jdbcBuildTimeConfig = dataSourcesJdbcBuildTimeConfig + .dataSources().get(entry.getKey()).jdbc(); + if (!jdbcBuildTimeConfig.enabled()) { continue; } - Optional dbKind = DefaultDataSourceDbKindBuildItem - .resolve(entry.getValue().dbKind, defaultDbKinds, - true, + + boolean enableImplicitResolution = DataSourceUtil.isDefault(entry.getKey()) + ? entry.getValue().devservices().enabled().orElse(!dataSourcesBuildTimeConfig.hasNamedDataSources()) + : true; + + Optional 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; @@ -353,8 +343,8 @@ private List getAggregatedConfigBu private String resolveDriver(String dataSourceName, String dbKind, DataSourceJdbcBuildTimeConfig dataSourceJdbcBuildTimeConfig, List jdbcDriverBuildItems) { - if (dataSourceJdbcBuildTimeConfig.driver.isPresent()) { - return dataSourceJdbcBuildTimeConfig.driver.get(); + if (dataSourceJdbcBuildTimeConfig.driver().isPresent()) { + return dataSourceJdbcBuildTimeConfig.driver().get(); } Optional matchingJdbcDriver = jdbcDriverBuildItems.stream() @@ -362,7 +352,7 @@ private String resolveDriver(String dataSourceName, String dbKind, .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(); } @@ -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; } diff --git a/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSourceJdbcBuildTimeConfig.java b/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSourceJdbcBuildTimeConfig.java index e9595b34c9003..0c6525ab55edd 100644 --- a/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSourceJdbcBuildTimeConfig.java +++ b/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSourceJdbcBuildTimeConfig.java @@ -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 driver = Optional.empty(); + @WithConverter(TrimmedStringConverter.class) + Optional driver(); /** * Whether we want to use regular JDBC transactions, XA, or disable all transactional capabilities. *

* 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 enableMetrics = Optional.empty(); + Optional 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(); } diff --git a/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSourceJdbcRuntimeConfig.java b/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSourceJdbcRuntimeConfig.java index 105c9b87da0e5..006d92550f121 100644 --- a/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSourceJdbcRuntimeConfig.java +++ b/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSourceJdbcRuntimeConfig.java @@ -1,100 +1,95 @@ package io.quarkus.agroal.runtime; import java.time.Duration; -import java.util.Collections; import java.util.Map; import java.util.Optional; import java.util.OptionalInt; import io.agroal.api.configuration.AgroalConnectionFactoryConfiguration; import io.agroal.api.configuration.AgroalConnectionPoolConfiguration; +import io.quarkus.runtime.annotations.ConfigDocDefault; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; +import io.smallrye.config.WithDefault; +import io.smallrye.config.WithName; @ConfigGroup -public class DataSourceJdbcRuntimeConfig { +public interface DataSourceJdbcRuntimeConfig { /** * The datasource URL */ - @ConfigItem - public Optional url = Optional.empty(); + Optional url(); /** * The initial size of the pool. Usually you will want to set the initial size to match at least the * minimal size, but this is not enforced so to allow for architectures which prefer a lazy initialization * of the connections on boot, while being able to sustain a minimal pool size after boot. */ - @ConfigItem - public OptionalInt initialSize = OptionalInt.empty(); + OptionalInt initialSize(); /** * The datasource pool minimum size */ - @ConfigItem - public int minSize = 0; + @WithDefault("0") + int minSize(); /** * The datasource pool maximum size */ - @ConfigItem(defaultValue = "20") - public int maxSize = 20; + @WithDefault("20") + int maxSize(); /** * The interval at which we validate idle connections in the background. *

* Set to {@code 0} to disable background validation. */ - @ConfigItem(defaultValue = "2M") - public Optional backgroundValidationInterval = Optional.of(Duration.ofMinutes(2)); + @WithDefault("2M") + Duration backgroundValidationInterval(); /** * Perform foreground validation on connections that have been idle for longer than the specified interval. */ - @ConfigItem - public Optional foregroundValidationInterval = Optional.empty(); + Optional foregroundValidationInterval(); /** * The timeout before cancelling the acquisition of a new connection */ - @ConfigItem(defaultValue = "5") - public Optional acquisitionTimeout = Optional.of(Duration.ofSeconds(5)); + @WithDefault("5S") + Optional acquisitionTimeout(); /** * The interval at which we check for connection leaks. */ - @ConfigItem - public Optional leakDetectionInterval = Optional.empty(); + Optional leakDetectionInterval(); /** * The interval at which we try to remove idle connections. */ - @ConfigItem(defaultValue = "5M") - public Optional idleRemovalInterval = Optional.of(Duration.ofMinutes(5)); + @WithDefault("5M") + Duration idleRemovalInterval(); /** * The max lifetime of a connection. */ - @ConfigItem - public Optional maxLifetime = Optional.empty(); + Optional maxLifetime(); /** * The transaction isolation level. */ - @ConfigItem - public Optional transactionIsolationLevel = Optional.empty(); + Optional transactionIsolationLevel(); /** * Collect and display extra troubleshooting info on leaked connections. */ - @ConfigItem - public boolean extendedLeakReport; + @WithDefault("false") + boolean extendedLeakReport(); /** * Allows connections to be flushed upon return to the pool. It's not enabled by default. */ - @ConfigItem - public boolean flushOnClose; + @WithDefault("false") + boolean flushOnClose(); /** * When enabled Agroal will be able to produce a warning when a connection is returned @@ -103,52 +98,48 @@ public class DataSourceJdbcRuntimeConfig { * Disable for peak performance, but only when there's high confidence that * no leaks are happening. */ - @ConfigItem(defaultValue = "true") - public boolean detectStatementLeaks = true; + @WithDefault("true") + boolean detectStatementLeaks(); /** * Query executed when first using a connection. */ - @ConfigItem - public Optional newConnectionSql = Optional.empty(); + Optional newConnectionSql(); /** * Query executed to validate a connection. */ - @ConfigItem - public Optional validationQuerySql = Optional.empty(); + Optional validationQuerySql(); /** * Disable pooling to prevent reuse of Connections. Use this with when an external pool manages the life-cycle * of Connections. */ - @ConfigItem(defaultValue = "true") - public boolean poolingEnabled = true; + @WithDefault("true") + boolean poolingEnabled(); /** * Require an active transaction when acquiring a connection. Recommended for production. * WARNING: Some extensions acquire connections without holding a transaction for things like schema updates and schema * validation. Setting this setting to STRICT may lead to failures in those cases. */ - @ConfigItem - public Optional transactionRequirement = Optional.empty(); + Optional transactionRequirement(); /** * Other unspecified properties to be passed to the JDBC driver when creating new connections. */ - @ConfigItem - public Map additionalJdbcProperties = Collections.emptyMap(); + Map additionalJdbcProperties(); /** * Enable JDBC tracing. */ - @ConfigItem - public DataSourceJdbcTracingRuntimeConfig tracing = new DataSourceJdbcTracingRuntimeConfig(); + DataSourceJdbcTracingRuntimeConfig tracing(); /** * Enable OpenTelemetry JDBC instrumentation. */ - @ConfigItem(name = "telemetry.enabled", defaultValueDocumentation = "false if quarkus.datasource.jdbc.telemetry=false and true if quarkus.datasource.jdbc.telemetry=true") - public Optional telemetry; + @WithName("telemetry.enabled") + @ConfigDocDefault("false if quarkus.datasource.jdbc.telemetry=false and true if quarkus.datasource.jdbc.telemetry=true") + Optional telemetry(); } diff --git a/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSourceJdbcTracingRuntimeConfig.java b/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSourceJdbcTracingRuntimeConfig.java index f58335555a007..e80dd8dfed615 100644 --- a/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSourceJdbcTracingRuntimeConfig.java +++ b/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSourceJdbcTracingRuntimeConfig.java @@ -2,28 +2,29 @@ import java.util.Optional; +import io.quarkus.runtime.annotations.ConfigDocDefault; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; +import io.smallrye.config.WithDefault; @ConfigGroup -public class DataSourceJdbcTracingRuntimeConfig { +public interface DataSourceJdbcTracingRuntimeConfig { /** * Enable JDBC tracing. */ - @ConfigItem(defaultValueDocumentation = "false if quarkus.datasource.jdbc.tracing=false and true if quarkus.datasource.jdbc.tracing=true") - public Optional enabled = Optional.empty(); + @ConfigDocDefault("false if quarkus.datasource.jdbc.tracing=false and true if quarkus.datasource.jdbc.tracing=true") + Optional enabled(); /** * Trace calls with active Spans only */ - @ConfigItem(defaultValue = "false") - public boolean traceWithActiveSpanOnly = false; + @WithDefault("false") + boolean traceWithActiveSpanOnly(); /** * Ignore specific queries from being traced */ - @ConfigItem(defaultValueDocumentation = "Ignore specific queries from being traced, multiple queries can be specified separated by semicolon, double quotes should be escaped with \\") - public Optional ignoreForTracing = Optional.empty(); + @ConfigDocDefault("Ignore specific queries from being traced, multiple queries can be specified separated by semicolon, double quotes should be escaped with \\") + Optional ignoreForTracing(); } diff --git a/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSources.java b/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSources.java index e1efb946d8f50..bff38eee02e67 100644 --- a/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSources.java +++ b/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSources.java @@ -38,14 +38,11 @@ import io.agroal.api.transaction.TransactionIntegration; import io.agroal.narayana.NarayanaTransactionIntegration; import io.quarkus.agroal.DataSource; -import io.quarkus.agroal.runtime.DataSourcesJdbcBuildTimeConfig.DataSourceJdbcOuterNamedBuildTimeConfig; -import io.quarkus.agroal.runtime.DataSourcesJdbcRuntimeConfig.DataSourceJdbcOuterNamedRuntimeConfig; import io.quarkus.agroal.runtime.JdbcDriver.JdbcDriverLiteral; import io.quarkus.arc.Arc; import io.quarkus.credentials.CredentialsProvider; import io.quarkus.credentials.runtime.CredentialsProviderFinder; import io.quarkus.datasource.common.runtime.DataSourceUtil; -import io.quarkus.datasource.runtime.DataSourceBuildTimeConfig; import io.quarkus.datasource.runtime.DataSourceRuntimeConfig; import io.quarkus.datasource.runtime.DataSourcesBuildTimeConfig; import io.quarkus.datasource.runtime.DataSourcesRuntimeConfig; @@ -137,12 +134,14 @@ public AgroalDataSource doCreateDataSource(String dataSourceName) { throw new IllegalArgumentException("No datasource named '" + dataSourceName + "' exists"); } - DataSourceJdbcBuildTimeConfig dataSourceJdbcBuildTimeConfig = getDataSourceJdbcBuildTimeConfig(dataSourceName); - DataSourceRuntimeConfig dataSourceRuntimeConfig = getDataSourceRuntimeConfig(dataSourceName); - DataSourceJdbcRuntimeConfig dataSourceJdbcRuntimeConfig = getDataSourceJdbcRuntimeConfig(dataSourceName); + DataSourceJdbcBuildTimeConfig dataSourceJdbcBuildTimeConfig = dataSourcesJdbcBuildTimeConfig + .dataSources().get(dataSourceName).jdbc(); + DataSourceRuntimeConfig dataSourceRuntimeConfig = dataSourcesRuntimeConfig.dataSources().get(dataSourceName); + DataSourceJdbcRuntimeConfig dataSourceJdbcRuntimeConfig = dataSourcesJdbcRuntimeConfig + .getDataSourceJdbcRuntimeConfig(dataSourceName); DataSourceSupport.Entry matchingSupportEntry = dataSourceSupport.entries.get(dataSourceName); - if (!dataSourceJdbcRuntimeConfig.url.isPresent()) { + if (!dataSourceJdbcRuntimeConfig.url().isPresent()) { //this is not an error situation, because we want to allow the situation where a JDBC extension //is installed but has not been configured return new UnconfiguredDataSource( @@ -161,10 +160,11 @@ public AgroalDataSource doCreateDataSource(String dataSourceName) { "Unable to load the datasource driver " + resolvedDriverClass + " for datasource " + dataSourceName, e); } - String jdbcUrl = dataSourceJdbcRuntimeConfig.url.get(); + String jdbcUrl = dataSourceJdbcRuntimeConfig.url().get(); - if (dataSourceJdbcBuildTimeConfig.tracing) { - boolean tracingEnabled = dataSourceJdbcRuntimeConfig.tracing.enabled.orElse(dataSourceJdbcBuildTimeConfig.tracing); + if (dataSourceJdbcBuildTimeConfig.tracing()) { + boolean tracingEnabled = dataSourceJdbcRuntimeConfig.tracing().enabled() + .orElse(dataSourceJdbcBuildTimeConfig.tracing()); if (tracingEnabled) { String rootTracingUrl = !jdbcUrl.startsWith(JDBC_TRACING_URL_PREFIX) @@ -173,7 +173,7 @@ public AgroalDataSource doCreateDataSource(String dataSourceName) { StringBuilder tracingURL = new StringBuilder(rootTracingUrl); - if (dataSourceJdbcRuntimeConfig.tracing.traceWithActiveSpanOnly) { + if (dataSourceJdbcRuntimeConfig.tracing().traceWithActiveSpanOnly()) { if (!tracingURL.toString().contains("?")) { tracingURL.append("?"); } @@ -181,12 +181,12 @@ public AgroalDataSource doCreateDataSource(String dataSourceName) { tracingURL.append("traceWithActiveSpanOnly=true"); } - if (dataSourceJdbcRuntimeConfig.tracing.ignoreForTracing.isPresent()) { + if (dataSourceJdbcRuntimeConfig.tracing().ignoreForTracing().isPresent()) { if (!tracingURL.toString().contains("?")) { tracingURL.append("?"); } - Arrays.stream(dataSourceJdbcRuntimeConfig.tracing.ignoreForTracing.get().split(";")) + Arrays.stream(dataSourceJdbcRuntimeConfig.tracing().ignoreForTracing().get().split(";")) .filter(query -> !query.isEmpty()) .forEach(query -> tracingURL.append("ignoreForTracing=") .append(query.replaceAll("\"", "\\\"")) @@ -209,7 +209,7 @@ public AgroalDataSource doCreateDataSource(String dataSourceName) { AgroalDataSourceConfigurationSupplier dataSourceConfiguration = new AgroalDataSourceConfigurationSupplier(); // Set pool-less mode - if (!dataSourceJdbcRuntimeConfig.poolingEnabled) { + if (!dataSourceJdbcRuntimeConfig.poolingEnabled()) { dataSourceConfiguration.dataSourceImplementation(DataSourceImplementation.AGROAL_POOLLESS); } @@ -257,7 +257,7 @@ public AgroalDataSource doCreateDataSource(String dataSourceName) { dataSource.setPoolInterceptors(interceptorList); } - if (dataSourceJdbcBuildTimeConfig.telemetry && dataSourceJdbcRuntimeConfig.telemetry.orElse(true)) { + if (dataSourceJdbcBuildTimeConfig.telemetry() && dataSourceJdbcRuntimeConfig.telemetry().orElse(true)) { // activate OpenTelemetry JDBC instrumentation by wrapping AgroalDatasource // use an optional CDI bean as we can't reference optional OpenTelemetry classes here dataSource = agroalOpenTelemetryWrapper.get().apply(dataSource); @@ -274,22 +274,22 @@ private void applyNewConfiguration(String dataSourceName, AgroalDataSourceConfig boolean mpMetricsPresent) { connectionFactoryConfiguration.jdbcUrl(jdbcUrl); connectionFactoryConfiguration.connectionProviderClass(driver); - connectionFactoryConfiguration.trackJdbcResources(dataSourceJdbcRuntimeConfig.detectStatementLeaks); + connectionFactoryConfiguration.trackJdbcResources(dataSourceJdbcRuntimeConfig.detectStatementLeaks()); - if (dataSourceJdbcRuntimeConfig.transactionIsolationLevel.isPresent()) { + if (dataSourceJdbcRuntimeConfig.transactionIsolationLevel().isPresent()) { connectionFactoryConfiguration .jdbcTransactionIsolation( - dataSourceJdbcRuntimeConfig.transactionIsolationLevel.get()); + dataSourceJdbcRuntimeConfig.transactionIsolationLevel().get()); } - if (dataSourceJdbcBuildTimeConfig.transactions != io.quarkus.agroal.runtime.TransactionIntegration.DISABLED) { + if (dataSourceJdbcBuildTimeConfig.transactions() != io.quarkus.agroal.runtime.TransactionIntegration.DISABLED) { TransactionIntegration txIntegration = new NarayanaTransactionIntegration(transactionManager, transactionSynchronizationRegistry, null, false, - dataSourceJdbcBuildTimeConfig.transactions == io.quarkus.agroal.runtime.TransactionIntegration.XA + dataSourceJdbcBuildTimeConfig.transactions() == io.quarkus.agroal.runtime.TransactionIntegration.XA && transactionRuntimeConfig.enableRecovery ? xaResourceRecoveryRegistry : null); - if (dataSourceJdbcBuildTimeConfig.transactions == io.quarkus.agroal.runtime.TransactionIntegration.XA + if (dataSourceJdbcBuildTimeConfig.transactions() == io.quarkus.agroal.runtime.TransactionIntegration.XA && !transactionRuntimeConfig.enableRecovery) { log.warnv( "Datasource {0} enables XA but transaction recovery is not enabled. Please enable transaction recovery by setting quarkus.transaction-manager.enable-recovery=true, otherwise data may be lost if the application is terminated abruptly", @@ -299,64 +299,62 @@ private void applyNewConfiguration(String dataSourceName, AgroalDataSourceConfig } // New connection SQL - if (dataSourceJdbcRuntimeConfig.newConnectionSql.isPresent()) { - connectionFactoryConfiguration.initialSql(dataSourceJdbcRuntimeConfig.newConnectionSql.get()); + if (dataSourceJdbcRuntimeConfig.newConnectionSql().isPresent()) { + connectionFactoryConfiguration.initialSql(dataSourceJdbcRuntimeConfig.newConnectionSql().get()); } // metrics - if (dataSourceJdbcBuildTimeConfig.enableMetrics.isPresent()) { - dataSourceConfiguration.metricsEnabled(dataSourceJdbcBuildTimeConfig.enableMetrics.get()); + if (dataSourceJdbcBuildTimeConfig.enableMetrics().isPresent()) { + dataSourceConfiguration.metricsEnabled(dataSourceJdbcBuildTimeConfig.enableMetrics().get()); } else { // if the enable-metrics property is unspecified, treat it as true if MP Metrics are being exposed - dataSourceConfiguration.metricsEnabled(dataSourcesBuildTimeConfig.metricsEnabled && mpMetricsPresent); + dataSourceConfiguration.metricsEnabled(dataSourcesBuildTimeConfig.metricsEnabled() && mpMetricsPresent); } // Authentication - if (dataSourceRuntimeConfig.username.isPresent()) { - NamePrincipal username = new NamePrincipal(dataSourceRuntimeConfig.username.get()); + if (dataSourceRuntimeConfig.username().isPresent()) { + NamePrincipal username = new NamePrincipal(dataSourceRuntimeConfig.username().get()); connectionFactoryConfiguration .principal(username).recoveryPrincipal(username); } - if (dataSourceRuntimeConfig.password.isPresent()) { - SimplePassword password = new SimplePassword(dataSourceRuntimeConfig.password.get()); + if (dataSourceRuntimeConfig.password().isPresent()) { + SimplePassword password = new SimplePassword(dataSourceRuntimeConfig.password().get()); connectionFactoryConfiguration .credential(password).recoveryCredential(password); } // credentials provider - if (dataSourceRuntimeConfig.credentialsProvider.isPresent()) { - String beanName = dataSourceRuntimeConfig.credentialsProviderName.orElse(null); + if (dataSourceRuntimeConfig.credentialsProvider().isPresent()) { + String beanName = dataSourceRuntimeConfig.credentialsProviderName().orElse(null); CredentialsProvider credentialsProvider = CredentialsProviderFinder.find(beanName); - String name = dataSourceRuntimeConfig.credentialsProvider.get(); + String name = dataSourceRuntimeConfig.credentialsProvider().get(); connectionFactoryConfiguration .credential(new AgroalVaultCredentialsProviderPassword(name, credentialsProvider)); } // Extra JDBC properties - for (Map.Entry entry : dataSourceJdbcRuntimeConfig.additionalJdbcProperties.entrySet()) { + for (Map.Entry entry : dataSourceJdbcRuntimeConfig.additionalJdbcProperties().entrySet()) { connectionFactoryConfiguration.jdbcProperty(entry.getKey(), entry.getValue()); } // Pool size configuration: - poolConfiguration.minSize(dataSourceJdbcRuntimeConfig.minSize); - poolConfiguration.maxSize(dataSourceJdbcRuntimeConfig.maxSize); - if (dataSourceJdbcRuntimeConfig.initialSize.isPresent() && dataSourceJdbcRuntimeConfig.initialSize.getAsInt() > 0) { - poolConfiguration.initialSize(dataSourceJdbcRuntimeConfig.initialSize.getAsInt()); + poolConfiguration.minSize(dataSourceJdbcRuntimeConfig.minSize()); + poolConfiguration.maxSize(dataSourceJdbcRuntimeConfig.maxSize()); + if (dataSourceJdbcRuntimeConfig.initialSize().isPresent() && dataSourceJdbcRuntimeConfig.initialSize().getAsInt() > 0) { + poolConfiguration.initialSize(dataSourceJdbcRuntimeConfig.initialSize().getAsInt()); } // Connection management poolConfiguration.connectionValidator(ConnectionValidator.defaultValidator()); - if (dataSourceJdbcRuntimeConfig.acquisitionTimeout.isPresent()) { - poolConfiguration.acquisitionTimeout(dataSourceJdbcRuntimeConfig.acquisitionTimeout.get()); + if (dataSourceJdbcRuntimeConfig.acquisitionTimeout().isPresent()) { + poolConfiguration.acquisitionTimeout(dataSourceJdbcRuntimeConfig.acquisitionTimeout().get()); } - if (dataSourceJdbcRuntimeConfig.backgroundValidationInterval.isPresent()) { - poolConfiguration.validationTimeout(dataSourceJdbcRuntimeConfig.backgroundValidationInterval.get()); + poolConfiguration.validationTimeout(dataSourceJdbcRuntimeConfig.backgroundValidationInterval()); + if (dataSourceJdbcRuntimeConfig.foregroundValidationInterval().isPresent()) { + poolConfiguration.idleValidationTimeout(dataSourceJdbcRuntimeConfig.foregroundValidationInterval().get()); } - if (dataSourceJdbcRuntimeConfig.foregroundValidationInterval.isPresent()) { - poolConfiguration.idleValidationTimeout(dataSourceJdbcRuntimeConfig.foregroundValidationInterval.get()); - } - if (dataSourceJdbcRuntimeConfig.validationQuerySql.isPresent()) { - String validationQuery = dataSourceJdbcRuntimeConfig.validationQuerySql.get(); + if (dataSourceJdbcRuntimeConfig.validationQuerySql().isPresent()) { + String validationQuery = dataSourceJdbcRuntimeConfig.validationQuerySql().get(); poolConfiguration.connectionValidator(new ConnectionValidator() { @Override @@ -371,62 +369,18 @@ public boolean isValid(Connection connection) { } }); } - if (dataSourceJdbcRuntimeConfig.idleRemovalInterval.isPresent()) { - poolConfiguration.reapTimeout(dataSourceJdbcRuntimeConfig.idleRemovalInterval.get()); - } - if (dataSourceJdbcRuntimeConfig.leakDetectionInterval.isPresent()) { - poolConfiguration.leakTimeout(dataSourceJdbcRuntimeConfig.leakDetectionInterval.get()); - } - if (dataSourceJdbcRuntimeConfig.maxLifetime.isPresent()) { - poolConfiguration.maxLifetime(dataSourceJdbcRuntimeConfig.maxLifetime.get()); - } - if (dataSourceJdbcRuntimeConfig.transactionRequirement.isPresent()) { - poolConfiguration.transactionRequirement(dataSourceJdbcRuntimeConfig.transactionRequirement.get()); - } - poolConfiguration.enhancedLeakReport(dataSourceJdbcRuntimeConfig.extendedLeakReport); - poolConfiguration.flushOnClose(dataSourceJdbcRuntimeConfig.flushOnClose); - } - - public DataSourceBuildTimeConfig getDataSourceBuildTimeConfig(String dataSourceName) { - if (DataSourceUtil.isDefault(dataSourceName)) { - return dataSourcesBuildTimeConfig.defaultDataSource; - } - - DataSourceBuildTimeConfig namedConfig = dataSourcesBuildTimeConfig.namedDataSources.get(dataSourceName); - - return namedConfig != null ? namedConfig : new DataSourceBuildTimeConfig(); - } - - public DataSourceJdbcBuildTimeConfig getDataSourceJdbcBuildTimeConfig(String dataSourceName) { - if (DataSourceUtil.isDefault(dataSourceName)) { - return dataSourcesJdbcBuildTimeConfig.jdbc; + poolConfiguration.reapTimeout(dataSourceJdbcRuntimeConfig.idleRemovalInterval()); + if (dataSourceJdbcRuntimeConfig.leakDetectionInterval().isPresent()) { + poolConfiguration.leakTimeout(dataSourceJdbcRuntimeConfig.leakDetectionInterval().get()); } - - DataSourceJdbcOuterNamedBuildTimeConfig namedOuterConfig = dataSourcesJdbcBuildTimeConfig.namedDataSources - .get(dataSourceName); - - return namedOuterConfig != null ? namedOuterConfig.jdbc : new DataSourceJdbcBuildTimeConfig(); - } - - public DataSourceRuntimeConfig getDataSourceRuntimeConfig(String dataSourceName) { - if (DataSourceUtil.isDefault(dataSourceName)) { - return dataSourcesRuntimeConfig.defaultDataSource; + if (dataSourceJdbcRuntimeConfig.maxLifetime().isPresent()) { + poolConfiguration.maxLifetime(dataSourceJdbcRuntimeConfig.maxLifetime().get()); } - - DataSourceRuntimeConfig namedConfig = dataSourcesRuntimeConfig.namedDataSources.get(dataSourceName); - - return namedConfig != null ? namedConfig : new DataSourceRuntimeConfig(); - } - - public DataSourceJdbcRuntimeConfig getDataSourceJdbcRuntimeConfig(String dataSourceName) { - if (DataSourceUtil.isDefault(dataSourceName)) { - return dataSourcesJdbcRuntimeConfig.jdbc; + if (dataSourceJdbcRuntimeConfig.transactionRequirement().isPresent()) { + poolConfiguration.transactionRequirement(dataSourceJdbcRuntimeConfig.transactionRequirement().get()); } - - DataSourceJdbcOuterNamedRuntimeConfig namedOuterConfig = dataSourcesJdbcRuntimeConfig.namedDataSources - .get(dataSourceName); - - return namedOuterConfig != null ? namedOuterConfig.jdbc : new DataSourceJdbcRuntimeConfig(); + poolConfiguration.enhancedLeakReport(dataSourceJdbcRuntimeConfig.extendedLeakReport()); + poolConfiguration.flushOnClose(dataSourceJdbcRuntimeConfig.flushOnClose()); } /** diff --git a/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSourcesJdbcBuildTimeConfig.java b/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSourcesJdbcBuildTimeConfig.java index 659eab0399b07..ed47c6fbff888 100644 --- a/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSourcesJdbcBuildTimeConfig.java +++ b/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSourcesJdbcBuildTimeConfig.java @@ -2,38 +2,37 @@ import java.util.Map; +import io.quarkus.datasource.common.runtime.DataSourceUtil; import io.quarkus.runtime.annotations.ConfigDocMapKey; import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithDefaults; +import io.smallrye.config.WithParentName; +import io.smallrye.config.WithUnnamedKey; -@ConfigRoot(name = "datasource", phase = ConfigPhase.BUILD_AND_RUN_TIME_FIXED) -public class DataSourcesJdbcBuildTimeConfig { +@ConfigMapping(prefix = "quarkus.datasource") +@ConfigRoot(phase = ConfigPhase.BUILD_AND_RUN_TIME_FIXED) +public interface DataSourcesJdbcBuildTimeConfig { /** - * The default datasource. - */ - @ConfigItem - public DataSourceJdbcBuildTimeConfig jdbc; - - /** - * Additional named datasources. + * Datasources. */ @ConfigDocSection @ConfigDocMapKey("datasource-name") - @ConfigItem(name = ConfigItem.PARENT) - public Map namedDataSources; + @WithParentName + @WithDefaults + @WithUnnamedKey(DataSourceUtil.DEFAULT_DATASOURCE_NAME) + Map dataSources(); @ConfigGroup - public static class DataSourceJdbcOuterNamedBuildTimeConfig { + public interface DataSourceJdbcOuterNamedBuildTimeConfig { /** * The JDBC build time configuration. */ - @ConfigItem - public DataSourceJdbcBuildTimeConfig jdbc; + DataSourceJdbcBuildTimeConfig jdbc(); } - } diff --git a/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSourcesJdbcRuntimeConfig.java b/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSourcesJdbcRuntimeConfig.java index d39b134bb45a0..a2b406a2dc6ec 100644 --- a/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSourcesJdbcRuntimeConfig.java +++ b/extensions/agroal/runtime/src/main/java/io/quarkus/agroal/runtime/DataSourcesJdbcRuntimeConfig.java @@ -2,37 +2,48 @@ import java.util.Map; +import io.quarkus.datasource.common.runtime.DataSourceUtil; import io.quarkus.runtime.annotations.ConfigDocMapKey; import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithDefaults; +import io.smallrye.config.WithParentName; -@ConfigRoot(name = "datasource", phase = ConfigPhase.RUN_TIME) -public class DataSourcesJdbcRuntimeConfig { +@ConfigMapping(prefix = "quarkus.datasource") +@ConfigRoot(phase = ConfigPhase.RUN_TIME) +public interface DataSourcesJdbcRuntimeConfig { /** * The default datasource. */ - @ConfigItem - public DataSourceJdbcRuntimeConfig jdbc; + DataSourceJdbcRuntimeConfig jdbc(); /** * Additional named datasources. */ @ConfigDocSection @ConfigDocMapKey("datasource-name") - @ConfigItem(name = ConfigItem.PARENT) - public Map namedDataSources; + @WithParentName + @WithDefaults + Map namedDataSources(); @ConfigGroup - public static class DataSourceJdbcOuterNamedRuntimeConfig { + public interface DataSourceJdbcOuterNamedRuntimeConfig { /** * The JDBC runtime configuration. */ - @ConfigItem - public DataSourceJdbcRuntimeConfig jdbc; + DataSourceJdbcRuntimeConfig jdbc(); + } + + default DataSourceJdbcRuntimeConfig getDataSourceJdbcRuntimeConfig(String dataSourceName) { + if (DataSourceUtil.isDefault(dataSourceName)) { + return jdbc(); + } + + return namedDataSources().get(dataSourceName).jdbc(); } } diff --git a/extensions/datasource/deployment-spi/src/main/java/io/quarkus/datasource/deployment/spi/DevServicesDatasourceProvider.java b/extensions/datasource/deployment-spi/src/main/java/io/quarkus/datasource/deployment/spi/DevServicesDatasourceProvider.java index 3143f78636025..2f68e8bd7b1fa 100644 --- a/extensions/datasource/deployment-spi/src/main/java/io/quarkus/datasource/deployment/spi/DevServicesDatasourceProvider.java +++ b/extensions/datasource/deployment-spi/src/main/java/io/quarkus/datasource/deployment/spi/DevServicesDatasourceProvider.java @@ -4,15 +4,36 @@ import java.time.Duration; import java.util.Optional; +import io.quarkus.datasource.common.runtime.DataSourceUtil; import io.quarkus.runtime.LaunchMode; public interface DevServicesDatasourceProvider { - RunningDevServicesDatasource startDatabase(Optional username, Optional password, + /** + * @deprecated implement + * {@link #startDatabase(Optional, Optional, String, DevServicesDatasourceContainerConfig, LaunchMode, Optional)} + * instead + */ + @Deprecated(since = "3.3.0", forRemoval = true) + default RunningDevServicesDatasource startDatabase(Optional username, Optional password, Optional datasourceName, DevServicesDatasourceContainerConfig devServicesDatasourceContainerConfig, LaunchMode launchMode, - Optional startupTimeout); + Optional startupTimeout) { + throw new IllegalStateException( + "Please implement startDatabase(Optional, Optional, String, DevServicesDatasourceContainerConfig, LaunchMode, Optional)"); + } + + default RunningDevServicesDatasource startDatabase(Optional username, Optional password, + String datasourceName, + DevServicesDatasourceContainerConfig devServicesDatasourceContainerConfig, + LaunchMode launchMode, + Optional startupTimeout) { + return startDatabase(username, password, + DataSourceUtil.isDefault(datasourceName) ? Optional.empty() : Optional.of(datasourceName), + devServicesDatasourceContainerConfig, launchMode, + startupTimeout); + } default boolean isDockerRequired() { return true; diff --git a/extensions/datasource/deployment-spi/src/main/java/io/quarkus/datasource/deployment/spi/DevServicesDatasourceResultBuildItem.java b/extensions/datasource/deployment-spi/src/main/java/io/quarkus/datasource/deployment/spi/DevServicesDatasourceResultBuildItem.java index 2cbd92f923a5b..e3e996d293d8b 100644 --- a/extensions/datasource/deployment-spi/src/main/java/io/quarkus/datasource/deployment/spi/DevServicesDatasourceResultBuildItem.java +++ b/extensions/datasource/deployment-spi/src/main/java/io/quarkus/datasource/deployment/spi/DevServicesDatasourceResultBuildItem.java @@ -3,34 +3,36 @@ import java.util.Collections; import java.util.Map; import java.util.Optional; +import java.util.stream.Collectors; import io.quarkus.builder.item.SimpleBuildItem; import io.quarkus.datasource.common.runtime.DataSourceUtil; public final class DevServicesDatasourceResultBuildItem extends SimpleBuildItem { - final DbResult defaultDatasource; - final Map namedDatasources; + final Map dataSources; - public DevServicesDatasourceResultBuildItem(DbResult defaultDatasource, Map namedDatasources) { - this.defaultDatasource = defaultDatasource; - this.namedDatasources = Collections.unmodifiableMap(namedDatasources); + public DevServicesDatasourceResultBuildItem(Map dataSources) { + this.dataSources = Collections.unmodifiableMap(dataSources); } public DbResult getDefaultDatasource() { - return defaultDatasource; + return dataSources.get(DataSourceUtil.DEFAULT_DATASOURCE_NAME); } public Map getNamedDatasources() { - return namedDatasources; + return dataSources.entrySet().stream() + .filter(e -> !DataSourceUtil.isDefault(e.getKey())) + .collect(Collectors.toUnmodifiableMap(e -> e.getKey(), e -> e.getValue())); + } + + public Map getDatasources() { + return dataSources; } public static DbResult resolve(Optional devDbResultBuildItem, String dataSourceName) { if (devDbResultBuildItem.isPresent()) { - if (dataSourceName.equals(DataSourceUtil.DEFAULT_DATASOURCE_NAME)) { - return devDbResultBuildItem.get().defaultDatasource; - } - return devDbResultBuildItem.get().namedDatasources.get(dataSourceName); + return devDbResultBuildItem.get().dataSources.get(dataSourceName); } return null; } diff --git a/extensions/datasource/deployment/src/main/java/io/quarkus/datasource/deployment/DataSourceBindingProcessor.java b/extensions/datasource/deployment/src/main/java/io/quarkus/datasource/deployment/DataSourceBindingProcessor.java index 93d491ca7f316..9c3ce3a07b926 100644 --- a/extensions/datasource/deployment/src/main/java/io/quarkus/datasource/deployment/DataSourceBindingProcessor.java +++ b/extensions/datasource/deployment/src/main/java/io/quarkus/datasource/deployment/DataSourceBindingProcessor.java @@ -1,6 +1,6 @@ +package io.quarkus.datasource.deployment; -package io.quarkus.agroal.deployment; - +import io.quarkus.datasource.common.runtime.DataSourceUtil; import io.quarkus.datasource.runtime.DataSourcesBuildTimeConfig; import io.quarkus.deployment.annotations.BuildProducer; import io.quarkus.deployment.annotations.BuildStep; @@ -8,18 +8,17 @@ public class DataSourceBindingProcessor { - private static final String DB_KIND = "DB_KIND"; private static final String DEFAULT_DATASOURCE = "default"; @BuildStep public void process(DataSourcesBuildTimeConfig config, BuildProducer bindings) { - config.defaultDataSource.dbKind.ifPresent(k -> { - bindings.produce(new ServiceBindingQualifierBuildItem(k, k, DEFAULT_DATASOURCE)); - }); - - config.namedDataSources.forEach((n, c) -> { - c.dbKind.ifPresent(dbKind -> { - bindings.produce(new ServiceBindingQualifierBuildItem(dbKind, n)); + config.dataSources().forEach((name, c) -> { + c.dbKind().ifPresent(dbKind -> { + if (DataSourceUtil.isDefault(name)) { + bindings.produce(new ServiceBindingQualifierBuildItem(dbKind, dbKind, DEFAULT_DATASOURCE)); + } else { + bindings.produce(new ServiceBindingQualifierBuildItem(dbKind, name)); + } }); }); } diff --git a/extensions/datasource/deployment/src/main/java/io/quarkus/datasource/deployment/devservices/DevServicesDatasourceProcessor.java b/extensions/datasource/deployment/src/main/java/io/quarkus/datasource/deployment/devservices/DevServicesDatasourceProcessor.java index 972159252707b..b3d8fe8644e54 100644 --- a/extensions/datasource/deployment/src/main/java/io/quarkus/datasource/deployment/devservices/DevServicesDatasourceProcessor.java +++ b/extensions/datasource/deployment/src/main/java/io/quarkus/datasource/deployment/devservices/DevServicesDatasourceProcessor.java @@ -65,7 +65,7 @@ DevServicesDatasourceResultBuildItem launchDatabases( DockerStatusBuildItem dockerStatusBuildItem, List installedDrivers, List devDBProviders, - DataSourcesBuildTimeConfig dataSourceBuildTimeConfig, + DataSourcesBuildTimeConfig dataSourcesBuildTimeConfig, LaunchModeBuildItem launchMode, List configurationHandlerBuildItems, BuildProducer devServicesResultBuildItemBuildProducer, @@ -113,8 +113,8 @@ DevServicesDatasourceResultBuildItem launchDatabases( databases = null; cachedProperties = null; } - DevServicesDatasourceResultBuildItem.DbResult defaultResult; - Map namedResults = new HashMap<>(); + + Map results = new HashMap<>(); //now we need to figure out if we need to launch some databases //note that because we run in dev and test mode only we know the runtime //config at build time, as they both execute in the same JVM @@ -137,26 +137,16 @@ DevServicesDatasourceResultBuildItem launchDatabases( Map devDBProviderMap = devDBProviders.stream() .collect(Collectors.toMap(DevServicesDatasourceProviderBuildItem::getDatabase, DevServicesDatasourceProviderBuildItem::getDevServicesProvider)); - RunningDevService defaultDevService = startDevDb(null, capabilities, curateOutcomeBuildItem, installedDrivers, - !dataSourceBuildTimeConfig.namedDataSources.isEmpty(), - devDBProviderMap, - dataSourceBuildTimeConfig.defaultDataSource, - configHandlersByDbType, propertiesMap, - dockerStatusBuildItem, launchMode.getLaunchMode(), consoleInstalledBuildItem, - loggingSetupBuildItem, globalDevServicesConfig); - if (defaultDevService != null) { - runningDevServices.add(defaultDevService); - } - defaultResult = toDbResult(defaultDevService); - for (Map.Entry entry : dataSourceBuildTimeConfig.namedDataSources.entrySet()) { - RunningDevService namedDevService = startDevDb(entry.getKey(), capabilities, curateOutcomeBuildItem, - installedDrivers, true, + + for (Map.Entry entry : dataSourcesBuildTimeConfig.dataSources().entrySet()) { + RunningDevService devService = startDevDb(entry.getKey(), capabilities, curateOutcomeBuildItem, + installedDrivers, dataSourcesBuildTimeConfig.hasNamedDataSources(), devDBProviderMap, entry.getValue(), configHandlersByDbType, propertiesMap, dockerStatusBuildItem, launchMode.getLaunchMode(), consoleInstalledBuildItem, loggingSetupBuildItem, globalDevServicesConfig); - if (namedDevService != null) { - runningDevServices.add(namedDevService); - namedResults.put(entry.getKey(), toDbResult(namedDevService)); + if (devService != null) { + runningDevServices.add(devService); + results.put(entry.getKey(), toDbResult(devService)); } } @@ -186,7 +176,7 @@ public void run() { for (RunningDevService database : databases) { devServicesResultBuildItemBuildProducer.produce(database.toBuildItem()); } - return new DevServicesDatasourceResultBuildItem(defaultResult, namedResults); + return new DevServicesDatasourceResultBuildItem(results); } private String trim(String optional) { @@ -208,52 +198,53 @@ private RunningDevService startDevDb( DockerStatusBuildItem dockerStatusBuildItem, LaunchMode launchMode, Optional consoleInstalledBuildItem, LoggingSetupBuildItem loggingSetupBuildItem, GlobalDevServicesConfig globalDevServicesConfig) { - boolean explicitlyDisabled = !(dataSourceBuildTimeConfig.devservices.enabled.orElse(true)); + boolean explicitlyDisabled = !(dataSourceBuildTimeConfig.devservices().enabled().orElse(true)); + String dataSourcePrettyName = DataSourceUtil.isDefault(dbName) ? "default datasource" : "datasource" + dbName; + if (explicitlyDisabled) { //explicitly disabled - log.debug("Not starting Dev Services for " + (dbName == null ? "default datasource" : dbName) + log.debug("Not starting Dev Services for " + dataSourcePrettyName + " as it has been disabled in the configuration"); return null; } - Boolean enabled = dataSourceBuildTimeConfig.devservices.enabled.orElse(!hasNamedDatasources); + Boolean enabled = dataSourceBuildTimeConfig.devservices().enabled().orElse(!hasNamedDatasources); Optional defaultDbKind = DefaultDataSourceDbKindBuildItem.resolve( - dataSourceBuildTimeConfig.dbKind, + dataSourceBuildTimeConfig.dbKind(), installedDrivers, - dbName != null || enabled, + (!DataSourceUtil.isDefault(dbName)) || enabled, curateOutcomeBuildItem); if (!defaultDbKind.isPresent()) { //nothing we can do - log.warn("Unable to determine a database type for " + (dbName == null ? "default datasource" : dbName)); + log.warn("Unable to determine a database type for " + dataSourcePrettyName); return null; } DevServicesDatasourceProvider devDbProvider = devDBProviders.get(defaultDbKind.get()); List configHandlers = configurationHandlerBuildItems .get(defaultDbKind.get()); if (devDbProvider == null || configHandlers == null) { - log.warn("Unable to start Dev Services for " + (dbName == null ? "default datasource" : dbName) + log.warn("Unable to start Dev Services for " + dataSourcePrettyName + " as this datasource type (" + defaultDbKind.get() + ") does not support Dev Services"); return null; } - if (dataSourceBuildTimeConfig.devservices.enabled.isEmpty()) { + if (dataSourceBuildTimeConfig.devservices().enabled().isEmpty()) { for (DevServicesDatasourceConfigurationHandlerBuildItem i : configHandlers) { if (i.getCheckConfiguredFunction().test(dbName)) { //this database has explicit configuration //we don't start the devservices - log.debug("Not starting Dev Services for " + (dbName == null ? "default datasource" : dbName) + log.debug("Not starting Dev Services for " + dataSourcePrettyName + " as it has explicit configuration"); return null; } } } - String prettyName = dbName == null ? "the default datasource" : " datasource '" + dbName + "'"; if (devDbProvider.isDockerRequired() && !dockerStatusBuildItem.isDockerAvailable()) { String message = "Please configure the datasource URL for " - + prettyName + + dataSourcePrettyName + " or ensure the Docker daemon is up and running."; if (launchMode == LaunchMode.TEST) { throw new IllegalStateException(message); @@ -268,24 +259,24 @@ private RunningDevService startDevDb( //ok, so we know we need to start one StartupLogCompressor compressor = new StartupLogCompressor( - (launchMode == LaunchMode.TEST ? "(test) " : "") + "Database for " + prettyName + (launchMode == LaunchMode.TEST ? "(test) " : "") + "Database for " + dataSourcePrettyName + " (" + defaultDbKind.get() + ") starting:", consoleInstalledBuildItem, loggingSetupBuildItem); try { DevServicesDatasourceContainerConfig containerConfig = new DevServicesDatasourceContainerConfig( - dataSourceBuildTimeConfig.devservices.imageName, - dataSourceBuildTimeConfig.devservices.containerEnv, - dataSourceBuildTimeConfig.devservices.containerProperties, - dataSourceBuildTimeConfig.devservices.properties, - dataSourceBuildTimeConfig.devservices.port, - dataSourceBuildTimeConfig.devservices.command, - dataSourceBuildTimeConfig.devservices.dbName, - dataSourceBuildTimeConfig.devservices.username, - dataSourceBuildTimeConfig.devservices.password, - dataSourceBuildTimeConfig.devservices.initScriptPath, - dataSourceBuildTimeConfig.devservices.volumes); + dataSourceBuildTimeConfig.devservices().imageName(), + dataSourceBuildTimeConfig.devservices().containerEnv(), + dataSourceBuildTimeConfig.devservices().containerProperties(), + dataSourceBuildTimeConfig.devservices().properties(), + dataSourceBuildTimeConfig.devservices().port(), + dataSourceBuildTimeConfig.devservices().command(), + dataSourceBuildTimeConfig.devservices().dbName(), + dataSourceBuildTimeConfig.devservices().username(), + dataSourceBuildTimeConfig.devservices().password(), + dataSourceBuildTimeConfig.devservices().initScriptPath(), + dataSourceBuildTimeConfig.devservices().volumes()); DevServicesDatasourceProvider.RunningDevServicesDatasource datasource = devDbProvider .startDatabase( @@ -293,27 +284,27 @@ private RunningDevService startDevDb( String.class), ConfigUtils.getFirstOptionalValue(DataSourceUtil.dataSourcePropertyKeys(dbName, "password"), String.class), - Optional.ofNullable(dbName), containerConfig, + dbName, containerConfig, launchMode, globalDevServicesConfig.timeout); for (String key : DataSourceUtil.dataSourcePropertyKeys(dbName, "db-kind")) { - propertiesMap.put(key, dataSourceBuildTimeConfig.dbKind.orElse(null)); + propertiesMap.put(key, dataSourceBuildTimeConfig.dbKind().orElse(null)); } String devServicesPrefix = "devservices."; - if (dataSourceBuildTimeConfig.devservices.command.isPresent()) { + if (dataSourceBuildTimeConfig.devservices().command().isPresent()) { setDataSourceProperties(propertiesMap, dbName, devServicesPrefix + "command", - dataSourceBuildTimeConfig.devservices.command.get()); + dataSourceBuildTimeConfig.devservices().command().get()); } - if (dataSourceBuildTimeConfig.devservices.imageName.isPresent()) { + if (dataSourceBuildTimeConfig.devservices().imageName().isPresent()) { setDataSourceProperties(propertiesMap, dbName, devServicesPrefix + "image-name", - dataSourceBuildTimeConfig.devservices.imageName.get()); + dataSourceBuildTimeConfig.devservices().imageName().get()); } - if (dataSourceBuildTimeConfig.devservices.port.isPresent()) { + if (dataSourceBuildTimeConfig.devservices().port().isPresent()) { setDataSourceProperties(propertiesMap, dbName, devServicesPrefix + "port", - Integer.toString(dataSourceBuildTimeConfig.devservices.port.getAsInt())); + Integer.toString(dataSourceBuildTimeConfig.devservices().port().getAsInt())); } - if (!dataSourceBuildTimeConfig.devservices.properties.isEmpty()) { - for (var e : dataSourceBuildTimeConfig.devservices.properties.entrySet()) { + if (!dataSourceBuildTimeConfig.devservices().properties().isEmpty()) { + for (var e : dataSourceBuildTimeConfig.devservices().properties().entrySet()) { setDataSourceProperties(propertiesMap, dbName, devServicesPrefix + "properties." + e.getKey(), e.getValue()); } @@ -342,9 +333,9 @@ private RunningDevService startDevDb( } compressor.close(); if (datasource.getId() == null) { - log.infof("Dev Services for %s (%s) started", prettyName, defaultDbKind.get()); + log.infof("Dev Services for %s (%s) started", dataSourcePrettyName, defaultDbKind.get()); } else { - log.infof("Dev Services for %s (%s) started - container ID is %s", prettyName, defaultDbKind.get(), + log.infof("Dev Services for %s (%s) started - container ID is %s", dataSourcePrettyName, defaultDbKind.get(), datasource.getId().length() > DOCKER_PS_ID_LENGTH ? datasource.getId().substring(0, DOCKER_PS_ID_LENGTH) : datasource.getId()); } diff --git a/extensions/datasource/deployment/src/main/java/io/quarkus/datasource/deployment/devui/DevUIDatasourceProcessor.java b/extensions/datasource/deployment/src/main/java/io/quarkus/datasource/deployment/devui/DevUIDatasourceProcessor.java index a491a377d0fd9..34eb3e5aa8785 100644 --- a/extensions/datasource/deployment/src/main/java/io/quarkus/datasource/deployment/devui/DevUIDatasourceProcessor.java +++ b/extensions/datasource/deployment/src/main/java/io/quarkus/datasource/deployment/devui/DevUIDatasourceProcessor.java @@ -20,7 +20,7 @@ CardPageBuildItem create(DataSourcesBuildTimeConfig dataSourceBuildTimeConfig) { List names = new ArrayList<>(); names.add(""); - names.addAll(dataSourceBuildTimeConfig.namedDataSources.keySet()); + names.addAll(dataSourceBuildTimeConfig.dataSources().keySet()); Collections.sort(names); card.addBuildTimeData("datasources", names); diff --git a/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourceBuildTimeConfig.java b/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourceBuildTimeConfig.java index 93002392d28aa..7601b28b9e5bb 100644 --- a/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourceBuildTimeConfig.java +++ b/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourceBuildTimeConfig.java @@ -3,18 +3,17 @@ import java.util.Optional; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; -import io.quarkus.runtime.annotations.ConvertWith; +import io.smallrye.config.WithConverter; +import io.smallrye.config.WithDefault; @ConfigGroup -public class DataSourceBuildTimeConfig { +public interface DataSourceBuildTimeConfig { /** * The kind of database we will connect to (e.g. h2, postgresql...). */ - @ConfigItem - @ConvertWith(DatabaseKindConverter.class) - public Optional dbKind = Optional.empty(); + @WithConverter(DatabaseKindConverter.class) + Optional dbKind(); /** * The version of the database we will connect to (e.g. '10.0'). @@ -45,14 +44,12 @@ public class DataSourceBuildTimeConfig { * * @asciidoclet */ - @ConfigItem - public Optional dbVersion = Optional.empty(); + Optional dbVersion(); /** * Configuration for DevServices. DevServices allows Quarkus to automatically start a database in dev and test mode. */ - @ConfigItem - public DevServicesBuildTimeConfig devservices; + DevServicesBuildTimeConfig devservices(); /** * Whether this particular data source should be excluded from the health check if @@ -60,7 +57,7 @@ public class DataSourceBuildTimeConfig { *

* By default, the health check includes all configured data sources (if it is enabled). */ - @ConfigItem(defaultValue = "false") - public boolean healthExclude; + @WithDefault("false") + boolean healthExclude(); } diff --git a/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourceRuntimeConfig.java b/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourceRuntimeConfig.java index d22a84034e54f..35e9162fb0fbe 100644 --- a/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourceRuntimeConfig.java +++ b/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourceRuntimeConfig.java @@ -3,31 +3,27 @@ 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; @ConfigGroup -public class DataSourceRuntimeConfig { +public interface DataSourceRuntimeConfig { /** * The datasource username */ - @ConfigItem - public Optional username = Optional.empty(); + Optional username(); /** * The datasource password */ - @ConfigItem - public Optional password = Optional.empty(); + Optional password(); /** * The credentials provider name */ - @ConfigItem - @ConvertWith(TrimmedStringConverter.class) - public Optional credentialsProvider = Optional.empty(); + @WithConverter(TrimmedStringConverter.class) + Optional credentialsProvider(); /** * The credentials provider bean name. @@ -37,7 +33,6 @@ public class DataSourceRuntimeConfig { *

* For Vault it is: vault-credentials-provider. Not necessary if there is only one credentials provider available. */ - @ConfigItem - @ConvertWith(TrimmedStringConverter.class) - public Optional credentialsProviderName = Optional.empty(); + @WithConverter(TrimmedStringConverter.class) + Optional credentialsProviderName(); } diff --git a/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourcesBuildTimeConfig.java b/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourcesBuildTimeConfig.java index 9cd6144e4b62b..b8cf1f61fa6b5 100644 --- a/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourcesBuildTimeConfig.java +++ b/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourcesBuildTimeConfig.java @@ -1,40 +1,42 @@ package io.quarkus.datasource.runtime; import java.util.Map; -import java.util.Objects; import java.util.Optional; import io.quarkus.datasource.common.runtime.DataSourceUtil; import io.quarkus.runtime.annotations.ConfigDocMapKey; import io.quarkus.runtime.annotations.ConfigDocSection; -import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithDefault; +import io.smallrye.config.WithDefaults; +import io.smallrye.config.WithName; +import io.smallrye.config.WithParentName; +import io.smallrye.config.WithUnnamedKey; -@ConfigRoot(name = "datasource", phase = ConfigPhase.BUILD_AND_RUN_TIME_FIXED) -public class DataSourcesBuildTimeConfig { +@ConfigMapping(prefix = "quarkus.datasource") +@ConfigRoot(phase = ConfigPhase.BUILD_AND_RUN_TIME_FIXED) +public interface DataSourcesBuildTimeConfig { /** - * The default datasource. - */ - @ConfigItem(name = ConfigItem.PARENT) - public DataSourceBuildTimeConfig defaultDataSource; - - /** - * Additional named datasources. + * Datasources. */ @ConfigDocSection @ConfigDocMapKey("datasource-name") - @ConfigItem(name = ConfigItem.PARENT) - public Map namedDataSources; + @WithParentName + @WithDefaults + @WithUnnamedKey(DataSourceUtil.DEFAULT_DATASOURCE_NAME) + Map dataSources(); /** * Whether or not an health check is published in case the smallrye-health extension is present. *

* This is a global setting and is not specific to a datasource. */ - @ConfigItem(name = "health.enabled", defaultValue = "true") - public boolean healthEnabled; + @WithName("health.enabled") + @WithDefault("true") + boolean healthEnabled(); /** * Whether or not datasource metrics are published in case a metrics extension is present. @@ -44,8 +46,9 @@ public class DataSourcesBuildTimeConfig { * NOTE: This is different from the "jdbc.enable-metrics" property that needs to be set on the JDBC datasource level to * enable collection of metrics for that datasource. */ - @ConfigItem(name = "metrics.enabled") - public boolean metricsEnabled; + @WithName("metrics.enabled") + @WithDefault("false") + boolean metricsEnabled(); /** * Only here to detect configuration errors. @@ -55,7 +58,7 @@ public class DataSourcesBuildTimeConfig { * @deprecated */ @Deprecated - public Optional url; + Optional url(); /** * Only here to detect configuration errors. @@ -63,14 +66,11 @@ public class DataSourcesBuildTimeConfig { * @deprecated */ @Deprecated - public Optional driver; + Optional driver(); - public DataSourceBuildTimeConfig getDataSourceRuntimeConfig(String dataSourceName) { - if (DataSourceUtil.isDefault(dataSourceName)) { - return defaultDataSource; - } - DataSourceBuildTimeConfig dataSourceBuildTimeConfig = namedDataSources.get(dataSourceName); - return Objects.requireNonNullElseGet(dataSourceBuildTimeConfig, DataSourceBuildTimeConfig::new); + default boolean hasNamedDataSources() { + return dataSources().keySet().size() > 1 + || (!dataSources().isEmpty() + && !dataSources().containsKey(DataSourceUtil.DEFAULT_DATASOURCE_NAME)); } - } diff --git a/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourcesHealthSupportRecorder.java b/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourcesHealthSupportRecorder.java index 1a59409ecdd9c..e39d700a6ed64 100644 --- a/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourcesHealthSupportRecorder.java +++ b/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourcesHealthSupportRecorder.java @@ -6,7 +6,6 @@ import java.util.Set; import java.util.stream.Stream; -import io.quarkus.datasource.common.runtime.DataSourceUtil; import io.quarkus.runtime.RuntimeValue; import io.quarkus.runtime.annotations.Recorder; @@ -17,15 +16,11 @@ public RuntimeValue configureDataSourcesHealthSupport( DataSourcesBuildTimeConfig config) { Stream.Builder configured = Stream.builder(); Stream.Builder excluded = Stream.builder(); - if (config.defaultDataSource.dbKind.isPresent()) { - configured.add(DataSourceUtil.DEFAULT_DATASOURCE_NAME); - } - if (config.defaultDataSource.healthExclude) { - excluded.add(DataSourceUtil.DEFAULT_DATASOURCE_NAME); - } - for (Map.Entry dataSource : config.namedDataSources.entrySet()) { - configured.add(dataSource.getKey()); - if (dataSource.getValue().healthExclude) { + for (Map.Entry dataSource : config.dataSources().entrySet()) { + if (dataSource.getValue().dbKind().isPresent()) { + configured.add(dataSource.getKey()); + } + if (dataSource.getValue().healthExclude()) { excluded.add(dataSource.getKey()); } } diff --git a/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourcesRuntimeConfig.java b/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourcesRuntimeConfig.java index cb89be3078820..91e24d97721d7 100644 --- a/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourcesRuntimeConfig.java +++ b/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourcesRuntimeConfig.java @@ -1,38 +1,28 @@ package io.quarkus.datasource.runtime; import java.util.Map; -import java.util.Objects; import io.quarkus.datasource.common.runtime.DataSourceUtil; import io.quarkus.runtime.annotations.ConfigDocMapKey; import io.quarkus.runtime.annotations.ConfigDocSection; -import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithDefaults; +import io.smallrye.config.WithParentName; +import io.smallrye.config.WithUnnamedKey; -@ConfigRoot(name = "datasource", phase = ConfigPhase.RUN_TIME) -public class DataSourcesRuntimeConfig { +@ConfigMapping(prefix = "quarkus.datasource") +@ConfigRoot(phase = ConfigPhase.RUN_TIME) +public interface DataSourcesRuntimeConfig { /** - * The default datasource. - */ - @ConfigItem(name = ConfigItem.PARENT) - public DataSourceRuntimeConfig defaultDataSource; - - /** - * Additional named datasources. + * Datasources. */ @ConfigDocSection @ConfigDocMapKey("datasource-name") - @ConfigItem(name = ConfigItem.PARENT) - public Map namedDataSources; - - public DataSourceRuntimeConfig getDataSourceRuntimeConfig(String dataSourceName) { - if (DataSourceUtil.isDefault(dataSourceName)) { - return defaultDataSource; - } - - DataSourceRuntimeConfig dataSourceRuntimeConfig = namedDataSources.get(dataSourceName); - return Objects.requireNonNullElseGet(dataSourceRuntimeConfig, DataSourceRuntimeConfig::new); - } + @WithParentName + @WithDefaults + @WithUnnamedKey(DataSourceUtil.DEFAULT_DATASOURCE_NAME) + Map dataSources(); } diff --git a/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DevServicesBuildTimeConfig.java b/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DevServicesBuildTimeConfig.java index d06573c422c20..074290a2f095c 100644 --- a/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DevServicesBuildTimeConfig.java +++ b/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DevServicesBuildTimeConfig.java @@ -5,10 +5,9 @@ import java.util.OptionalInt; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; @ConfigGroup -public class DevServicesBuildTimeConfig { +public interface DevServicesBuildTimeConfig { /** * If DevServices has been explicitly enabled or disabled. DevServices is generally enabled @@ -17,22 +16,19 @@ public class DevServicesBuildTimeConfig { * When DevServices is enabled Quarkus will attempt to automatically configure and start * a database when running in Dev or Test mode. */ - @ConfigItem - public Optional enabled = Optional.empty(); + Optional enabled(); /** * The container image name to use, for container based DevServices providers. * * If the provider is not container based (e.g. a H2 Database) then this has no effect. */ - @ConfigItem - public Optional imageName; + Optional imageName(); /** * Environment variables that are passed to the container. */ - @ConfigItem - public Map containerEnv; + Map containerEnv(); /** * Generic properties that are passed for additional container configuration. @@ -40,56 +36,48 @@ public class DevServicesBuildTimeConfig { * Properties defined here are database specific and are interpreted specifically in each database dev service * implementation. */ - @ConfigItem - public Map containerProperties; + Map containerProperties(); /** * Generic properties that are added to the database connection URL. */ - @ConfigItem - public Map properties; + Map properties(); /** * Optional fixed port the dev service will listen to. *

* If not defined, the port will be chosen randomly. */ - @ConfigItem - public OptionalInt port; + OptionalInt port(); /** * The container start command to use, for container based DevServices providers. * * If the provider is not container based (e.g. a H2 Database) then this has no effect. */ - @ConfigItem - public Optional command; + Optional command(); /** * The name of the database to use if this Dev Service supports overriding it. */ - @ConfigItem - public Optional dbName; + Optional dbName(); /** * The username to use if this Dev Service supports overriding it. */ - @ConfigItem - public Optional username; + Optional username(); /** * The password to use if this Dev Service supports overriding it. */ - @ConfigItem - public Optional password; + Optional password(); /** * Path to a SQL script that will be loaded from the classpath and applied to the Dev Service database * * If the provider is not container based (e.g. an H2 or Derby Database) then this has no effect. */ - @ConfigItem - public Optional initScriptPath; + Optional initScriptPath(); /** * The volumes to be mapped to the container. The map key corresponds to the host location and the map value is the @@ -101,6 +89,5 @@ public class DevServicesBuildTimeConfig { * * If the provider is not container based (e.g. an H2 or Derby Database) then this has no effect. */ - @ConfigItem - public Map volumes; + Map volumes(); } diff --git a/extensions/devservices/common/pom.xml b/extensions/devservices/common/pom.xml index 0bfc2c543a11d..ef138c2628b2f 100644 --- a/extensions/devservices/common/pom.xml +++ b/extensions/devservices/common/pom.xml @@ -39,5 +39,9 @@ io.quarkus quarkus-core + + io.quarkus + quarkus-datasource-common + diff --git a/extensions/devservices/common/src/main/java/io/quarkus/devservices/common/Labels.java b/extensions/devservices/common/src/main/java/io/quarkus/devservices/common/Labels.java index 716140b81a773..19d83ea1cee4c 100644 --- a/extensions/devservices/common/src/main/java/io/quarkus/devservices/common/Labels.java +++ b/extensions/devservices/common/src/main/java/io/quarkus/devservices/common/Labels.java @@ -1,15 +1,15 @@ package io.quarkus.devservices.common; -import java.util.Optional; - import org.testcontainers.containers.GenericContainer; +import io.quarkus.datasource.common.runtime.DataSourceUtil; + public final class Labels { private static final String DATASOURCE = "datasource"; - public static void addDataSourceLabel(GenericContainer container, Optional datasourceName) { - container.withLabel(DATASOURCE, datasourceName.orElse("default")); + public static void addDataSourceLabel(GenericContainer container, String datasourceName) { + container.withLabel(DATASOURCE, DataSourceUtil.isDefault(datasourceName) ? "default" : datasourceName); } private Labels() { diff --git a/extensions/devservices/db2/src/main/java/io/quarkus/devservices/db2/deployment/DB2DevServicesProcessor.java b/extensions/devservices/db2/src/main/java/io/quarkus/devservices/db2/deployment/DB2DevServicesProcessor.java index d6431842fc7fa..2cad0ed0641ed 100644 --- a/extensions/devservices/db2/src/main/java/io/quarkus/devservices/db2/deployment/DB2DevServicesProcessor.java +++ b/extensions/devservices/db2/src/main/java/io/quarkus/devservices/db2/deployment/DB2DevServicesProcessor.java @@ -13,6 +13,7 @@ import org.testcontainers.containers.Db2Container; import org.testcontainers.utility.DockerImageName; +import io.quarkus.datasource.common.runtime.DataSourceUtil; import io.quarkus.datasource.common.runtime.DatabaseKind; import io.quarkus.datasource.deployment.spi.DevServicesDatasourceContainerConfig; import io.quarkus.datasource.deployment.spi.DevServicesDatasourceProvider; @@ -35,7 +36,7 @@ DevServicesDatasourceProviderBuildItem setupDB2( return new DevServicesDatasourceProviderBuildItem(DatabaseKind.DB2, new DevServicesDatasourceProvider() { @Override public RunningDevServicesDatasource startDatabase(Optional username, Optional password, - Optional datasourceName, DevServicesDatasourceContainerConfig containerConfig, + String datasourceName, DevServicesDatasourceContainerConfig containerConfig, LaunchMode launchMode, Optional startupTimeout) { QuarkusDb2Container container = new QuarkusDb2Container(containerConfig.getImageName(), containerConfig.getFixedExposedPort(), @@ -44,7 +45,8 @@ public RunningDevServicesDatasource startDatabase(Optional username, Opt String effectiveUsername = containerConfig.getUsername().orElse(username.orElse(DEFAULT_DATABASE_USERNAME)); String effectivePassword = containerConfig.getPassword().orElse(password.orElse(DEFAULT_DATABASE_PASSWORD)); - String effectiveDbName = containerConfig.getDbName().orElse(datasourceName.orElse(DEFAULT_DATABASE_NAME)); + String effectiveDbName = containerConfig.getDbName().orElse( + DataSourceUtil.isDefault(datasourceName) ? DEFAULT_DATABASE_NAME : datasourceName); container.withUsername(effectiveUsername) .withPassword(effectivePassword) diff --git a/extensions/devservices/derby/src/main/java/io/quarkus/devservices/derby/deployment/DerbyDevServicesProcessor.java b/extensions/devservices/derby/src/main/java/io/quarkus/devservices/derby/deployment/DerbyDevServicesProcessor.java index 7690a051671d6..2405dbfbc7430 100644 --- a/extensions/devservices/derby/src/main/java/io/quarkus/devservices/derby/deployment/DerbyDevServicesProcessor.java +++ b/extensions/devservices/derby/src/main/java/io/quarkus/devservices/derby/deployment/DerbyDevServicesProcessor.java @@ -13,6 +13,7 @@ import org.apache.derby.drda.NetworkServerControl; import org.jboss.logging.Logger; +import io.quarkus.datasource.common.runtime.DataSourceUtil; import io.quarkus.datasource.common.runtime.DatabaseKind; import io.quarkus.datasource.deployment.spi.DevServicesDatasourceContainerConfig; import io.quarkus.datasource.deployment.spi.DevServicesDatasourceProvider; @@ -32,14 +33,15 @@ DevServicesDatasourceProviderBuildItem setupDerby() { return new DevServicesDatasourceProviderBuildItem(DatabaseKind.DERBY, new DevServicesDatasourceProvider() { @Override public RunningDevServicesDatasource startDatabase(Optional username, Optional password, - Optional datasourceName, DevServicesDatasourceContainerConfig containerConfig, + String datasourceName, DevServicesDatasourceContainerConfig containerConfig, LaunchMode launchMode, Optional startupTimeout) { try { int port = containerConfig.getFixedExposedPort().isPresent() ? containerConfig.getFixedExposedPort().getAsInt() : 1527 + (launchMode == LaunchMode.TEST ? 0 : 1); - String effectiveDbName = containerConfig.getDbName().orElse(datasourceName.orElse(DEFAULT_DATABASE_NAME)); + String effectiveDbName = containerConfig.getDbName().orElse( + DataSourceUtil.isDefault(datasourceName) ? DEFAULT_DATABASE_NAME : datasourceName); NetworkServerControl server = new NetworkServerControl(InetAddress.getByName("localhost"), port); server.start(new PrintWriter(System.out)); diff --git a/extensions/devservices/h2/src/main/java/io/quarkus/devservices/h2/deployment/H2DevServicesProcessor.java b/extensions/devservices/h2/src/main/java/io/quarkus/devservices/h2/deployment/H2DevServicesProcessor.java index 2ff28f76a5d72..816befca62d33 100644 --- a/extensions/devservices/h2/src/main/java/io/quarkus/devservices/h2/deployment/H2DevServicesProcessor.java +++ b/extensions/devservices/h2/src/main/java/io/quarkus/devservices/h2/deployment/H2DevServicesProcessor.java @@ -17,6 +17,7 @@ import org.h2.tools.Server; import org.jboss.logging.Logger; +import io.quarkus.datasource.common.runtime.DataSourceUtil; import io.quarkus.datasource.common.runtime.DatabaseKind; import io.quarkus.datasource.deployment.spi.DevServicesDatasourceContainerConfig; import io.quarkus.datasource.deployment.spi.DevServicesDatasourceProvider; @@ -33,7 +34,7 @@ DevServicesDatasourceProviderBuildItem setupH2() { return new DevServicesDatasourceProviderBuildItem(DatabaseKind.H2, new DevServicesDatasourceProvider() { @Override public RunningDevServicesDatasource startDatabase(Optional username, Optional password, - Optional datasourceName, DevServicesDatasourceContainerConfig containerConfig, + String datasourceName, DevServicesDatasourceContainerConfig containerConfig, LaunchMode launchMode, Optional startupTimeout) { try { final Server tcpServer = Server.createTcpServer("-tcpPort", @@ -45,7 +46,8 @@ public RunningDevServicesDatasource startDatabase(Optional username, Opt String effectiveUsername = containerConfig.getUsername().orElse(username.orElse(DEFAULT_DATABASE_USERNAME)); String effectivePassword = containerConfig.getPassword().orElse(password.orElse(DEFAULT_DATABASE_PASSWORD)); - String effectiveDbName = containerConfig.getDbName().orElse(datasourceName.orElse(DEFAULT_DATABASE_NAME)); + String effectiveDbName = containerConfig.getDbName().orElse( + DataSourceUtil.isDefault(datasourceName) ? DEFAULT_DATABASE_NAME : datasourceName); StringBuilder additionalArgs = new StringBuilder(); for (Map.Entry i : containerConfig.getAdditionalJdbcUrlProperties().entrySet()) { diff --git a/extensions/devservices/mariadb/src/main/java/io/quarkus/devservices/mariadb/deployment/MariaDBDevServicesProcessor.java b/extensions/devservices/mariadb/src/main/java/io/quarkus/devservices/mariadb/deployment/MariaDBDevServicesProcessor.java index dfe710c68ae60..048906fdce73e 100644 --- a/extensions/devservices/mariadb/src/main/java/io/quarkus/devservices/mariadb/deployment/MariaDBDevServicesProcessor.java +++ b/extensions/devservices/mariadb/src/main/java/io/quarkus/devservices/mariadb/deployment/MariaDBDevServicesProcessor.java @@ -13,6 +13,7 @@ import org.testcontainers.containers.MariaDBContainer; import org.testcontainers.utility.DockerImageName; +import io.quarkus.datasource.common.runtime.DataSourceUtil; import io.quarkus.datasource.common.runtime.DatabaseKind; import io.quarkus.datasource.deployment.spi.DevServicesDatasourceContainerConfig; import io.quarkus.datasource.deployment.spi.DevServicesDatasourceProvider; @@ -39,7 +40,7 @@ DevServicesDatasourceProviderBuildItem setupMariaDB( @SuppressWarnings("unchecked") @Override public RunningDevServicesDatasource startDatabase(Optional username, Optional password, - Optional datasourceName, DevServicesDatasourceContainerConfig containerConfig, + String datasourceName, DevServicesDatasourceContainerConfig containerConfig, LaunchMode launchMode, Optional startupTimeout) { QuarkusMariaDBContainer container = new QuarkusMariaDBContainer(containerConfig.getImageName(), containerConfig.getFixedExposedPort(), @@ -48,7 +49,8 @@ public RunningDevServicesDatasource startDatabase(Optional username, Opt String effectiveUsername = containerConfig.getUsername().orElse(username.orElse(DEFAULT_DATABASE_USERNAME)); String effectivePassword = containerConfig.getPassword().orElse(password.orElse(DEFAULT_DATABASE_PASSWORD)); - String effectiveDbName = containerConfig.getDbName().orElse(datasourceName.orElse(DEFAULT_DATABASE_NAME)); + String effectiveDbName = containerConfig.getDbName().orElse( + DataSourceUtil.isDefault(datasourceName) ? DEFAULT_DATABASE_NAME : datasourceName); container.withUsername(effectiveUsername) .withPassword(effectivePassword) diff --git a/extensions/devservices/mssql/src/main/java/io/quarkus/devservices/mssql/deployment/MSSQLDevServicesProcessor.java b/extensions/devservices/mssql/src/main/java/io/quarkus/devservices/mssql/deployment/MSSQLDevServicesProcessor.java index 9cc82062f702b..7aa3c05e07d20 100644 --- a/extensions/devservices/mssql/src/main/java/io/quarkus/devservices/mssql/deployment/MSSQLDevServicesProcessor.java +++ b/extensions/devservices/mssql/src/main/java/io/quarkus/devservices/mssql/deployment/MSSQLDevServicesProcessor.java @@ -39,7 +39,7 @@ DevServicesDatasourceProviderBuildItem setupMSSQL( @SuppressWarnings("unchecked") @Override public RunningDevServicesDatasource startDatabase(Optional username, Optional password, - Optional datasourceName, DevServicesDatasourceContainerConfig containerConfig, + String datasourceName, DevServicesDatasourceContainerConfig containerConfig, LaunchMode launchMode, Optional startupTimeout) { QuarkusMSSQLServerContainer container = new QuarkusMSSQLServerContainer(containerConfig.getImageName(), containerConfig.getFixedExposedPort(), diff --git a/extensions/devservices/mysql/src/main/java/io/quarkus/devservices/mysql/deployment/MySQLDevServicesProcessor.java b/extensions/devservices/mysql/src/main/java/io/quarkus/devservices/mysql/deployment/MySQLDevServicesProcessor.java index cd884aa83b520..6121a7b25a511 100644 --- a/extensions/devservices/mysql/src/main/java/io/quarkus/devservices/mysql/deployment/MySQLDevServicesProcessor.java +++ b/extensions/devservices/mysql/src/main/java/io/quarkus/devservices/mysql/deployment/MySQLDevServicesProcessor.java @@ -13,6 +13,7 @@ import org.testcontainers.containers.MySQLContainer; import org.testcontainers.utility.DockerImageName; +import io.quarkus.datasource.common.runtime.DataSourceUtil; import io.quarkus.datasource.common.runtime.DatabaseKind; import io.quarkus.datasource.deployment.spi.DevServicesDatasourceContainerConfig; import io.quarkus.datasource.deployment.spi.DevServicesDatasourceProvider; @@ -38,7 +39,7 @@ DevServicesDatasourceProviderBuildItem setupMysql( @SuppressWarnings("unchecked") @Override public RunningDevServicesDatasource startDatabase(Optional username, Optional password, - Optional datasourceName, DevServicesDatasourceContainerConfig containerConfig, + String datasourceName, DevServicesDatasourceContainerConfig containerConfig, LaunchMode launchMode, Optional startupTimeout) { QuarkusMySQLContainer container = new QuarkusMySQLContainer(containerConfig.getImageName(), containerConfig.getFixedExposedPort(), @@ -47,7 +48,8 @@ public RunningDevServicesDatasource startDatabase(Optional username, Opt String effectiveUsername = containerConfig.getUsername().orElse(username.orElse(DEFAULT_DATABASE_USERNAME)); String effectivePassword = containerConfig.getPassword().orElse(password.orElse(DEFAULT_DATABASE_PASSWORD)); - String effectiveDbName = containerConfig.getDbName().orElse(datasourceName.orElse(DEFAULT_DATABASE_NAME)); + String effectiveDbName = containerConfig.getDbName().orElse( + DataSourceUtil.isDefault(datasourceName) ? DEFAULT_DATABASE_NAME : datasourceName); container.withUsername(effectiveUsername) .withPassword(effectivePassword) diff --git a/extensions/devservices/oracle/src/main/java/io/quarkus/devservices/oracle/deployment/OracleDevServicesProcessor.java b/extensions/devservices/oracle/src/main/java/io/quarkus/devservices/oracle/deployment/OracleDevServicesProcessor.java index aca0d9aef329f..eba12b7cd1396 100644 --- a/extensions/devservices/oracle/src/main/java/io/quarkus/devservices/oracle/deployment/OracleDevServicesProcessor.java +++ b/extensions/devservices/oracle/src/main/java/io/quarkus/devservices/oracle/deployment/OracleDevServicesProcessor.java @@ -13,6 +13,7 @@ import org.testcontainers.containers.OracleContainer; import org.testcontainers.utility.DockerImageName; +import io.quarkus.datasource.common.runtime.DataSourceUtil; import io.quarkus.datasource.common.runtime.DatabaseKind; import io.quarkus.datasource.deployment.spi.DevServicesDatasourceContainerConfig; import io.quarkus.datasource.deployment.spi.DevServicesDatasourceProvider; @@ -42,7 +43,7 @@ DevServicesDatasourceProviderBuildItem setupOracle( return new DevServicesDatasourceProviderBuildItem(DatabaseKind.ORACLE, new DevServicesDatasourceProvider() { @Override public RunningDevServicesDatasource startDatabase(Optional username, Optional password, - Optional datasourceName, DevServicesDatasourceContainerConfig containerConfig, + String datasourceName, DevServicesDatasourceContainerConfig containerConfig, LaunchMode launchMode, Optional startupTimeout) { QuarkusOracleServerContainer container = new QuarkusOracleServerContainer(containerConfig.getImageName(), containerConfig.getFixedExposedPort(), @@ -51,7 +52,8 @@ public RunningDevServicesDatasource startDatabase(Optional username, Opt String effectiveUsername = containerConfig.getUsername().orElse(username.orElse(DEFAULT_DATABASE_USERNAME)); String effectivePassword = containerConfig.getPassword().orElse(password.orElse(DEFAULT_DATABASE_PASSWORD)); - String effectiveDbName = containerConfig.getDbName().orElse(datasourceName.orElse(DEFAULT_DATABASE_NAME)); + String effectiveDbName = containerConfig.getDbName().orElse( + DataSourceUtil.isDefault(datasourceName) ? DEFAULT_DATABASE_NAME : datasourceName); container.withUsername(effectiveUsername) .withPassword(effectivePassword) diff --git a/extensions/devservices/postgresql/src/main/java/io/quarkus/devservices/postgresql/deployment/PostgresqlDevServicesProcessor.java b/extensions/devservices/postgresql/src/main/java/io/quarkus/devservices/postgresql/deployment/PostgresqlDevServicesProcessor.java index afaeb640fbfa8..b52c95c67892a 100644 --- a/extensions/devservices/postgresql/src/main/java/io/quarkus/devservices/postgresql/deployment/PostgresqlDevServicesProcessor.java +++ b/extensions/devservices/postgresql/src/main/java/io/quarkus/devservices/postgresql/deployment/PostgresqlDevServicesProcessor.java @@ -15,6 +15,7 @@ import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; import org.testcontainers.utility.DockerImageName; +import io.quarkus.datasource.common.runtime.DataSourceUtil; import io.quarkus.datasource.common.runtime.DatabaseKind; import io.quarkus.datasource.deployment.spi.DevServicesDatasourceContainerConfig; import io.quarkus.datasource.deployment.spi.DevServicesDatasourceProvider; @@ -45,7 +46,7 @@ DevServicesDatasourceProviderBuildItem setupPostgres( @SuppressWarnings("unchecked") @Override public RunningDevServicesDatasource startDatabase(Optional username, Optional password, - Optional datasourceName, DevServicesDatasourceContainerConfig containerConfig, + String datasourceName, DevServicesDatasourceContainerConfig containerConfig, LaunchMode launchMode, Optional startupTimeout) { QuarkusPostgreSQLContainer container = new QuarkusPostgreSQLContainer(containerConfig.getImageName(), containerConfig.getFixedExposedPort(), @@ -54,7 +55,8 @@ public RunningDevServicesDatasource startDatabase(Optional username, Opt String effectiveUsername = containerConfig.getUsername().orElse(username.orElse(DEFAULT_DATABASE_USERNAME)); String effectivePassword = containerConfig.getPassword().orElse(password.orElse(DEFAULT_DATABASE_PASSWORD)); - String effectiveDbName = containerConfig.getDbName().orElse(datasourceName.orElse(DEFAULT_DATABASE_NAME)); + String effectiveDbName = containerConfig.getDbName().orElse( + DataSourceUtil.isDefault(datasourceName) ? DEFAULT_DATABASE_NAME : datasourceName); container.withUsername(effectiveUsername) .withPassword(effectivePassword) diff --git a/extensions/hibernate-reactive/deployment/src/main/java/io/quarkus/hibernate/reactive/deployment/HibernateReactiveProcessor.java b/extensions/hibernate-reactive/deployment/src/main/java/io/quarkus/hibernate/reactive/deployment/HibernateReactiveProcessor.java index 72f7ce71a52ac..a6ac9c7e45224 100644 --- a/extensions/hibernate-reactive/deployment/src/main/java/io/quarkus/hibernate/reactive/deployment/HibernateReactiveProcessor.java +++ b/extensions/hibernate-reactive/deployment/src/main/java/io/quarkus/hibernate/reactive/deployment/HibernateReactiveProcessor.java @@ -38,6 +38,7 @@ import io.quarkus.datasource.common.runtime.DataSourceUtil; import io.quarkus.datasource.common.runtime.DatabaseKind; import io.quarkus.datasource.deployment.spi.DefaultDataSourceDbKindBuildItem; +import io.quarkus.datasource.runtime.DataSourceBuildTimeConfig; import io.quarkus.datasource.runtime.DataSourcesBuildTimeConfig; import io.quarkus.deployment.annotations.BuildProducer; import io.quarkus.deployment.annotations.BuildStep; @@ -157,13 +158,16 @@ public void buildReactivePersistenceUnit( } // we only support the default pool for now + DataSourceBuildTimeConfig defaultDataSourceBuildTimeConfig = dataSourcesBuildTimeConfig.dataSources() + .get(DataSourceUtil.DEFAULT_DATASOURCE_NAME); + Optional explicitDialect = hibernateOrmConfig.defaultPersistenceUnit.dialect.dialect; - Optional explicitDbMinVersion = dataSourcesBuildTimeConfig.defaultDataSource.dbVersion; + Optional explicitDbMinVersion = defaultDataSourceBuildTimeConfig.dbVersion(); Optional dbKindOptional = DefaultDataSourceDbKindBuildItem.resolve( - dataSourcesBuildTimeConfig.defaultDataSource.dbKind, + defaultDataSourceBuildTimeConfig.dbKind(), defaultDataSourceDbKindBuildItems, - dataSourcesBuildTimeConfig.defaultDataSource.devservices.enabled - .orElse(dataSourcesBuildTimeConfig.namedDataSources.isEmpty()), + defaultDataSourceBuildTimeConfig.devservices().enabled() + .orElse(!dataSourcesBuildTimeConfig.hasNamedDataSources()), curateOutcomeBuildItem); if (dbKindOptional.isPresent()) { diff --git a/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/DataSourceReactiveBuildTimeConfig.java b/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/DataSourceReactiveBuildTimeConfig.java index 087a4c5637d28..95559332f47fa 100644 --- a/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/DataSourceReactiveBuildTimeConfig.java +++ b/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/DataSourceReactiveBuildTimeConfig.java @@ -1,14 +1,16 @@ package io.quarkus.reactive.datasource.runtime; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; +import io.smallrye.config.WithDefault; +import io.smallrye.config.WithParentName; @ConfigGroup -public class DataSourceReactiveBuildTimeConfig { +public interface DataSourceReactiveBuildTimeConfig { /** * If we create a Reactive datasource for this datasource. */ - @ConfigItem(name = ConfigItem.PARENT, defaultValue = "true") - public boolean enabled = true; + @WithDefault("true") + @WithParentName + boolean enabled(); } diff --git a/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/DataSourceReactiveRuntimeConfig.java b/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/DataSourceReactiveRuntimeConfig.java index 7354c51d2ea48..bb7684f069189 100644 --- a/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/DataSourceReactiveRuntimeConfig.java +++ b/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/DataSourceReactiveRuntimeConfig.java @@ -1,27 +1,27 @@ package io.quarkus.reactive.datasource.runtime; import java.time.Duration; -import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.OptionalInt; +import io.quarkus.runtime.annotations.ConfigDocDefault; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.vertx.core.runtime.config.JksConfiguration; import io.quarkus.vertx.core.runtime.config.PemKeyCertConfiguration; import io.quarkus.vertx.core.runtime.config.PemTrustCertConfiguration; import io.quarkus.vertx.core.runtime.config.PfxConfiguration; +import io.smallrye.config.WithDefault; @ConfigGroup -public class DataSourceReactiveRuntimeConfig { +public interface DataSourceReactiveRuntimeConfig { /** * Whether prepared statements should be cached on the client side. */ - @ConfigItem(defaultValue = "false") - public boolean cachePreparedStatements = false; + @WithDefault("false") + boolean cachePreparedStatements(); /** * The datasource URLs. @@ -30,14 +30,13 @@ public class DataSourceReactiveRuntimeConfig { * The pool uses a round-robin load balancing when a connection is created to select different servers. * Note: some driver may not support multiple values here. */ - @ConfigItem - public Optional> url = Optional.empty(); + Optional> url(); /** * The datasource pool maximum size. */ - @ConfigItem(defaultValue = "20") - public int maxSize = 20; + @WithDefault("20") + int maxSize(); /** * When a new connection object is created, the pool assigns it an event loop. @@ -48,106 +47,96 @@ public class DataSourceReactiveRuntimeConfig { * If {@code #event-loop-size} is set to zero or a negative value, the pool assigns the current event loop to the new * connection. */ - @ConfigItem - public OptionalInt eventLoopSize = OptionalInt.empty(); + OptionalInt eventLoopSize(); /** * Whether all server certificates should be trusted. */ - @ConfigItem(defaultValue = "false") - public boolean trustAll = false; + @WithDefault("false") + boolean trustAll(); /** * Trust configuration in the PEM format. *

* When enabled, {@code #trust-certificate-jks} and {@code #trust-certificate-pfx} must be disabled. */ - @ConfigItem - public PemTrustCertConfiguration trustCertificatePem = new PemTrustCertConfiguration(); + PemTrustCertConfiguration trustCertificatePem(); /** * Trust configuration in the JKS format. *

* When enabled, {@code #trust-certificate-pem} and {@code #trust-certificate-pfx} must be disabled. */ - @ConfigItem - public JksConfiguration trustCertificateJks = new JksConfiguration(); + JksConfiguration trustCertificateJks(); /** * Trust configuration in the PFX format. *

* When enabled, {@code #trust-certificate-jks} and {@code #trust-certificate-pem} must be disabled. */ - @ConfigItem - public PfxConfiguration trustCertificatePfx = new PfxConfiguration(); + PfxConfiguration trustCertificatePfx(); /** * Key/cert configuration in the PEM format. *

* When enabled, {@code key-certificate-jks} and {@code #key-certificate-pfx} must be disabled. */ - @ConfigItem - public PemKeyCertConfiguration keyCertificatePem = new PemKeyCertConfiguration(); + PemKeyCertConfiguration keyCertificatePem(); /** * Key/cert configuration in the JKS format. *

* When enabled, {@code #key-certificate-pem} and {@code #key-certificate-pfx} must be disabled. */ - @ConfigItem - public JksConfiguration keyCertificateJks = new JksConfiguration(); + JksConfiguration keyCertificateJks(); /** * Key/cert configuration in the PFX format. *

* When enabled, {@code key-certificate-jks} and {@code #key-certificate-pem} must be disabled. */ - @ConfigItem - public PfxConfiguration keyCertificatePfx = new PfxConfiguration(); + PfxConfiguration keyCertificatePfx(); /** * The number of reconnection attempts when a pooled connection cannot be established on first try. */ - @ConfigItem(defaultValue = "0") - public int reconnectAttempts = 0; + @WithDefault("0") + int reconnectAttempts(); /** * The interval between reconnection attempts when a pooled connection cannot be established on first try. */ - @ConfigItem(defaultValue = "PT1S") - public Duration reconnectInterval = Duration.ofSeconds(1L); + @WithDefault("PT1S") + Duration reconnectInterval(); /** * The hostname verification algorithm to use in case the server's identity should be checked. * Should be HTTPS, LDAPS or an empty string. */ - @ConfigItem - public Optional hostnameVerificationAlgorithm = Optional.empty(); + Optional hostnameVerificationAlgorithm(); /** * The maximum time a connection remains unused in the pool before it is closed. */ - @ConfigItem(defaultValueDocumentation = "no timeout") - public Optional idleTimeout = Optional.empty(); + @ConfigDocDefault("no timeout") + Optional idleTimeout(); /** * Set to true to share the pool among datasources. * There can be multiple shared pools distinguished by name, when no specific name is set, * the __vertx.DEFAULT name is used. */ - @ConfigItem(defaultValue = "false") - public boolean shared; + @WithDefault("false") + boolean shared(); /** * Set the pool name, used when the pool is shared among datasources, otherwise ignored. */ - @ConfigItem - public Optional name = Optional.empty(); + Optional name(); /** * Other unspecified properties to be passed through the Reactive SQL Client directly to the database when new connections * are initiated. */ - @ConfigItem - public Map additionalProperties = Collections.emptyMap(); + Map additionalProperties(); } diff --git a/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/DataSourcesReactiveBuildTimeConfig.java b/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/DataSourcesReactiveBuildTimeConfig.java index a400ba23498d3..177b156266559 100644 --- a/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/DataSourcesReactiveBuildTimeConfig.java +++ b/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/DataSourcesReactiveBuildTimeConfig.java @@ -6,48 +6,46 @@ import io.quarkus.runtime.annotations.ConfigDocMapKey; import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithDefaults; +import io.smallrye.config.WithName; +import io.smallrye.config.WithParentName; -@ConfigRoot(name = "datasource", phase = ConfigPhase.BUILD_AND_RUN_TIME_FIXED) -public class DataSourcesReactiveBuildTimeConfig { +@ConfigMapping(prefix = "quarkus.datasource") +@ConfigRoot(phase = ConfigPhase.BUILD_AND_RUN_TIME_FIXED) +public interface DataSourcesReactiveBuildTimeConfig { /** * The default datasource. */ - @ConfigItem(name = "reactive") - public DataSourceReactiveBuildTimeConfig defaultDataSource; + @WithName("reactive") + DataSourceReactiveBuildTimeConfig defaultDataSource(); /** * Additional named datasources. */ @ConfigDocSection @ConfigDocMapKey("datasource-name") - @ConfigItem(name = ConfigItem.PARENT) - public Map namedDataSources; + @WithParentName + @WithDefaults + Map namedDataSources(); - public DataSourceReactiveBuildTimeConfig getDataSourceReactiveBuildTimeConfig(String dataSourceName) { + default DataSourceReactiveBuildTimeConfig getDataSourceReactiveBuildTimeConfig(String dataSourceName) { if (DataSourceUtil.isDefault(dataSourceName)) { - return defaultDataSource; + return defaultDataSource(); } - DataSourceReactiveOuterNamedBuildTimeConfig dataSourceReactiveOuterNamedBuildTimeConfig = namedDataSources - .get(dataSourceName); - if (dataSourceReactiveOuterNamedBuildTimeConfig == null) { - return new DataSourceReactiveBuildTimeConfig(); - } - - return dataSourceReactiveOuterNamedBuildTimeConfig.reactive; + return namedDataSources().get(dataSourceName).reactive(); } @ConfigGroup - public static class DataSourceReactiveOuterNamedBuildTimeConfig { + public interface DataSourceReactiveOuterNamedBuildTimeConfig { /** - * The JDBC build time configuration. + * The Reactive build time configuration. */ - @ConfigItem - public DataSourceReactiveBuildTimeConfig reactive; + public DataSourceReactiveBuildTimeConfig reactive(); } } diff --git a/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/DataSourcesReactiveRuntimeConfig.java b/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/DataSourcesReactiveRuntimeConfig.java index 5336e0ae705f2..4d2243e74fc30 100644 --- a/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/DataSourcesReactiveRuntimeConfig.java +++ b/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/DataSourcesReactiveRuntimeConfig.java @@ -6,48 +6,46 @@ import io.quarkus.runtime.annotations.ConfigDocMapKey; import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithDefaults; +import io.smallrye.config.WithName; +import io.smallrye.config.WithParentName; -@ConfigRoot(name = "datasource", phase = ConfigPhase.RUN_TIME) -public class DataSourcesReactiveRuntimeConfig { +@ConfigMapping(prefix = "quarkus.datasource") +@ConfigRoot(phase = ConfigPhase.RUN_TIME) +public interface DataSourcesReactiveRuntimeConfig { /** * The default datasource. */ - @ConfigItem(name = "reactive") - public DataSourceReactiveRuntimeConfig defaultDataSource; + @WithName("reactive") + DataSourceReactiveRuntimeConfig defaultDataSource(); /** * Additional named datasources. */ @ConfigDocSection @ConfigDocMapKey("datasource-name") - @ConfigItem(name = ConfigItem.PARENT) - public Map namedDataSources; + @WithParentName + @WithDefaults + Map namedDataSources(); - public DataSourceReactiveRuntimeConfig getDataSourceReactiveRuntimeConfig(String dataSourceName) { + default DataSourceReactiveRuntimeConfig getDataSourceReactiveRuntimeConfig(String dataSourceName) { if (DataSourceUtil.isDefault(dataSourceName)) { - return defaultDataSource; + return defaultDataSource(); } - DataSourceReactiveOuterNamedRuntimeConfig dataSourceReactiveOuterNamedRuntimeConfig = namedDataSources - .get(dataSourceName); - if (dataSourceReactiveOuterNamedRuntimeConfig == null) { - return new DataSourceReactiveRuntimeConfig(); - } - - return dataSourceReactiveOuterNamedRuntimeConfig.reactive; + return namedDataSources().get(dataSourceName).reactive(); } @ConfigGroup - public static class DataSourceReactiveOuterNamedRuntimeConfig { + public interface DataSourceReactiveOuterNamedRuntimeConfig { /** * The JDBC runtime configuration. */ - @ConfigItem - public DataSourceReactiveRuntimeConfig reactive; + public DataSourceReactiveRuntimeConfig reactive(); } } diff --git a/extensions/reactive-db2-client/deployment/src/main/java/io/quarkus/reactive/db2/client/deployment/ReactiveDB2ClientProcessor.java b/extensions/reactive-db2-client/deployment/src/main/java/io/quarkus/reactive/db2/client/deployment/ReactiveDB2ClientProcessor.java index 62d1e4691166d..4fef9763a80fd 100644 --- a/extensions/reactive-db2-client/deployment/src/main/java/io/quarkus/reactive/db2/client/deployment/ReactiveDB2ClientProcessor.java +++ b/extensions/reactive-db2-client/deployment/src/main/java/io/quarkus/reactive/db2/client/deployment/ReactiveDB2ClientProcessor.java @@ -80,12 +80,7 @@ ServiceStartBuildItem build(BuildProducer feature, feature.produce(new FeatureBuildItem(Feature.REACTIVE_DB2_CLIENT)); - createPoolIfDefined(recorder, vertx, eventLoopCount, shutdown, db2Pool, vertxPool, syntheticBeans, - DataSourceUtil.DEFAULT_DATASOURCE_NAME, dataSourcesBuildTimeConfig, - dataSourcesRuntimeConfig, dataSourcesReactiveBuildTimeConfig, dataSourcesReactiveRuntimeConfig, - dataSourcesReactiveDB2Config, defaultDataSourceDbKindBuildItems, curateOutcomeBuildItem); - - for (String dataSourceName : dataSourcesBuildTimeConfig.namedDataSources.keySet()) { + for (String dataSourceName : dataSourcesBuildTimeConfig.dataSources().keySet()) { createPoolIfDefined(recorder, vertx, eventLoopCount, shutdown, db2Pool, vertxPool, syntheticBeans, dataSourceName, dataSourcesBuildTimeConfig, dataSourcesRuntimeConfig, dataSourcesReactiveBuildTimeConfig, dataSourcesReactiveRuntimeConfig, dataSourcesReactiveDB2Config, defaultDataSourceDbKindBuildItems, @@ -165,7 +160,7 @@ void addHealthCheck( healthChecks.produce( new HealthBuildItem("io.quarkus.reactive.db2.client.runtime.health.ReactiveDB2DataSourcesHealthCheck", - dataSourcesBuildTimeConfig.healthEnabled)); + dataSourcesBuildTimeConfig.healthEnabled())); } private void createPoolIfDefined(DB2PoolRecorder recorder, @@ -229,14 +224,14 @@ private static boolean isReactiveDB2PoolDefined(DataSourcesBuildTimeConfig dataS List defaultDataSourceDbKindBuildItems, CurateOutcomeBuildItem curateOutcomeBuildItem) { DataSourceBuildTimeConfig dataSourceBuildTimeConfig = dataSourcesBuildTimeConfig - .getDataSourceRuntimeConfig(dataSourceName); + .dataSources().get(dataSourceName); DataSourceReactiveBuildTimeConfig dataSourceReactiveBuildTimeConfig = dataSourcesReactiveBuildTimeConfig .getDataSourceReactiveBuildTimeConfig(dataSourceName); - Optional dbKind = DefaultDataSourceDbKindBuildItem.resolve(dataSourceBuildTimeConfig.dbKind, + Optional dbKind = DefaultDataSourceDbKindBuildItem.resolve(dataSourceBuildTimeConfig.dbKind(), defaultDataSourceDbKindBuildItems, - !DataSourceUtil.isDefault(dataSourceName) || dataSourceBuildTimeConfig.devservices.enabled - .orElse(dataSourcesBuildTimeConfig.namedDataSources.isEmpty()), + !DataSourceUtil.isDefault(dataSourceName) || dataSourceBuildTimeConfig.devservices().enabled() + .orElse(!dataSourcesBuildTimeConfig.hasNamedDataSources()), curateOutcomeBuildItem); if (!dbKind.isPresent()) { @@ -244,7 +239,7 @@ private static boolean isReactiveDB2PoolDefined(DataSourcesBuildTimeConfig dataS } if (!DatabaseKind.isDB2(dbKind.get()) - || !dataSourceReactiveBuildTimeConfig.enabled) { + || !dataSourceReactiveBuildTimeConfig.enabled()) { return false; } @@ -260,7 +255,7 @@ private boolean hasPools(DataSourcesBuildTimeConfig dataSourcesBuildTimeConfig, return true; } - for (String dataSourceName : dataSourcesBuildTimeConfig.namedDataSources.keySet()) { + for (String dataSourceName : dataSourcesBuildTimeConfig.dataSources().keySet()) { if (isReactiveDB2PoolDefined(dataSourcesBuildTimeConfig, dataSourcesReactiveBuildTimeConfig, dataSourceName, defaultDataSourceDbKindBuildItems, curateOutcomeBuildItem)) { return true; diff --git a/extensions/reactive-db2-client/runtime/src/main/java/io/quarkus/reactive/db2/client/runtime/DB2PoolRecorder.java b/extensions/reactive-db2-client/runtime/src/main/java/io/quarkus/reactive/db2/client/runtime/DB2PoolRecorder.java index 57613bc95dbfb..55e13995babb1 100644 --- a/extensions/reactive-db2-client/runtime/src/main/java/io/quarkus/reactive/db2/client/runtime/DB2PoolRecorder.java +++ b/extensions/reactive-db2-client/runtime/src/main/java/io/quarkus/reactive/db2/client/runtime/DB2PoolRecorder.java @@ -56,9 +56,9 @@ public RuntimeValue configureDB2Pool(RuntimeValue vertx, DB2Pool db2Pool = initialize((VertxInternal) vertx.getValue(), eventLoopCount.get(), dataSourceName, - dataSourcesRuntimeConfig.getDataSourceRuntimeConfig(dataSourceName), + dataSourcesRuntimeConfig.dataSources().get(dataSourceName), dataSourcesReactiveRuntimeConfig.getDataSourceReactiveRuntimeConfig(dataSourceName), - dataSourcesReactiveDB2Config.getDataSourceReactiveRuntimeConfig(dataSourceName)); + dataSourcesReactiveDB2Config.dataSources().get(dataSourceName).reactive().db2()); shutdown.addShutdownTask(db2Pool::close); return new RuntimeValue<>(db2Pool); @@ -86,10 +86,10 @@ private DB2Pool initialize(VertxInternal vertx, private Supplier> toDatabasesSupplier(Vertx vertx, List db2ConnectOptionsList, DataSourceRuntimeConfig dataSourceRuntimeConfig) { Supplier> supplier; - if (dataSourceRuntimeConfig.credentialsProvider.isPresent()) { - String beanName = dataSourceRuntimeConfig.credentialsProviderName.orElse(null); + if (dataSourceRuntimeConfig.credentialsProvider().isPresent()) { + String beanName = dataSourceRuntimeConfig.credentialsProviderName().orElse(null); CredentialsProvider credentialsProvider = CredentialsProviderFinder.find(beanName); - String name = dataSourceRuntimeConfig.credentialsProvider.get(); + String name = dataSourceRuntimeConfig.credentialsProvider().get(); supplier = new ConnectOptionsSupplier<>(vertx, credentialsProvider, name, db2ConnectOptionsList, DB2ConnectOptions::new); } else { @@ -105,22 +105,22 @@ private PoolOptions toPoolOptions(Integer eventLoopCount, PoolOptions poolOptions; poolOptions = new PoolOptions(); - poolOptions.setMaxSize(dataSourceReactiveRuntimeConfig.maxSize); + poolOptions.setMaxSize(dataSourceReactiveRuntimeConfig.maxSize()); - if (dataSourceReactiveRuntimeConfig.idleTimeout.isPresent()) { - int idleTimeout = Math.toIntExact(dataSourceReactiveRuntimeConfig.idleTimeout.get().toMillis()); + if (dataSourceReactiveRuntimeConfig.idleTimeout().isPresent()) { + int idleTimeout = Math.toIntExact(dataSourceReactiveRuntimeConfig.idleTimeout().get().toMillis()); poolOptions.setIdleTimeout(idleTimeout).setIdleTimeoutUnit(TimeUnit.MILLISECONDS); } - if (dataSourceReactiveRuntimeConfig.shared) { + if (dataSourceReactiveRuntimeConfig.shared()) { poolOptions.setShared(true); - if (dataSourceReactiveRuntimeConfig.name.isPresent()) { - poolOptions.setName(dataSourceReactiveRuntimeConfig.name.get()); + if (dataSourceReactiveRuntimeConfig.name().isPresent()) { + poolOptions.setName(dataSourceReactiveRuntimeConfig.name().get()); } } - if (dataSourceReactiveRuntimeConfig.eventLoopSize.isPresent()) { - poolOptions.setEventLoopSize(Math.max(0, dataSourceReactiveRuntimeConfig.eventLoopSize.getAsInt())); + if (dataSourceReactiveRuntimeConfig.eventLoopSize().isPresent()) { + poolOptions.setEventLoopSize(Math.max(0, dataSourceReactiveRuntimeConfig.eventLoopSize().getAsInt())); } else if (eventLoopCount != null) { poolOptions.setEventLoopSize(Math.max(0, eventLoopCount)); } @@ -133,8 +133,8 @@ private DB2ConnectOptions toConnectOptions(String dataSourceName, DataSourceRunt DataSourceReactiveDB2Config dataSourceReactiveDB2Config) { DB2ConnectOptions connectOptions; - if (dataSourceReactiveRuntimeConfig.url.isPresent()) { - List urls = dataSourceReactiveRuntimeConfig.url.get(); + if (dataSourceReactiveRuntimeConfig.url().isPresent()) { + List urls = dataSourceReactiveRuntimeConfig.url().get(); if (urls.size() > 1) { log.warn("The Reactive DB2 client does not support multiple URLs. The first one will be used, and " + "others will be ignored."); @@ -149,19 +149,19 @@ private DB2ConnectOptions toConnectOptions(String dataSourceName, DataSourceRunt connectOptions = new DB2ConnectOptions(); } - if (dataSourceRuntimeConfig.username.isPresent()) { - connectOptions.setUser(dataSourceRuntimeConfig.username.get()); + if (dataSourceRuntimeConfig.username().isPresent()) { + connectOptions.setUser(dataSourceRuntimeConfig.username().get()); } - if (dataSourceRuntimeConfig.password.isPresent()) { - connectOptions.setPassword(dataSourceRuntimeConfig.password.get()); + if (dataSourceRuntimeConfig.password().isPresent()) { + connectOptions.setPassword(dataSourceRuntimeConfig.password().get()); } // credentials provider - if (dataSourceRuntimeConfig.credentialsProvider.isPresent()) { - String beanName = dataSourceRuntimeConfig.credentialsProviderName.orElse(null); + if (dataSourceRuntimeConfig.credentialsProvider().isPresent()) { + String beanName = dataSourceRuntimeConfig.credentialsProviderName().orElse(null); CredentialsProvider credentialsProvider = CredentialsProviderFinder.find(beanName); - String name = dataSourceRuntimeConfig.credentialsProvider.get(); + String name = dataSourceRuntimeConfig.credentialsProvider().get(); Map credentials = credentialsProvider.getCredentials(name); String user = credentials.get(USER_PROPERTY_NAME); String password = credentials.get(PASSWORD_PROPERTY_NAME); @@ -173,30 +173,30 @@ private DB2ConnectOptions toConnectOptions(String dataSourceName, DataSourceRunt } } - connectOptions.setCachePreparedStatements(dataSourceReactiveRuntimeConfig.cachePreparedStatements); + connectOptions.setCachePreparedStatements(dataSourceReactiveRuntimeConfig.cachePreparedStatements()); - connectOptions.setSsl(dataSourceReactiveDB2Config.ssl); + connectOptions.setSsl(dataSourceReactiveDB2Config.ssl()); - connectOptions.setTrustAll(dataSourceReactiveRuntimeConfig.trustAll); + connectOptions.setTrustAll(dataSourceReactiveRuntimeConfig.trustAll()); - configurePemTrustOptions(connectOptions, dataSourceReactiveRuntimeConfig.trustCertificatePem); - configureJksTrustOptions(connectOptions, dataSourceReactiveRuntimeConfig.trustCertificateJks); - configurePfxTrustOptions(connectOptions, dataSourceReactiveRuntimeConfig.trustCertificatePfx); + configurePemTrustOptions(connectOptions, dataSourceReactiveRuntimeConfig.trustCertificatePem()); + configureJksTrustOptions(connectOptions, dataSourceReactiveRuntimeConfig.trustCertificateJks()); + configurePfxTrustOptions(connectOptions, dataSourceReactiveRuntimeConfig.trustCertificatePfx()); - configurePemKeyCertOptions(connectOptions, dataSourceReactiveRuntimeConfig.keyCertificatePem); - configureJksKeyCertOptions(connectOptions, dataSourceReactiveRuntimeConfig.keyCertificateJks); - configurePfxKeyCertOptions(connectOptions, dataSourceReactiveRuntimeConfig.keyCertificatePfx); + configurePemKeyCertOptions(connectOptions, dataSourceReactiveRuntimeConfig.keyCertificatePem()); + configureJksKeyCertOptions(connectOptions, dataSourceReactiveRuntimeConfig.keyCertificateJks()); + configurePfxKeyCertOptions(connectOptions, dataSourceReactiveRuntimeConfig.keyCertificatePfx()); - connectOptions.setReconnectAttempts(dataSourceReactiveRuntimeConfig.reconnectAttempts); + connectOptions.setReconnectAttempts(dataSourceReactiveRuntimeConfig.reconnectAttempts()); - connectOptions.setReconnectInterval(dataSourceReactiveRuntimeConfig.reconnectInterval.toMillis()); + connectOptions.setReconnectInterval(dataSourceReactiveRuntimeConfig.reconnectInterval().toMillis()); - if (dataSourceReactiveRuntimeConfig.hostnameVerificationAlgorithm.isPresent()) { + if (dataSourceReactiveRuntimeConfig.hostnameVerificationAlgorithm().isPresent()) { connectOptions.setHostnameVerificationAlgorithm( - dataSourceReactiveRuntimeConfig.hostnameVerificationAlgorithm.get()); + dataSourceReactiveRuntimeConfig.hostnameVerificationAlgorithm().get()); } - dataSourceReactiveRuntimeConfig.additionalProperties.forEach(connectOptions::addProperty); + dataSourceReactiveRuntimeConfig.additionalProperties().forEach(connectOptions::addProperty); // Use the convention defined by Quarkus Micrometer Vert.x metrics to create metrics prefixed with db2. // and the client_name as tag. diff --git a/extensions/reactive-db2-client/runtime/src/main/java/io/quarkus/reactive/db2/client/runtime/DataSourceReactiveDB2Config.java b/extensions/reactive-db2-client/runtime/src/main/java/io/quarkus/reactive/db2/client/runtime/DataSourceReactiveDB2Config.java index bb0ac8a9e82c7..b0e31b203fefa 100644 --- a/extensions/reactive-db2-client/runtime/src/main/java/io/quarkus/reactive/db2/client/runtime/DataSourceReactiveDB2Config.java +++ b/extensions/reactive-db2-client/runtime/src/main/java/io/quarkus/reactive/db2/client/runtime/DataSourceReactiveDB2Config.java @@ -1,15 +1,15 @@ package io.quarkus.reactive.db2.client.runtime; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; +import io.smallrye.config.WithDefault; @ConfigGroup -public class DataSourceReactiveDB2Config { +public interface DataSourceReactiveDB2Config { /** * Whether SSL/TLS is enabled. */ - @ConfigItem(defaultValue = "false") - public boolean ssl = false; + @WithDefault("false") + public boolean ssl(); } diff --git a/extensions/reactive-db2-client/runtime/src/main/java/io/quarkus/reactive/db2/client/runtime/DataSourcesReactiveDB2Config.java b/extensions/reactive-db2-client/runtime/src/main/java/io/quarkus/reactive/db2/client/runtime/DataSourcesReactiveDB2Config.java index 669b1f2047ccb..b9dbd97c8d220 100644 --- a/extensions/reactive-db2-client/runtime/src/main/java/io/quarkus/reactive/db2/client/runtime/DataSourcesReactiveDB2Config.java +++ b/extensions/reactive-db2-client/runtime/src/main/java/io/quarkus/reactive/db2/client/runtime/DataSourcesReactiveDB2Config.java @@ -6,57 +6,43 @@ import io.quarkus.runtime.annotations.ConfigDocMapKey; import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithDefaults; +import io.smallrye.config.WithParentName; +import io.smallrye.config.WithUnnamedKey; -@ConfigRoot(name = "datasource", phase = ConfigPhase.RUN_TIME) -public class DataSourcesReactiveDB2Config { +@ConfigMapping(prefix = "quarkus.datasource") +@ConfigRoot(phase = ConfigPhase.RUN_TIME) +public interface DataSourcesReactiveDB2Config { /** - * The default datasource. - */ - @ConfigItem(name = "reactive.db2") - public DataSourceReactiveDB2Config defaultDataSource; - - /** - * Additional named datasources. + * Datasources. */ @ConfigDocSection @ConfigDocMapKey("datasource-name") - @ConfigItem(name = ConfigItem.PARENT) - public Map namedDataSources; - - public DataSourceReactiveDB2Config getDataSourceReactiveRuntimeConfig(String dataSourceName) { - if (DataSourceUtil.isDefault(dataSourceName)) { - return defaultDataSource; - } - - DataSourceReactiveDB2OuterNamedConfig dataSourceReactiveDB2OuterNamedConfig = namedDataSources - .get(dataSourceName); - if (dataSourceReactiveDB2OuterNamedConfig == null) { - return new DataSourceReactiveDB2Config(); - } - - return dataSourceReactiveDB2OuterNamedConfig.reactive.db2; - } + @WithParentName + @WithDefaults + @WithUnnamedKey(DataSourceUtil.DEFAULT_DATASOURCE_NAME) + Map dataSources(); @ConfigGroup - public static class DataSourceReactiveDB2OuterNamedConfig { + public interface DataSourceReactiveDB2OuterNamedConfig { /** * The DB2-specific configuration. */ - public DataSourceReactiveDB2OuterNestedNamedConfig reactive; + DataSourceReactiveDB2OuterNestedNamedConfig reactive(); } @ConfigGroup - public static class DataSourceReactiveDB2OuterNestedNamedConfig { + public interface DataSourceReactiveDB2OuterNestedNamedConfig { /** * The DB2-specific configuration. */ - public DataSourceReactiveDB2Config db2; + DataSourceReactiveDB2Config db2(); } } diff --git a/extensions/reactive-mssql-client/deployment/src/main/java/io/quarkus/reactive/mssql/client/deployment/ReactiveMSSQLClientProcessor.java b/extensions/reactive-mssql-client/deployment/src/main/java/io/quarkus/reactive/mssql/client/deployment/ReactiveMSSQLClientProcessor.java index b9a865020d1a1..ff740e9276ed2 100644 --- a/extensions/reactive-mssql-client/deployment/src/main/java/io/quarkus/reactive/mssql/client/deployment/ReactiveMSSQLClientProcessor.java +++ b/extensions/reactive-mssql-client/deployment/src/main/java/io/quarkus/reactive/mssql/client/deployment/ReactiveMSSQLClientProcessor.java @@ -80,12 +80,7 @@ ServiceStartBuildItem build(BuildProducer feature, feature.produce(new FeatureBuildItem(Feature.REACTIVE_MSSQL_CLIENT)); - createPoolIfDefined(recorder, vertx, eventLoopCount, shutdown, msSQLPool, vertxPool, syntheticBeans, - DataSourceUtil.DEFAULT_DATASOURCE_NAME, dataSourcesBuildTimeConfig, - dataSourcesRuntimeConfig, dataSourcesReactiveBuildTimeConfig, dataSourcesReactiveRuntimeConfig, - dataSourcesReactiveMSSQLConfig, defaultDataSourceDbKindBuildItems, curateOutcomeBuildItem); - - for (String dataSourceName : dataSourcesBuildTimeConfig.namedDataSources.keySet()) { + for (String dataSourceName : dataSourcesBuildTimeConfig.dataSources().keySet()) { createPoolIfDefined(recorder, vertx, eventLoopCount, shutdown, msSQLPool, vertxPool, syntheticBeans, dataSourceName, dataSourcesBuildTimeConfig, dataSourcesRuntimeConfig, dataSourcesReactiveBuildTimeConfig, dataSourcesReactiveRuntimeConfig, dataSourcesReactiveMSSQLConfig, defaultDataSourceDbKindBuildItems, @@ -165,7 +160,7 @@ void addHealthCheck( healthChecks.produce( new HealthBuildItem("io.quarkus.reactive.mssql.client.runtime.health.ReactiveMSSQLDataSourcesHealthCheck", - dataSourcesBuildTimeConfig.healthEnabled)); + dataSourcesBuildTimeConfig.healthEnabled())); } private void createPoolIfDefined(MSSQLPoolRecorder recorder, @@ -229,21 +224,21 @@ private static boolean isReactiveMSSQLPoolDefined(DataSourcesBuildTimeConfig dat List defaultDataSourceDbKindBuildItems, CurateOutcomeBuildItem curateOutcomeBuildItem) { DataSourceBuildTimeConfig dataSourceBuildTimeConfig = dataSourcesBuildTimeConfig - .getDataSourceRuntimeConfig(dataSourceName); + .dataSources().get(dataSourceName); DataSourceReactiveBuildTimeConfig dataSourceReactiveBuildTimeConfig = dataSourcesReactiveBuildTimeConfig .getDataSourceReactiveBuildTimeConfig(dataSourceName); - Optional dbKind = DefaultDataSourceDbKindBuildItem.resolve(dataSourceBuildTimeConfig.dbKind, + Optional dbKind = DefaultDataSourceDbKindBuildItem.resolve(dataSourceBuildTimeConfig.dbKind(), defaultDataSourceDbKindBuildItems, - !DataSourceUtil.isDefault(dataSourceName) || dataSourceBuildTimeConfig.devservices.enabled - .orElse(dataSourcesBuildTimeConfig.namedDataSources.isEmpty()), + !DataSourceUtil.isDefault(dataSourceName) || dataSourceBuildTimeConfig.devservices().enabled() + .orElse(!dataSourcesBuildTimeConfig.hasNamedDataSources()), curateOutcomeBuildItem); if (!dbKind.isPresent()) { return false; } if (!DatabaseKind.isMsSQL(dbKind.get()) - || !dataSourceReactiveBuildTimeConfig.enabled) { + || !dataSourceReactiveBuildTimeConfig.enabled()) { return false; } @@ -259,7 +254,7 @@ private boolean hasPools(DataSourcesBuildTimeConfig dataSourcesBuildTimeConfig, return true; } - for (String dataSourceName : dataSourcesBuildTimeConfig.namedDataSources.keySet()) { + for (String dataSourceName : dataSourcesBuildTimeConfig.dataSources().keySet()) { if (isReactiveMSSQLPoolDefined(dataSourcesBuildTimeConfig, dataSourcesReactiveBuildTimeConfig, dataSourceName, defaultDataSourceDbKindBuildItems, curateOutcomeBuildItem)) { return true; diff --git a/extensions/reactive-mssql-client/pom.xml b/extensions/reactive-mssql-client/pom.xml index 4dc267f914432..446792c43806f 100644 --- a/extensions/reactive-mssql-client/pom.xml +++ b/extensions/reactive-mssql-client/pom.xml @@ -14,7 +14,7 @@ quarkus-reactive-mssql-client-parent pom - Quarkus - Reactive MS SQL Client + Quarkus - Reactive Microsoft SQL Server Client deployment diff --git a/extensions/reactive-mssql-client/runtime/src/main/java/io/quarkus/reactive/mssql/client/runtime/DataSourceReactiveMSSQLConfig.java b/extensions/reactive-mssql-client/runtime/src/main/java/io/quarkus/reactive/mssql/client/runtime/DataSourceReactiveMSSQLConfig.java index d682728b6c667..68ae7a7d0bc58 100644 --- a/extensions/reactive-mssql-client/runtime/src/main/java/io/quarkus/reactive/mssql/client/runtime/DataSourceReactiveMSSQLConfig.java +++ b/extensions/reactive-mssql-client/runtime/src/main/java/io/quarkus/reactive/mssql/client/runtime/DataSourceReactiveMSSQLConfig.java @@ -3,21 +3,20 @@ import java.util.OptionalInt; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; +import io.smallrye.config.WithDefault; @ConfigGroup -public class DataSourceReactiveMSSQLConfig { +public interface DataSourceReactiveMSSQLConfig { /** * The desired size (in bytes) for TDS packets. */ - @ConfigItem - public OptionalInt packetSize = OptionalInt.empty(); + OptionalInt packetSize(); /** * Whether SSL/TLS is enabled. */ - @ConfigItem(defaultValue = "false") - public boolean ssl = false; + @WithDefault("false") + public boolean ssl(); } diff --git a/extensions/reactive-mssql-client/runtime/src/main/java/io/quarkus/reactive/mssql/client/runtime/DataSourcesReactiveMSSQLConfig.java b/extensions/reactive-mssql-client/runtime/src/main/java/io/quarkus/reactive/mssql/client/runtime/DataSourcesReactiveMSSQLConfig.java index 3b40b2d3d76e7..c7c16fb92d700 100644 --- a/extensions/reactive-mssql-client/runtime/src/main/java/io/quarkus/reactive/mssql/client/runtime/DataSourcesReactiveMSSQLConfig.java +++ b/extensions/reactive-mssql-client/runtime/src/main/java/io/quarkus/reactive/mssql/client/runtime/DataSourcesReactiveMSSQLConfig.java @@ -6,57 +6,43 @@ import io.quarkus.runtime.annotations.ConfigDocMapKey; import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithDefaults; +import io.smallrye.config.WithParentName; +import io.smallrye.config.WithUnnamedKey; -@ConfigRoot(name = "datasource", phase = ConfigPhase.RUN_TIME) -public class DataSourcesReactiveMSSQLConfig { +@ConfigMapping(prefix = "quarkus.datasource") +@ConfigRoot(phase = ConfigPhase.RUN_TIME) +public interface DataSourcesReactiveMSSQLConfig { /** - * The default datasource. - */ - @ConfigItem(name = "reactive.mssql") - public DataSourceReactiveMSSQLConfig defaultDataSource; - - /** - * Additional named datasources. + * Datasources. */ @ConfigDocSection @ConfigDocMapKey("datasource-name") - @ConfigItem(name = ConfigItem.PARENT) - public Map namedDataSources; - - public DataSourceReactiveMSSQLConfig getDataSourceReactiveRuntimeConfig(String dataSourceName) { - if (DataSourceUtil.isDefault(dataSourceName)) { - return defaultDataSource; - } - - DataSourceReactiveMSSQLOuterNamedConfig dataSourceReactiveMSSQLOuterNamedConfig = namedDataSources - .get(dataSourceName); - if (dataSourceReactiveMSSQLOuterNamedConfig == null) { - return new DataSourceReactiveMSSQLConfig(); - } - - return dataSourceReactiveMSSQLOuterNamedConfig.reactive.mssql; - } + @WithParentName + @WithDefaults + @WithUnnamedKey(DataSourceUtil.DEFAULT_DATASOURCE_NAME) + Map dataSources(); @ConfigGroup - public static class DataSourceReactiveMSSQLOuterNamedConfig { + public interface DataSourceReactiveMSSQLOuterNamedConfig { /** * The MSSQL-specific configuration. */ - public DataSourceReactiveMSSQLOuterNestedNamedConfig reactive; + DataSourceReactiveMSSQLOuterNestedNamedConfig reactive(); } @ConfigGroup - public static class DataSourceReactiveMSSQLOuterNestedNamedConfig { + public interface DataSourceReactiveMSSQLOuterNestedNamedConfig { /** * The MSSQL-specific configuration. */ - public DataSourceReactiveMSSQLConfig mssql; + DataSourceReactiveMSSQLConfig mssql(); } } diff --git a/extensions/reactive-mssql-client/runtime/src/main/java/io/quarkus/reactive/mssql/client/runtime/MSSQLPoolRecorder.java b/extensions/reactive-mssql-client/runtime/src/main/java/io/quarkus/reactive/mssql/client/runtime/MSSQLPoolRecorder.java index e57900425429c..8f8832035617a 100644 --- a/extensions/reactive-mssql-client/runtime/src/main/java/io/quarkus/reactive/mssql/client/runtime/MSSQLPoolRecorder.java +++ b/extensions/reactive-mssql-client/runtime/src/main/java/io/quarkus/reactive/mssql/client/runtime/MSSQLPoolRecorder.java @@ -40,7 +40,6 @@ import io.vertx.sqlclient.PoolOptions; import io.vertx.sqlclient.impl.Utils; -@SuppressWarnings("deprecation") @Recorder public class MSSQLPoolRecorder { @@ -57,9 +56,9 @@ public RuntimeValue configureMSSQLPool(RuntimeValue vertx, MSSQLPool mssqlPool = initialize((VertxInternal) vertx.getValue(), eventLoopCount.get(), dataSourceName, - dataSourcesRuntimeConfig.getDataSourceRuntimeConfig(dataSourceName), + dataSourcesRuntimeConfig.dataSources().get(dataSourceName), dataSourcesReactiveRuntimeConfig.getDataSourceReactiveRuntimeConfig(dataSourceName), - dataSourcesReactiveMSSQLConfig.getDataSourceReactiveRuntimeConfig(dataSourceName)); + dataSourcesReactiveMSSQLConfig.dataSources().get(dataSourceName).reactive().mssql()); shutdown.addShutdownTask(mssqlPool::close); return new RuntimeValue<>(mssqlPool); @@ -87,10 +86,10 @@ private Supplier> toDatabasesSupplier(Vertx vertx, List mssqlConnectOptionsList, DataSourceRuntimeConfig dataSourceRuntimeConfig) { Supplier> supplier; - if (dataSourceRuntimeConfig.credentialsProvider.isPresent()) { - String beanName = dataSourceRuntimeConfig.credentialsProviderName.orElse(null); + if (dataSourceRuntimeConfig.credentialsProvider().isPresent()) { + String beanName = dataSourceRuntimeConfig.credentialsProviderName().orElse(null); CredentialsProvider credentialsProvider = CredentialsProviderFinder.find(beanName); - String name = dataSourceRuntimeConfig.credentialsProvider.get(); + String name = dataSourceRuntimeConfig.credentialsProvider().get(); supplier = new ConnectOptionsSupplier<>(vertx, credentialsProvider, name, mssqlConnectOptionsList, MSSQLConnectOptions::new); } else { @@ -106,22 +105,22 @@ private PoolOptions toPoolOptions(Integer eventLoopCount, PoolOptions poolOptions; poolOptions = new PoolOptions(); - poolOptions.setMaxSize(dataSourceReactiveRuntimeConfig.maxSize); + poolOptions.setMaxSize(dataSourceReactiveRuntimeConfig.maxSize()); - if (dataSourceReactiveRuntimeConfig.idleTimeout.isPresent()) { - int idleTimeout = Math.toIntExact(dataSourceReactiveRuntimeConfig.idleTimeout.get().toMillis()); + if (dataSourceReactiveRuntimeConfig.idleTimeout().isPresent()) { + int idleTimeout = Math.toIntExact(dataSourceReactiveRuntimeConfig.idleTimeout().get().toMillis()); poolOptions.setIdleTimeout(idleTimeout).setIdleTimeoutUnit(TimeUnit.MILLISECONDS); } - if (dataSourceReactiveRuntimeConfig.shared) { + if (dataSourceReactiveRuntimeConfig.shared()) { poolOptions.setShared(true); - if (dataSourceReactiveRuntimeConfig.name.isPresent()) { - poolOptions.setName(dataSourceReactiveRuntimeConfig.name.get()); + if (dataSourceReactiveRuntimeConfig.name().isPresent()) { + poolOptions.setName(dataSourceReactiveRuntimeConfig.name().get()); } } - if (dataSourceReactiveRuntimeConfig.eventLoopSize.isPresent()) { - poolOptions.setEventLoopSize(Math.max(0, dataSourceReactiveRuntimeConfig.eventLoopSize.getAsInt())); + if (dataSourceReactiveRuntimeConfig.eventLoopSize().isPresent()) { + poolOptions.setEventLoopSize(Math.max(0, dataSourceReactiveRuntimeConfig.eventLoopSize().getAsInt())); } else if (eventLoopCount != null) { poolOptions.setEventLoopSize(Math.max(0, eventLoopCount)); } @@ -133,8 +132,8 @@ private MSSQLConnectOptions toMSSQLConnectOptions(String dataSourceName, DataSou DataSourceReactiveRuntimeConfig dataSourceReactiveRuntimeConfig, DataSourceReactiveMSSQLConfig dataSourceReactiveMSSQLConfig) { MSSQLConnectOptions mssqlConnectOptions; - if (dataSourceReactiveRuntimeConfig.url.isPresent()) { - List urls = dataSourceReactiveRuntimeConfig.url.get(); + if (dataSourceReactiveRuntimeConfig.url().isPresent()) { + List urls = dataSourceReactiveRuntimeConfig.url().get(); if (urls.size() > 1) { log.warn("The Reactive MSSQL client does not support multiple URLs. The first one will be used, and " + "others will be ignored."); @@ -149,23 +148,23 @@ private MSSQLConnectOptions toMSSQLConnectOptions(String dataSourceName, DataSou mssqlConnectOptions = new MSSQLConnectOptions(); } - if (dataSourceReactiveMSSQLConfig.packetSize.isPresent()) { - mssqlConnectOptions.setPacketSize(dataSourceReactiveMSSQLConfig.packetSize.getAsInt()); + if (dataSourceReactiveMSSQLConfig.packetSize().isPresent()) { + mssqlConnectOptions.setPacketSize(dataSourceReactiveMSSQLConfig.packetSize().getAsInt()); } - if (dataSourceRuntimeConfig.username.isPresent()) { - mssqlConnectOptions.setUser(dataSourceRuntimeConfig.username.get()); + if (dataSourceRuntimeConfig.username().isPresent()) { + mssqlConnectOptions.setUser(dataSourceRuntimeConfig.username().get()); } - if (dataSourceRuntimeConfig.password.isPresent()) { - mssqlConnectOptions.setPassword(dataSourceRuntimeConfig.password.get()); + if (dataSourceRuntimeConfig.password().isPresent()) { + mssqlConnectOptions.setPassword(dataSourceRuntimeConfig.password().get()); } // credentials provider - if (dataSourceRuntimeConfig.credentialsProvider.isPresent()) { - String beanName = dataSourceRuntimeConfig.credentialsProviderName.orElse(null); + if (dataSourceRuntimeConfig.credentialsProvider().isPresent()) { + String beanName = dataSourceRuntimeConfig.credentialsProviderName().orElse(null); CredentialsProvider credentialsProvider = CredentialsProviderFinder.find(beanName); - String name = dataSourceRuntimeConfig.credentialsProvider.get(); + String name = dataSourceRuntimeConfig.credentialsProvider().get(); Map credentials = credentialsProvider.getCredentials(name); String user = credentials.get(USER_PROPERTY_NAME); String password = credentials.get(PASSWORD_PROPERTY_NAME); @@ -177,28 +176,28 @@ private MSSQLConnectOptions toMSSQLConnectOptions(String dataSourceName, DataSou } } - mssqlConnectOptions.setReconnectAttempts(dataSourceReactiveRuntimeConfig.reconnectAttempts); + mssqlConnectOptions.setReconnectAttempts(dataSourceReactiveRuntimeConfig.reconnectAttempts()); - mssqlConnectOptions.setReconnectInterval(dataSourceReactiveRuntimeConfig.reconnectInterval.toMillis()); + mssqlConnectOptions.setReconnectInterval(dataSourceReactiveRuntimeConfig.reconnectInterval().toMillis()); - mssqlConnectOptions.setSsl(dataSourceReactiveMSSQLConfig.ssl); + mssqlConnectOptions.setSsl(dataSourceReactiveMSSQLConfig.ssl()); - mssqlConnectOptions.setTrustAll(dataSourceReactiveRuntimeConfig.trustAll); + mssqlConnectOptions.setTrustAll(dataSourceReactiveRuntimeConfig.trustAll()); - configurePemTrustOptions(mssqlConnectOptions, dataSourceReactiveRuntimeConfig.trustCertificatePem); - configureJksTrustOptions(mssqlConnectOptions, dataSourceReactiveRuntimeConfig.trustCertificateJks); - configurePfxTrustOptions(mssqlConnectOptions, dataSourceReactiveRuntimeConfig.trustCertificatePfx); + configurePemTrustOptions(mssqlConnectOptions, dataSourceReactiveRuntimeConfig.trustCertificatePem()); + configureJksTrustOptions(mssqlConnectOptions, dataSourceReactiveRuntimeConfig.trustCertificateJks()); + configurePfxTrustOptions(mssqlConnectOptions, dataSourceReactiveRuntimeConfig.trustCertificatePfx()); - configurePemKeyCertOptions(mssqlConnectOptions, dataSourceReactiveRuntimeConfig.keyCertificatePem); - configureJksKeyCertOptions(mssqlConnectOptions, dataSourceReactiveRuntimeConfig.keyCertificateJks); - configurePfxKeyCertOptions(mssqlConnectOptions, dataSourceReactiveRuntimeConfig.keyCertificatePfx); + configurePemKeyCertOptions(mssqlConnectOptions, dataSourceReactiveRuntimeConfig.keyCertificatePem()); + configureJksKeyCertOptions(mssqlConnectOptions, dataSourceReactiveRuntimeConfig.keyCertificateJks()); + configurePfxKeyCertOptions(mssqlConnectOptions, dataSourceReactiveRuntimeConfig.keyCertificatePfx()); - if (dataSourceReactiveRuntimeConfig.hostnameVerificationAlgorithm.isPresent()) { + if (dataSourceReactiveRuntimeConfig.hostnameVerificationAlgorithm().isPresent()) { mssqlConnectOptions.setHostnameVerificationAlgorithm( - dataSourceReactiveRuntimeConfig.hostnameVerificationAlgorithm.get()); + dataSourceReactiveRuntimeConfig.hostnameVerificationAlgorithm().get()); } - dataSourceReactiveRuntimeConfig.additionalProperties.forEach(mssqlConnectOptions::addProperty); + dataSourceReactiveRuntimeConfig.additionalProperties().forEach(mssqlConnectOptions::addProperty); // Use the convention defined by Quarkus Micrometer Vert.x metrics to create metrics prefixed with mssql. // with the client_name as tag. diff --git a/extensions/reactive-mysql-client/deployment/src/main/java/io/quarkus/reactive/mysql/client/deployment/ReactiveMySQLClientProcessor.java b/extensions/reactive-mysql-client/deployment/src/main/java/io/quarkus/reactive/mysql/client/deployment/ReactiveMySQLClientProcessor.java index 0912aa814ef25..7a31ef9cc1927 100644 --- a/extensions/reactive-mysql-client/deployment/src/main/java/io/quarkus/reactive/mysql/client/deployment/ReactiveMySQLClientProcessor.java +++ b/extensions/reactive-mysql-client/deployment/src/main/java/io/quarkus/reactive/mysql/client/deployment/ReactiveMySQLClientProcessor.java @@ -80,12 +80,7 @@ ServiceStartBuildItem build(BuildProducer feature, feature.produce(new FeatureBuildItem(Feature.REACTIVE_MYSQL_CLIENT)); - createPoolIfDefined(recorder, vertx, eventLoopCount, shutdown, mySQLPool, vertxPool, syntheticBeans, - DataSourceUtil.DEFAULT_DATASOURCE_NAME, dataSourcesBuildTimeConfig, - dataSourcesRuntimeConfig, dataSourcesReactiveBuildTimeConfig, dataSourcesReactiveRuntimeConfig, - dataSourcesReactiveMySQLConfig, defaultDataSourceDbKindBuildItems, curateOutcomeBuildItem); - - for (String dataSourceName : dataSourcesBuildTimeConfig.namedDataSources.keySet()) { + for (String dataSourceName : dataSourcesBuildTimeConfig.dataSources().keySet()) { createPoolIfDefined(recorder, vertx, eventLoopCount, shutdown, mySQLPool, vertxPool, syntheticBeans, dataSourceName, dataSourcesBuildTimeConfig, dataSourcesRuntimeConfig, dataSourcesReactiveBuildTimeConfig, dataSourcesReactiveRuntimeConfig, dataSourcesReactiveMySQLConfig, defaultDataSourceDbKindBuildItems, @@ -166,7 +161,7 @@ void addHealthCheck( healthChecks.produce( new HealthBuildItem("io.quarkus.reactive.mysql.client.runtime.health.ReactiveMySQLDataSourcesHealthCheck", - dataSourcesBuildTimeConfig.healthEnabled)); + dataSourcesBuildTimeConfig.healthEnabled())); } private void createPoolIfDefined(MySQLPoolRecorder recorder, @@ -230,14 +225,14 @@ private static boolean isReactiveMySQLPoolDefined(DataSourcesBuildTimeConfig dat List defaultDataSourceDbKindBuildItems, CurateOutcomeBuildItem curateOutcomeBuildItem) { DataSourceBuildTimeConfig dataSourceBuildTimeConfig = dataSourcesBuildTimeConfig - .getDataSourceRuntimeConfig(dataSourceName); + .dataSources().get(dataSourceName); DataSourceReactiveBuildTimeConfig dataSourceReactiveBuildTimeConfig = dataSourcesReactiveBuildTimeConfig .getDataSourceReactiveBuildTimeConfig(dataSourceName); - Optional dbKind = DefaultDataSourceDbKindBuildItem.resolve(dataSourceBuildTimeConfig.dbKind, + Optional dbKind = DefaultDataSourceDbKindBuildItem.resolve(dataSourceBuildTimeConfig.dbKind(), defaultDataSourceDbKindBuildItems, - !DataSourceUtil.isDefault(dataSourceName) || dataSourceBuildTimeConfig.devservices.enabled - .orElse(dataSourcesBuildTimeConfig.namedDataSources.isEmpty()), + !DataSourceUtil.isDefault(dataSourceName) || dataSourceBuildTimeConfig.devservices().enabled() + .orElse(!dataSourcesBuildTimeConfig.hasNamedDataSources()), curateOutcomeBuildItem); if (!dbKind.isPresent()) { return false; @@ -245,7 +240,7 @@ private static boolean isReactiveMySQLPoolDefined(DataSourcesBuildTimeConfig dat if ((!DatabaseKind.isMySQL(dbKind.get()) && !DatabaseKind.isMariaDB(dbKind.get())) - || !dataSourceReactiveBuildTimeConfig.enabled) { + || !dataSourceReactiveBuildTimeConfig.enabled()) { return false; } @@ -261,7 +256,7 @@ private boolean hasPools(DataSourcesBuildTimeConfig dataSourcesBuildTimeConfig, return true; } - for (String dataSourceName : dataSourcesBuildTimeConfig.namedDataSources.keySet()) { + for (String dataSourceName : dataSourcesBuildTimeConfig.dataSources().keySet()) { if (isReactiveMySQLPoolDefined(dataSourcesBuildTimeConfig, dataSourcesReactiveBuildTimeConfig, dataSourceName, defaultDataSourceDbKindBuildItems, curateOutcomeBuildItem)) { return true; diff --git a/extensions/reactive-mysql-client/runtime/src/main/java/io/quarkus/reactive/mysql/client/runtime/DataSourceReactiveMySQLConfig.java b/extensions/reactive-mysql-client/runtime/src/main/java/io/quarkus/reactive/mysql/client/runtime/DataSourceReactiveMySQLConfig.java index c4d2219f919ae..6d23674133b6b 100644 --- a/extensions/reactive-mysql-client/runtime/src/main/java/io/quarkus/reactive/mysql/client/runtime/DataSourceReactiveMySQLConfig.java +++ b/extensions/reactive-mysql-client/runtime/src/main/java/io/quarkus/reactive/mysql/client/runtime/DataSourceReactiveMySQLConfig.java @@ -3,25 +3,23 @@ import java.util.Optional; import java.util.OptionalInt; +import io.quarkus.runtime.annotations.ConfigDocDefault; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; import io.vertx.mysqlclient.MySQLAuthenticationPlugin; import io.vertx.mysqlclient.SslMode; @ConfigGroup -public class DataSourceReactiveMySQLConfig { +public interface DataSourceReactiveMySQLConfig { /** * Charset for connections. */ - @ConfigItem - public Optional charset = Optional.empty(); + Optional charset(); /** * Collation for connections. */ - @ConfigItem - public Optional collation = Optional.empty(); + Optional collation(); /** * Desired security state of the connection to the server. @@ -29,33 +27,31 @@ public class DataSourceReactiveMySQLConfig { * See MySQL Reference * Manual. */ - @ConfigItem(defaultValueDocumentation = "disabled") - public Optional sslMode = Optional.empty(); + @ConfigDocDefault("disabled") + Optional sslMode(); /** * Connection timeout in seconds */ - @ConfigItem() - public OptionalInt connectionTimeout = OptionalInt.empty(); + OptionalInt connectionTimeout(); /** * The authentication plugin the client should use. * By default, it uses the plugin name specified by the server in the initial handshake packet. */ - @ConfigItem(defaultValueDocumentation = "default") - public Optional authenticationPlugin = Optional.empty(); + @ConfigDocDefault("default") + Optional authenticationPlugin(); /** * The maximum number of inflight database commands that can be pipelined. * By default, pipelining is disabled. */ - @ConfigItem - public OptionalInt pipeliningLimit = OptionalInt.empty(); + OptionalInt pipeliningLimit(); /** * Whether to return the number of rows matched by the WHERE clause in UPDATE statements, instead of the * number of rows actually changed. */ - @ConfigItem(defaultValueDocumentation = "false") - public Optional useAffectedRows = Optional.empty(); + @ConfigDocDefault("false") + Optional useAffectedRows(); } diff --git a/extensions/reactive-mysql-client/runtime/src/main/java/io/quarkus/reactive/mysql/client/runtime/DataSourcesReactiveMySQLConfig.java b/extensions/reactive-mysql-client/runtime/src/main/java/io/quarkus/reactive/mysql/client/runtime/DataSourcesReactiveMySQLConfig.java index 1e6be7b48abda..fee52e5c31dd3 100644 --- a/extensions/reactive-mysql-client/runtime/src/main/java/io/quarkus/reactive/mysql/client/runtime/DataSourcesReactiveMySQLConfig.java +++ b/extensions/reactive-mysql-client/runtime/src/main/java/io/quarkus/reactive/mysql/client/runtime/DataSourcesReactiveMySQLConfig.java @@ -6,57 +6,43 @@ import io.quarkus.runtime.annotations.ConfigDocMapKey; import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithDefaults; +import io.smallrye.config.WithParentName; +import io.smallrye.config.WithUnnamedKey; -@ConfigRoot(name = "datasource", phase = ConfigPhase.RUN_TIME) -public class DataSourcesReactiveMySQLConfig { - - /** - * The default datasource. - */ - @ConfigItem(name = "reactive.mysql") - public DataSourceReactiveMySQLConfig defaultDataSource; +@ConfigMapping(prefix = "quarkus.datasource") +@ConfigRoot(phase = ConfigPhase.RUN_TIME) +public interface DataSourcesReactiveMySQLConfig { /** * Additional named datasources. */ @ConfigDocSection @ConfigDocMapKey("datasource-name") - @ConfigItem(name = ConfigItem.PARENT) - public Map namedDataSources; - - public DataSourceReactiveMySQLConfig getDataSourceReactiveRuntimeConfig(String dataSourceName) { - if (DataSourceUtil.isDefault(dataSourceName)) { - return defaultDataSource; - } - - DataSourceReactiveMySQLOuterNamedConfig dataSourceReactiveMySQLOuterNamedConfig = namedDataSources - .get(dataSourceName); - if (dataSourceReactiveMySQLOuterNamedConfig == null) { - return new DataSourceReactiveMySQLConfig(); - } - - return dataSourceReactiveMySQLOuterNamedConfig.reactive.mysql; - } + @WithParentName + @WithDefaults + @WithUnnamedKey(DataSourceUtil.DEFAULT_DATASOURCE_NAME) + Map dataSources(); @ConfigGroup - public static class DataSourceReactiveMySQLOuterNamedConfig { + public interface DataSourceReactiveMySQLOuterNamedConfig { /** * The MySQL-specific configuration. */ - public DataSourceReactiveMySQLOuterNestedNamedConfig reactive; + DataSourceReactiveMySQLOuterNestedNamedConfig reactive(); } @ConfigGroup - public static class DataSourceReactiveMySQLOuterNestedNamedConfig { + public interface DataSourceReactiveMySQLOuterNestedNamedConfig { /** * The MySQL-specific configuration. */ - public DataSourceReactiveMySQLConfig mysql; + DataSourceReactiveMySQLConfig mysql(); } } diff --git a/extensions/reactive-mysql-client/runtime/src/main/java/io/quarkus/reactive/mysql/client/runtime/MySQLPoolRecorder.java b/extensions/reactive-mysql-client/runtime/src/main/java/io/quarkus/reactive/mysql/client/runtime/MySQLPoolRecorder.java index 5a613d172a18b..fa692890e8a11 100644 --- a/extensions/reactive-mysql-client/runtime/src/main/java/io/quarkus/reactive/mysql/client/runtime/MySQLPoolRecorder.java +++ b/extensions/reactive-mysql-client/runtime/src/main/java/io/quarkus/reactive/mysql/client/runtime/MySQLPoolRecorder.java @@ -17,8 +17,6 @@ import jakarta.enterprise.inject.Instance; -import org.jboss.logging.Logger; - import io.quarkus.arc.Arc; import io.quarkus.credentials.CredentialsProvider; import io.quarkus.credentials.runtime.CredentialsProviderFinder; @@ -43,11 +41,8 @@ import io.vertx.sqlclient.impl.Utils; @Recorder -@SuppressWarnings("deprecation") public class MySQLPoolRecorder { - private static final Logger log = Logger.getLogger(MySQLPoolRecorder.class); - public RuntimeValue configureMySQLPool(RuntimeValue vertx, Supplier eventLoopCount, String dataSourceName, @@ -59,9 +54,9 @@ public RuntimeValue configureMySQLPool(RuntimeValue vertx, MySQLPool mysqlPool = initialize((VertxInternal) vertx.getValue(), eventLoopCount.get(), dataSourceName, - dataSourcesRuntimeConfig.getDataSourceRuntimeConfig(dataSourceName), + dataSourcesRuntimeConfig.dataSources().get(dataSourceName), dataSourcesReactiveRuntimeConfig.getDataSourceReactiveRuntimeConfig(dataSourceName), - dataSourcesReactiveMySQLConfig.getDataSourceReactiveRuntimeConfig(dataSourceName)); + dataSourcesReactiveMySQLConfig.dataSources().get(dataSourceName).reactive().mysql()); shutdown.addShutdownTask(mysqlPool::close); return new RuntimeValue<>(mysqlPool); @@ -90,10 +85,10 @@ private Supplier> toDatabasesSupplier(Vertx vertx, List mySQLConnectOptions, DataSourceRuntimeConfig dataSourceRuntimeConfig) { Supplier> supplier; - if (dataSourceRuntimeConfig.credentialsProvider.isPresent()) { - String beanName = dataSourceRuntimeConfig.credentialsProviderName.orElse(null); + if (dataSourceRuntimeConfig.credentialsProvider().isPresent()) { + String beanName = dataSourceRuntimeConfig.credentialsProviderName().orElse(null); CredentialsProvider credentialsProvider = CredentialsProviderFinder.find(beanName); - String name = dataSourceRuntimeConfig.credentialsProvider.get(); + String name = dataSourceRuntimeConfig.credentialsProvider().get(); supplier = new ConnectOptionsSupplier<>(vertx, credentialsProvider, name, mySQLConnectOptions, MySQLConnectOptions::new); } else { @@ -109,28 +104,28 @@ private PoolOptions toPoolOptions(Integer eventLoopCount, PoolOptions poolOptions; poolOptions = new PoolOptions(); - poolOptions.setMaxSize(dataSourceReactiveRuntimeConfig.maxSize); + poolOptions.setMaxSize(dataSourceReactiveRuntimeConfig.maxSize()); - if (dataSourceReactiveRuntimeConfig.idleTimeout.isPresent()) { - int idleTimeout = Math.toIntExact(dataSourceReactiveRuntimeConfig.idleTimeout.get().toMillis()); + if (dataSourceReactiveRuntimeConfig.idleTimeout().isPresent()) { + int idleTimeout = Math.toIntExact(dataSourceReactiveRuntimeConfig.idleTimeout().get().toMillis()); poolOptions.setIdleTimeout(idleTimeout).setIdleTimeoutUnit(TimeUnit.MILLISECONDS); } - if (dataSourceReactiveRuntimeConfig.shared) { + if (dataSourceReactiveRuntimeConfig.shared()) { poolOptions.setShared(true); - if (dataSourceReactiveRuntimeConfig.name.isPresent()) { - poolOptions.setName(dataSourceReactiveRuntimeConfig.name.get()); + if (dataSourceReactiveRuntimeConfig.name().isPresent()) { + poolOptions.setName(dataSourceReactiveRuntimeConfig.name().get()); } } - if (dataSourceReactiveRuntimeConfig.eventLoopSize.isPresent()) { - poolOptions.setEventLoopSize(Math.max(0, dataSourceReactiveRuntimeConfig.eventLoopSize.getAsInt())); + if (dataSourceReactiveRuntimeConfig.eventLoopSize().isPresent()) { + poolOptions.setEventLoopSize(Math.max(0, dataSourceReactiveRuntimeConfig.eventLoopSize().getAsInt())); } else if (eventLoopCount != null) { poolOptions.setEventLoopSize(Math.max(0, eventLoopCount)); } - if (dataSourceReactiveMySQLConfig.connectionTimeout.isPresent()) { - poolOptions.setConnectionTimeout(dataSourceReactiveMySQLConfig.connectionTimeout.getAsInt()); + if (dataSourceReactiveMySQLConfig.connectionTimeout().isPresent()) { + poolOptions.setConnectionTimeout(dataSourceReactiveMySQLConfig.connectionTimeout().getAsInt()); poolOptions.setConnectionTimeoutUnit(TimeUnit.SECONDS); } @@ -142,8 +137,8 @@ private List toMySQLConnectOptions(String dataSourceName, DataSourceReactiveRuntimeConfig dataSourceReactiveRuntimeConfig, DataSourceReactiveMySQLConfig dataSourceReactiveMySQLConfig) { List mysqlConnectOptionsList = new ArrayList<>(); - if (dataSourceReactiveRuntimeConfig.url.isPresent()) { - List urls = dataSourceReactiveRuntimeConfig.url.get(); + if (dataSourceReactiveRuntimeConfig.url().isPresent()) { + List urls = dataSourceReactiveRuntimeConfig.url().get(); urls.forEach(url -> { // clean up the URL to make migrations easier if (url.startsWith("vertx-reactive:mysql://")) { @@ -156,15 +151,15 @@ private List toMySQLConnectOptions(String dataSourceName, } mysqlConnectOptionsList.forEach(mysqlConnectOptions -> { - dataSourceRuntimeConfig.username.ifPresent(mysqlConnectOptions::setUser); + dataSourceRuntimeConfig.username().ifPresent(mysqlConnectOptions::setUser); - dataSourceRuntimeConfig.password.ifPresent(mysqlConnectOptions::setPassword); + dataSourceRuntimeConfig.password().ifPresent(mysqlConnectOptions::setPassword); // credentials provider - if (dataSourceRuntimeConfig.credentialsProvider.isPresent()) { - String beanName = dataSourceRuntimeConfig.credentialsProviderName.orElse(null); + if (dataSourceRuntimeConfig.credentialsProvider().isPresent()) { + String beanName = dataSourceRuntimeConfig.credentialsProviderName().orElse(null); CredentialsProvider credentialsProvider = CredentialsProviderFinder.find(beanName); - String name = dataSourceRuntimeConfig.credentialsProvider.get(); + String name = dataSourceRuntimeConfig.credentialsProvider().get(); Map credentials = credentialsProvider.getCredentials(name); String user = credentials.get(USER_PROPERTY_NAME); String password = credentials.get(PASSWORD_PROPERTY_NAME); @@ -176,49 +171,49 @@ private List toMySQLConnectOptions(String dataSourceName, } } - mysqlConnectOptions.setCachePreparedStatements(dataSourceReactiveRuntimeConfig.cachePreparedStatements); + mysqlConnectOptions.setCachePreparedStatements(dataSourceReactiveRuntimeConfig.cachePreparedStatements()); - dataSourceReactiveMySQLConfig.charset.ifPresent(mysqlConnectOptions::setCharset); - dataSourceReactiveMySQLConfig.collation.ifPresent(mysqlConnectOptions::setCollation); + dataSourceReactiveMySQLConfig.charset().ifPresent(mysqlConnectOptions::setCharset); + dataSourceReactiveMySQLConfig.collation().ifPresent(mysqlConnectOptions::setCollation); - if (dataSourceReactiveMySQLConfig.pipeliningLimit.isPresent()) { - mysqlConnectOptions.setPipeliningLimit(dataSourceReactiveMySQLConfig.pipeliningLimit.getAsInt()); + if (dataSourceReactiveMySQLConfig.pipeliningLimit().isPresent()) { + mysqlConnectOptions.setPipeliningLimit(dataSourceReactiveMySQLConfig.pipeliningLimit().getAsInt()); } - dataSourceReactiveMySQLConfig.useAffectedRows.ifPresent(mysqlConnectOptions::setUseAffectedRows); + dataSourceReactiveMySQLConfig.useAffectedRows().ifPresent(mysqlConnectOptions::setUseAffectedRows); - if (dataSourceReactiveMySQLConfig.sslMode.isPresent()) { - final SslMode sslMode = dataSourceReactiveMySQLConfig.sslMode.get(); + if (dataSourceReactiveMySQLConfig.sslMode().isPresent()) { + final SslMode sslMode = dataSourceReactiveMySQLConfig.sslMode().get(); mysqlConnectOptions.setSslMode(sslMode); // If sslMode is verify-identity, we also need a hostname verification algorithm - if (sslMode == SslMode.VERIFY_IDENTITY && (!dataSourceReactiveRuntimeConfig.hostnameVerificationAlgorithm - .isPresent() || "".equals(dataSourceReactiveRuntimeConfig.hostnameVerificationAlgorithm.get()))) { + if (sslMode == SslMode.VERIFY_IDENTITY && (!dataSourceReactiveRuntimeConfig.hostnameVerificationAlgorithm() + .isPresent() || "".equals(dataSourceReactiveRuntimeConfig.hostnameVerificationAlgorithm().get()))) { throw new IllegalArgumentException( "quarkus.datasource.reactive.hostname-verification-algorithm must be specified under verify-identity sslmode"); } } - mysqlConnectOptions.setTrustAll(dataSourceReactiveRuntimeConfig.trustAll); + mysqlConnectOptions.setTrustAll(dataSourceReactiveRuntimeConfig.trustAll()); - configurePemTrustOptions(mysqlConnectOptions, dataSourceReactiveRuntimeConfig.trustCertificatePem); - configureJksTrustOptions(mysqlConnectOptions, dataSourceReactiveRuntimeConfig.trustCertificateJks); - configurePfxTrustOptions(mysqlConnectOptions, dataSourceReactiveRuntimeConfig.trustCertificatePfx); + configurePemTrustOptions(mysqlConnectOptions, dataSourceReactiveRuntimeConfig.trustCertificatePem()); + configureJksTrustOptions(mysqlConnectOptions, dataSourceReactiveRuntimeConfig.trustCertificateJks()); + configurePfxTrustOptions(mysqlConnectOptions, dataSourceReactiveRuntimeConfig.trustCertificatePfx()); - configurePemKeyCertOptions(mysqlConnectOptions, dataSourceReactiveRuntimeConfig.keyCertificatePem); - configureJksKeyCertOptions(mysqlConnectOptions, dataSourceReactiveRuntimeConfig.keyCertificateJks); - configurePfxKeyCertOptions(mysqlConnectOptions, dataSourceReactiveRuntimeConfig.keyCertificatePfx); + configurePemKeyCertOptions(mysqlConnectOptions, dataSourceReactiveRuntimeConfig.keyCertificatePem()); + configureJksKeyCertOptions(mysqlConnectOptions, dataSourceReactiveRuntimeConfig.keyCertificateJks()); + configurePfxKeyCertOptions(mysqlConnectOptions, dataSourceReactiveRuntimeConfig.keyCertificatePfx()); - mysqlConnectOptions.setReconnectAttempts(dataSourceReactiveRuntimeConfig.reconnectAttempts); + mysqlConnectOptions.setReconnectAttempts(dataSourceReactiveRuntimeConfig.reconnectAttempts()); - mysqlConnectOptions.setReconnectInterval(dataSourceReactiveRuntimeConfig.reconnectInterval.toMillis()); + mysqlConnectOptions.setReconnectInterval(dataSourceReactiveRuntimeConfig.reconnectInterval().toMillis()); - dataSourceReactiveRuntimeConfig.hostnameVerificationAlgorithm.ifPresent( + dataSourceReactiveRuntimeConfig.hostnameVerificationAlgorithm().ifPresent( mysqlConnectOptions::setHostnameVerificationAlgorithm); - dataSourceReactiveMySQLConfig.authenticationPlugin.ifPresent(mysqlConnectOptions::setAuthenticationPlugin); + dataSourceReactiveMySQLConfig.authenticationPlugin().ifPresent(mysqlConnectOptions::setAuthenticationPlugin); - dataSourceReactiveRuntimeConfig.additionalProperties.forEach(mysqlConnectOptions::addProperty); + dataSourceReactiveRuntimeConfig.additionalProperties().forEach(mysqlConnectOptions::addProperty); // Use the convention defined by Quarkus Micrometer Vert.x metrics to create metrics prefixed with mysql. // and the client_name as tag. diff --git a/extensions/reactive-oracle-client/deployment/src/main/java/io/quarkus/reactive/oracle/client/deployment/ReactiveOracleClientProcessor.java b/extensions/reactive-oracle-client/deployment/src/main/java/io/quarkus/reactive/oracle/client/deployment/ReactiveOracleClientProcessor.java index 039542c118298..ec3d61852f381 100644 --- a/extensions/reactive-oracle-client/deployment/src/main/java/io/quarkus/reactive/oracle/client/deployment/ReactiveOracleClientProcessor.java +++ b/extensions/reactive-oracle-client/deployment/src/main/java/io/quarkus/reactive/oracle/client/deployment/ReactiveOracleClientProcessor.java @@ -80,12 +80,7 @@ ServiceStartBuildItem build(BuildProducer feature, feature.produce(new FeatureBuildItem(Feature.REACTIVE_ORACLE_CLIENT)); - createPoolIfDefined(recorder, vertx, eventLoopCount, shutdown, oraclePool, vertxPool, syntheticBeans, - DataSourceUtil.DEFAULT_DATASOURCE_NAME, dataSourcesBuildTimeConfig, - dataSourcesRuntimeConfig, dataSourcesReactiveBuildTimeConfig, dataSourcesReactiveRuntimeConfig, - dataSourcesReactiveOracleConfig, defaultDataSourceDbKindBuildItems, curateOutcomeBuildItem); - - for (String dataSourceName : dataSourcesBuildTimeConfig.namedDataSources.keySet()) { + for (String dataSourceName : dataSourcesBuildTimeConfig.dataSources().keySet()) { createPoolIfDefined(recorder, vertx, eventLoopCount, shutdown, oraclePool, vertxPool, syntheticBeans, dataSourceName, dataSourcesBuildTimeConfig, dataSourcesRuntimeConfig, dataSourcesReactiveBuildTimeConfig, @@ -166,7 +161,7 @@ void addHealthCheck( healthChecks.produce( new HealthBuildItem("io.quarkus.reactive.oracle.client.runtime.health.ReactiveOracleDataSourcesHealthCheck", - dataSourcesBuildTimeConfig.healthEnabled)); + dataSourcesBuildTimeConfig.healthEnabled())); } private void createPoolIfDefined(OraclePoolRecorder recorder, @@ -230,21 +225,21 @@ private static boolean isReactiveOraclePoolDefined(DataSourcesBuildTimeConfig da List defaultDataSourceDbKindBuildItems, CurateOutcomeBuildItem curateOutcomeBuildItem) { DataSourceBuildTimeConfig dataSourceBuildTimeConfig = dataSourcesBuildTimeConfig - .getDataSourceRuntimeConfig(dataSourceName); + .dataSources().get(dataSourceName); DataSourceReactiveBuildTimeConfig dataSourceReactiveBuildTimeConfig = dataSourcesReactiveBuildTimeConfig .getDataSourceReactiveBuildTimeConfig(dataSourceName); - Optional dbKind = DefaultDataSourceDbKindBuildItem.resolve(dataSourceBuildTimeConfig.dbKind, + Optional dbKind = DefaultDataSourceDbKindBuildItem.resolve(dataSourceBuildTimeConfig.dbKind(), defaultDataSourceDbKindBuildItems, - !DataSourceUtil.isDefault(dataSourceName) || dataSourceBuildTimeConfig.devservices.enabled - .orElse(dataSourcesBuildTimeConfig.namedDataSources.isEmpty()), + !DataSourceUtil.isDefault(dataSourceName) || dataSourceBuildTimeConfig.devservices().enabled() + .orElse(!dataSourcesBuildTimeConfig.hasNamedDataSources()), curateOutcomeBuildItem); if (!dbKind.isPresent()) { return false; } if (!DatabaseKind.isOracle(dbKind.get()) - || !dataSourceReactiveBuildTimeConfig.enabled) { + || !dataSourceReactiveBuildTimeConfig.enabled()) { return false; } @@ -260,7 +255,7 @@ private boolean hasPools(DataSourcesBuildTimeConfig dataSourcesBuildTimeConfig, return true; } - for (String dataSourceName : dataSourcesBuildTimeConfig.namedDataSources.keySet()) { + for (String dataSourceName : dataSourcesBuildTimeConfig.dataSources().keySet()) { if (isReactiveOraclePoolDefined(dataSourcesBuildTimeConfig, dataSourcesReactiveBuildTimeConfig, dataSourceName, defaultDataSourceDbKindBuildItems, curateOutcomeBuildItem)) { return true; diff --git a/extensions/reactive-oracle-client/runtime/src/main/java/io/quarkus/reactive/oracle/client/runtime/DataSourceReactiveOracleConfig.java b/extensions/reactive-oracle-client/runtime/src/main/java/io/quarkus/reactive/oracle/client/runtime/DataSourceReactiveOracleConfig.java index 3b9f03afc29c1..778e30be8ac13 100644 --- a/extensions/reactive-oracle-client/runtime/src/main/java/io/quarkus/reactive/oracle/client/runtime/DataSourceReactiveOracleConfig.java +++ b/extensions/reactive-oracle-client/runtime/src/main/java/io/quarkus/reactive/oracle/client/runtime/DataSourceReactiveOracleConfig.java @@ -3,6 +3,6 @@ import io.quarkus.runtime.annotations.ConfigGroup; @ConfigGroup -public class DataSourceReactiveOracleConfig { +public interface DataSourceReactiveOracleConfig { } diff --git a/extensions/reactive-oracle-client/runtime/src/main/java/io/quarkus/reactive/oracle/client/runtime/DataSourcesReactiveOracleConfig.java b/extensions/reactive-oracle-client/runtime/src/main/java/io/quarkus/reactive/oracle/client/runtime/DataSourcesReactiveOracleConfig.java index 73c146a9c5b90..8067bcdcffa74 100644 --- a/extensions/reactive-oracle-client/runtime/src/main/java/io/quarkus/reactive/oracle/client/runtime/DataSourcesReactiveOracleConfig.java +++ b/extensions/reactive-oracle-client/runtime/src/main/java/io/quarkus/reactive/oracle/client/runtime/DataSourcesReactiveOracleConfig.java @@ -6,57 +6,43 @@ import io.quarkus.runtime.annotations.ConfigDocMapKey; import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithDefaults; +import io.smallrye.config.WithParentName; +import io.smallrye.config.WithUnnamedKey; -@ConfigRoot(name = "datasource", phase = ConfigPhase.RUN_TIME) -public class DataSourcesReactiveOracleConfig { +@ConfigMapping(prefix = "quarkus.datasource") +@ConfigRoot(phase = ConfigPhase.RUN_TIME) +public interface DataSourcesReactiveOracleConfig { /** - * The default datasource. - */ - @ConfigItem(name = "reactive.oracle") - public DataSourceReactiveOracleConfig defaultDataSource; - - /** - * Additional named datasources. + * Datasources. */ @ConfigDocSection @ConfigDocMapKey("datasource-name") - @ConfigItem(name = ConfigItem.PARENT) - public Map namedDataSources; - - public DataSourceReactiveOracleConfig getDataSourceReactiveRuntimeConfig(String dataSourceName) { - if (DataSourceUtil.isDefault(dataSourceName)) { - return defaultDataSource; - } - - DataSourceReactiveOracleOuterNamedConfig dataSourceReactiveOracleOuterNamedConfig = namedDataSources - .get(dataSourceName); - if (dataSourceReactiveOracleOuterNamedConfig == null) { - return new DataSourceReactiveOracleConfig(); - } - - return dataSourceReactiveOracleOuterNamedConfig.reactive.oracle; - } + @WithParentName + @WithDefaults + @WithUnnamedKey(DataSourceUtil.DEFAULT_DATASOURCE_NAME) + Map dataSources(); @ConfigGroup - public static class DataSourceReactiveOracleOuterNamedConfig { + public interface DataSourceReactiveOracleOuterNamedConfig { /** * The Oracle-specific configuration. */ - public DataSourceReactiveOracleOuterNestedNamedConfig reactive; + DataSourceReactiveOracleOuterNestedNamedConfig reactive(); } @ConfigGroup - public static class DataSourceReactiveOracleOuterNestedNamedConfig { + public interface DataSourceReactiveOracleOuterNestedNamedConfig { /** * The Oracle-specific configuration. */ - public DataSourceReactiveOracleConfig oracle; + DataSourceReactiveOracleConfig oracle(); } } diff --git a/extensions/reactive-oracle-client/runtime/src/main/java/io/quarkus/reactive/oracle/client/runtime/OraclePoolRecorder.java b/extensions/reactive-oracle-client/runtime/src/main/java/io/quarkus/reactive/oracle/client/runtime/OraclePoolRecorder.java index 1bd6b3809a6a0..e2e9a2d101d3d 100644 --- a/extensions/reactive-oracle-client/runtime/src/main/java/io/quarkus/reactive/oracle/client/runtime/OraclePoolRecorder.java +++ b/extensions/reactive-oracle-client/runtime/src/main/java/io/quarkus/reactive/oracle/client/runtime/OraclePoolRecorder.java @@ -51,9 +51,9 @@ public RuntimeValue configureOraclePool(RuntimeValue vertx, OraclePool oraclePool = initialize((VertxInternal) vertx.getValue(), eventLoopCount.get(), dataSourceName, - dataSourcesRuntimeConfig.getDataSourceRuntimeConfig(dataSourceName), + dataSourcesRuntimeConfig.dataSources().get(dataSourceName), dataSourcesReactiveRuntimeConfig.getDataSourceReactiveRuntimeConfig(dataSourceName), - dataSourcesReactiveOracleConfig.getDataSourceReactiveRuntimeConfig(dataSourceName)); + dataSourcesReactiveOracleConfig.dataSources().get(dataSourceName).reactive().oracle()); shutdown.addShutdownTask(oraclePool::close); return new RuntimeValue<>(oraclePool); @@ -82,10 +82,10 @@ private Supplier> toDatabasesSupplier(Vertx vertx, List oracleConnectOptions, DataSourceRuntimeConfig dataSourceRuntimeConfig) { Supplier> supplier; - if (dataSourceRuntimeConfig.credentialsProvider.isPresent()) { - String beanName = dataSourceRuntimeConfig.credentialsProviderName.orElse(null); + if (dataSourceRuntimeConfig.credentialsProvider().isPresent()) { + String beanName = dataSourceRuntimeConfig.credentialsProviderName().orElse(null); CredentialsProvider credentialsProvider = CredentialsProviderFinder.find(beanName); - String name = dataSourceRuntimeConfig.credentialsProvider.get(); + String name = dataSourceRuntimeConfig.credentialsProvider().get(); supplier = new ConnectOptionsSupplier<>(vertx, credentialsProvider, name, oracleConnectOptions, OracleConnectOptions::new); } else { @@ -101,22 +101,22 @@ private PoolOptions toPoolOptions(Integer eventLoopCount, PoolOptions poolOptions; poolOptions = new PoolOptions(); - poolOptions.setMaxSize(dataSourceReactiveRuntimeConfig.maxSize); + poolOptions.setMaxSize(dataSourceReactiveRuntimeConfig.maxSize()); - if (dataSourceReactiveRuntimeConfig.idleTimeout.isPresent()) { - int idleTimeout = Math.toIntExact(dataSourceReactiveRuntimeConfig.idleTimeout.get().toMillis()); + if (dataSourceReactiveRuntimeConfig.idleTimeout().isPresent()) { + int idleTimeout = Math.toIntExact(dataSourceReactiveRuntimeConfig.idleTimeout().get().toMillis()); poolOptions.setIdleTimeout(idleTimeout).setIdleTimeoutUnit(TimeUnit.MILLISECONDS); } - if (dataSourceReactiveRuntimeConfig.shared) { + if (dataSourceReactiveRuntimeConfig.shared()) { poolOptions.setShared(true); - if (dataSourceReactiveRuntimeConfig.name.isPresent()) { - poolOptions.setName(dataSourceReactiveRuntimeConfig.name.get()); + if (dataSourceReactiveRuntimeConfig.name().isPresent()) { + poolOptions.setName(dataSourceReactiveRuntimeConfig.name().get()); } } - if (dataSourceReactiveRuntimeConfig.eventLoopSize.isPresent()) { - poolOptions.setEventLoopSize(Math.max(0, dataSourceReactiveRuntimeConfig.eventLoopSize.getAsInt())); + if (dataSourceReactiveRuntimeConfig.eventLoopSize().isPresent()) { + poolOptions.setEventLoopSize(Math.max(0, dataSourceReactiveRuntimeConfig.eventLoopSize().getAsInt())); } else if (eventLoopCount != null) { poolOptions.setEventLoopSize(Math.max(0, eventLoopCount)); } @@ -128,8 +128,8 @@ private OracleConnectOptions toOracleConnectOptions(String dataSourceName, DataS DataSourceReactiveRuntimeConfig dataSourceReactiveRuntimeConfig, DataSourceReactiveOracleConfig dataSourceReactiveOracleConfig) { OracleConnectOptions oracleConnectOptions; - if (dataSourceReactiveRuntimeConfig.url.isPresent()) { - List urls = dataSourceReactiveRuntimeConfig.url.get(); + if (dataSourceReactiveRuntimeConfig.url().isPresent()) { + List urls = dataSourceReactiveRuntimeConfig.url().get(); if (urls.size() > 1) { log.warn("The Reactive Oracle client does not support multiple URLs. The first one will be used, and " + "others will be ignored."); @@ -144,19 +144,19 @@ private OracleConnectOptions toOracleConnectOptions(String dataSourceName, DataS oracleConnectOptions = new OracleConnectOptions(); } - if (dataSourceRuntimeConfig.username.isPresent()) { - oracleConnectOptions.setUser(dataSourceRuntimeConfig.username.get()); + if (dataSourceRuntimeConfig.username().isPresent()) { + oracleConnectOptions.setUser(dataSourceRuntimeConfig.username().get()); } - if (dataSourceRuntimeConfig.password.isPresent()) { - oracleConnectOptions.setPassword(dataSourceRuntimeConfig.password.get()); + if (dataSourceRuntimeConfig.password().isPresent()) { + oracleConnectOptions.setPassword(dataSourceRuntimeConfig.password().get()); } // credentials provider - if (dataSourceRuntimeConfig.credentialsProvider.isPresent()) { - String beanName = dataSourceRuntimeConfig.credentialsProviderName.orElse(null); + if (dataSourceRuntimeConfig.credentialsProvider().isPresent()) { + String beanName = dataSourceRuntimeConfig.credentialsProviderName().orElse(null); CredentialsProvider credentialsProvider = CredentialsProviderFinder.find(beanName); - String name = dataSourceRuntimeConfig.credentialsProvider.get(); + String name = dataSourceRuntimeConfig.credentialsProvider().get(); Map credentials = credentialsProvider.getCredentials(name); String user = credentials.get(USER_PROPERTY_NAME); String password = credentials.get(PASSWORD_PROPERTY_NAME); @@ -168,7 +168,7 @@ private OracleConnectOptions toOracleConnectOptions(String dataSourceName, DataS } } - dataSourceReactiveRuntimeConfig.additionalProperties.forEach(oracleConnectOptions::addProperty); + dataSourceReactiveRuntimeConfig.additionalProperties().forEach(oracleConnectOptions::addProperty); // Use the convention defined by Quarkus Micrometer Vert.x metrics to create metrics prefixed with oracle. // and the client_name as tag. diff --git a/extensions/reactive-pg-client/deployment/src/main/java/io/quarkus/reactive/pg/client/deployment/ReactivePgClientProcessor.java b/extensions/reactive-pg-client/deployment/src/main/java/io/quarkus/reactive/pg/client/deployment/ReactivePgClientProcessor.java index b0f38c3411bb0..6470b439610e4 100644 --- a/extensions/reactive-pg-client/deployment/src/main/java/io/quarkus/reactive/pg/client/deployment/ReactivePgClientProcessor.java +++ b/extensions/reactive-pg-client/deployment/src/main/java/io/quarkus/reactive/pg/client/deployment/ReactivePgClientProcessor.java @@ -92,12 +92,7 @@ ServiceStartBuildItem build(BuildProducer feature, feature.produce(new FeatureBuildItem(Feature.REACTIVE_PG_CLIENT)); - createPoolIfDefined(recorder, vertx, eventLoopCount, shutdown, pgPool, vertxPool, syntheticBeans, - DataSourceUtil.DEFAULT_DATASOURCE_NAME, dataSourcesBuildTimeConfig, - dataSourcesRuntimeConfig, dataSourcesReactiveBuildTimeConfig, dataSourcesReactiveRuntimeConfig, - dataSourcesReactivePostgreSQLConfig, defaultDataSourceDbKindBuildItems, curateOutcomeBuildItem); - - for (String dataSourceName : dataSourcesBuildTimeConfig.namedDataSources.keySet()) { + for (String dataSourceName : dataSourcesBuildTimeConfig.dataSources().keySet()) { createPoolIfDefined(recorder, vertx, eventLoopCount, shutdown, pgPool, vertxPool, syntheticBeans, dataSourceName, dataSourcesBuildTimeConfig, dataSourcesRuntimeConfig, dataSourcesReactiveBuildTimeConfig, dataSourcesReactiveRuntimeConfig, dataSourcesReactivePostgreSQLConfig, defaultDataSourceDbKindBuildItems, @@ -133,7 +128,7 @@ void addHealthCheck( healthChecks .produce(new HealthBuildItem("io.quarkus.reactive.pg.client.runtime.health.ReactivePgDataSourcesHealthCheck", - dataSourcesBuildTimeConfig.healthEnabled)); + dataSourcesBuildTimeConfig.healthEnabled())); } @BuildStep @@ -235,14 +230,14 @@ private static boolean isReactivePostgreSQLPoolDefined(DataSourcesBuildTimeConfi List defaultDataSourceDbKindBuildItems, CurateOutcomeBuildItem curateOutcomeBuildItem) { DataSourceBuildTimeConfig dataSourceBuildTimeConfig = dataSourcesBuildTimeConfig - .getDataSourceRuntimeConfig(dataSourceName); + .dataSources().get(dataSourceName); DataSourceReactiveBuildTimeConfig dataSourceReactiveBuildTimeConfig = dataSourcesReactiveBuildTimeConfig .getDataSourceReactiveBuildTimeConfig(dataSourceName); - Optional dbKind = DefaultDataSourceDbKindBuildItem.resolve(dataSourceBuildTimeConfig.dbKind, + Optional dbKind = DefaultDataSourceDbKindBuildItem.resolve(dataSourceBuildTimeConfig.dbKind(), defaultDataSourceDbKindBuildItems, - !DataSourceUtil.isDefault(dataSourceName) || dataSourceBuildTimeConfig.devservices.enabled - .orElse(dataSourcesBuildTimeConfig.namedDataSources.isEmpty()), + !DataSourceUtil.isDefault(dataSourceName) || dataSourceBuildTimeConfig.devservices().enabled() + .orElse(!dataSourcesBuildTimeConfig.hasNamedDataSources()), curateOutcomeBuildItem); if (!dbKind.isPresent()) { @@ -250,7 +245,7 @@ private static boolean isReactivePostgreSQLPoolDefined(DataSourcesBuildTimeConfi } if (!DatabaseKind.isPostgreSQL(dbKind.get()) - || !dataSourceReactiveBuildTimeConfig.enabled) { + || !dataSourceReactiveBuildTimeConfig.enabled()) { return false; } @@ -266,7 +261,7 @@ private boolean hasPools(DataSourcesBuildTimeConfig dataSourcesBuildTimeConfig, return true; } - for (String dataSourceName : dataSourcesBuildTimeConfig.namedDataSources.keySet()) { + for (String dataSourceName : dataSourcesBuildTimeConfig.dataSources().keySet()) { if (isReactivePostgreSQLPoolDefined(dataSourcesBuildTimeConfig, dataSourcesReactiveBuildTimeConfig, dataSourceName, defaultDataSourceDbKindBuildItems, curateOutcomeBuildItem)) { return true; diff --git a/extensions/reactive-pg-client/runtime/src/main/java/io/quarkus/reactive/pg/client/runtime/DataSourceReactivePostgreSQLConfig.java b/extensions/reactive-pg-client/runtime/src/main/java/io/quarkus/reactive/pg/client/runtime/DataSourceReactivePostgreSQLConfig.java index 47607c9074dec..681e4d0e6b3af 100644 --- a/extensions/reactive-pg-client/runtime/src/main/java/io/quarkus/reactive/pg/client/runtime/DataSourceReactivePostgreSQLConfig.java +++ b/extensions/reactive-pg-client/runtime/src/main/java/io/quarkus/reactive/pg/client/runtime/DataSourceReactivePostgreSQLConfig.java @@ -3,18 +3,17 @@ import java.util.Optional; import java.util.OptionalInt; +import io.quarkus.runtime.annotations.ConfigDocDefault; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; import io.vertx.pgclient.SslMode; @ConfigGroup -public class DataSourceReactivePostgreSQLConfig { +public interface DataSourceReactivePostgreSQLConfig { /** * The maximum number of inflight database commands that can be pipelined. */ - @ConfigItem - public OptionalInt pipeliningLimit = OptionalInt.empty(); + OptionalInt pipeliningLimit(); /** * SSL operating mode of the client. @@ -22,6 +21,6 @@ public class DataSourceReactivePostgreSQLConfig { * See Protection Provided in * Different Modes. */ - @ConfigItem(defaultValueDocumentation = "disable") - public Optional sslMode = Optional.empty(); + @ConfigDocDefault("disable") + Optional sslMode(); } diff --git a/extensions/reactive-pg-client/runtime/src/main/java/io/quarkus/reactive/pg/client/runtime/DataSourcesReactivePostgreSQLConfig.java b/extensions/reactive-pg-client/runtime/src/main/java/io/quarkus/reactive/pg/client/runtime/DataSourcesReactivePostgreSQLConfig.java index d79f46c6c2fb4..6ab7b9c5c6a7d 100644 --- a/extensions/reactive-pg-client/runtime/src/main/java/io/quarkus/reactive/pg/client/runtime/DataSourcesReactivePostgreSQLConfig.java +++ b/extensions/reactive-pg-client/runtime/src/main/java/io/quarkus/reactive/pg/client/runtime/DataSourcesReactivePostgreSQLConfig.java @@ -6,57 +6,43 @@ import io.quarkus.runtime.annotations.ConfigDocMapKey; import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithDefaults; +import io.smallrye.config.WithParentName; +import io.smallrye.config.WithUnnamedKey; -@ConfigRoot(name = "datasource", phase = ConfigPhase.RUN_TIME) -public class DataSourcesReactivePostgreSQLConfig { +@ConfigMapping(prefix = "quarkus.datasource") +@ConfigRoot(phase = ConfigPhase.RUN_TIME) +public interface DataSourcesReactivePostgreSQLConfig { /** - * The default datasource. - */ - @ConfigItem(name = "reactive.postgresql") - public DataSourceReactivePostgreSQLConfig defaultDataSource; - - /** - * Additional named datasources. + * Datasources. */ @ConfigDocSection @ConfigDocMapKey("datasource-name") - @ConfigItem(name = ConfigItem.PARENT) - public Map namedDataSources; - - public DataSourceReactivePostgreSQLConfig getDataSourceReactiveRuntimeConfig(String dataSourceName) { - if (DataSourceUtil.isDefault(dataSourceName)) { - return defaultDataSource; - } - - DataSourceReactivePostgreSQLOuterNamedConfig dataSourceReactivePostgreSQLOuterNamedConfig = namedDataSources - .get(dataSourceName); - if (dataSourceReactivePostgreSQLOuterNamedConfig == null) { - return new DataSourceReactivePostgreSQLConfig(); - } - - return dataSourceReactivePostgreSQLOuterNamedConfig.reactive.postgresql; - } + @WithParentName + @WithDefaults + @WithUnnamedKey(DataSourceUtil.DEFAULT_DATASOURCE_NAME) + Map dataSources(); @ConfigGroup - public static class DataSourceReactivePostgreSQLOuterNamedConfig { + public interface DataSourceReactivePostgreSQLOuterNamedConfig { /** * The PostgreSQL-specific configuration. */ - public DataSourceReactivePostgreSQLOuterNestedNamedConfig reactive; + DataSourceReactivePostgreSQLOuterNestedNamedConfig reactive(); } @ConfigGroup - public static class DataSourceReactivePostgreSQLOuterNestedNamedConfig { + public interface DataSourceReactivePostgreSQLOuterNestedNamedConfig { /** * The PostgreSQL-specific configuration. */ - public DataSourceReactivePostgreSQLConfig postgresql; + DataSourceReactivePostgreSQLConfig postgresql(); } } diff --git a/extensions/reactive-pg-client/runtime/src/main/java/io/quarkus/reactive/pg/client/runtime/PgPoolRecorder.java b/extensions/reactive-pg-client/runtime/src/main/java/io/quarkus/reactive/pg/client/runtime/PgPoolRecorder.java index cd929ccd1a511..27836f376dad1 100644 --- a/extensions/reactive-pg-client/runtime/src/main/java/io/quarkus/reactive/pg/client/runtime/PgPoolRecorder.java +++ b/extensions/reactive-pg-client/runtime/src/main/java/io/quarkus/reactive/pg/client/runtime/PgPoolRecorder.java @@ -17,8 +17,6 @@ import jakarta.enterprise.inject.Instance; -import org.jboss.logging.Logger; - import io.quarkus.arc.Arc; import io.quarkus.credentials.CredentialsProvider; import io.quarkus.credentials.runtime.CredentialsProviderFinder; @@ -43,11 +41,8 @@ import io.vertx.sqlclient.impl.Utils; @Recorder -@SuppressWarnings("deprecation") public class PgPoolRecorder { - private static final Logger log = Logger.getLogger(PgPoolRecorder.class); - public RuntimeValue configurePgPool(RuntimeValue vertx, Supplier eventLoopCount, String dataSourceName, @@ -59,9 +54,9 @@ public RuntimeValue configurePgPool(RuntimeValue vertx, PgPool pgPool = initialize((VertxInternal) vertx.getValue(), eventLoopCount.get(), dataSourceName, - dataSourcesRuntimeConfig.getDataSourceRuntimeConfig(dataSourceName), + dataSourcesRuntimeConfig.dataSources().get(dataSourceName), dataSourcesReactiveRuntimeConfig.getDataSourceReactiveRuntimeConfig(dataSourceName), - dataSourcesReactivePostgreSQLConfig.getDataSourceReactiveRuntimeConfig(dataSourceName)); + dataSourcesReactivePostgreSQLConfig.dataSources().get(dataSourceName).reactive().postgresql()); shutdown.addShutdownTask(pgPool::close); return new RuntimeValue<>(pgPool); @@ -89,10 +84,10 @@ private PgPool initialize(VertxInternal vertx, private Supplier> toDatabasesSupplier(Vertx vertx, List pgConnectOptionsList, DataSourceRuntimeConfig dataSourceRuntimeConfig) { Supplier> supplier; - if (dataSourceRuntimeConfig.credentialsProvider.isPresent()) { - String beanName = dataSourceRuntimeConfig.credentialsProviderName.orElse(null); + if (dataSourceRuntimeConfig.credentialsProvider().isPresent()) { + String beanName = dataSourceRuntimeConfig.credentialsProviderName().orElse(null); CredentialsProvider credentialsProvider = CredentialsProviderFinder.find(beanName); - String name = dataSourceRuntimeConfig.credentialsProvider.get(); + String name = dataSourceRuntimeConfig.credentialsProvider().get(); supplier = new ConnectOptionsSupplier<>(vertx, credentialsProvider, name, pgConnectOptionsList, PgConnectOptions::new); } else { @@ -108,22 +103,22 @@ private PoolOptions toPoolOptions(Integer eventLoopCount, PoolOptions poolOptions; poolOptions = new PoolOptions(); - poolOptions.setMaxSize(dataSourceReactiveRuntimeConfig.maxSize); + poolOptions.setMaxSize(dataSourceReactiveRuntimeConfig.maxSize()); - if (dataSourceReactiveRuntimeConfig.idleTimeout.isPresent()) { - int idleTimeout = Math.toIntExact(dataSourceReactiveRuntimeConfig.idleTimeout.get().toMillis()); + if (dataSourceReactiveRuntimeConfig.idleTimeout().isPresent()) { + int idleTimeout = Math.toIntExact(dataSourceReactiveRuntimeConfig.idleTimeout().get().toMillis()); poolOptions.setIdleTimeout(idleTimeout).setIdleTimeoutUnit(TimeUnit.MILLISECONDS); } - if (dataSourceReactiveRuntimeConfig.shared) { + if (dataSourceReactiveRuntimeConfig.shared()) { poolOptions.setShared(true); - if (dataSourceReactiveRuntimeConfig.name.isPresent()) { - poolOptions.setName(dataSourceReactiveRuntimeConfig.name.get()); + if (dataSourceReactiveRuntimeConfig.name().isPresent()) { + poolOptions.setName(dataSourceReactiveRuntimeConfig.name().get()); } } - if (dataSourceReactiveRuntimeConfig.eventLoopSize.isPresent()) { - poolOptions.setEventLoopSize(Math.max(0, dataSourceReactiveRuntimeConfig.eventLoopSize.getAsInt())); + if (dataSourceReactiveRuntimeConfig.eventLoopSize().isPresent()) { + poolOptions.setEventLoopSize(Math.max(0, dataSourceReactiveRuntimeConfig.eventLoopSize().getAsInt())); } else if (eventLoopCount != null) { poolOptions.setEventLoopSize(Math.max(0, eventLoopCount)); } @@ -136,8 +131,8 @@ private List toPgConnectOptions(String dataSourceName, DataSou DataSourceReactivePostgreSQLConfig dataSourceReactivePostgreSQLConfig) { List pgConnectOptionsList = new ArrayList<>(); - if (dataSourceReactiveRuntimeConfig.url.isPresent()) { - List urls = dataSourceReactiveRuntimeConfig.url.get(); + if (dataSourceReactiveRuntimeConfig.url().isPresent()) { + List urls = dataSourceReactiveRuntimeConfig.url().get(); urls.forEach(url -> { // clean up the URL to make migrations easier if (url.matches("^vertx-reactive:postgre(?:s|sql)://.*$")) { @@ -150,15 +145,15 @@ private List toPgConnectOptions(String dataSourceName, DataSou } pgConnectOptionsList.forEach(pgConnectOptions -> { - dataSourceRuntimeConfig.username.ifPresent(pgConnectOptions::setUser); + dataSourceRuntimeConfig.username().ifPresent(pgConnectOptions::setUser); - dataSourceRuntimeConfig.password.ifPresent(pgConnectOptions::setPassword); + dataSourceRuntimeConfig.password().ifPresent(pgConnectOptions::setPassword); // credentials provider - if (dataSourceRuntimeConfig.credentialsProvider.isPresent()) { - String beanName = dataSourceRuntimeConfig.credentialsProviderName.orElse(null); + if (dataSourceRuntimeConfig.credentialsProvider().isPresent()) { + String beanName = dataSourceRuntimeConfig.credentialsProviderName().orElse(null); CredentialsProvider credentialsProvider = CredentialsProviderFinder.find(beanName); - String name = dataSourceRuntimeConfig.credentialsProvider.get(); + String name = dataSourceRuntimeConfig.credentialsProvider().get(); Map credentials = credentialsProvider.getCredentials(name); String user = credentials.get(USER_PROPERTY_NAME); String password = credentials.get(PASSWORD_PROPERTY_NAME); @@ -170,43 +165,43 @@ private List toPgConnectOptions(String dataSourceName, DataSou } } - pgConnectOptions.setCachePreparedStatements(dataSourceReactiveRuntimeConfig.cachePreparedStatements); + pgConnectOptions.setCachePreparedStatements(dataSourceReactiveRuntimeConfig.cachePreparedStatements()); - if (dataSourceReactivePostgreSQLConfig.pipeliningLimit.isPresent()) { - pgConnectOptions.setPipeliningLimit(dataSourceReactivePostgreSQLConfig.pipeliningLimit.getAsInt()); + if (dataSourceReactivePostgreSQLConfig.pipeliningLimit().isPresent()) { + pgConnectOptions.setPipeliningLimit(dataSourceReactivePostgreSQLConfig.pipeliningLimit().getAsInt()); } - if (dataSourceReactivePostgreSQLConfig.sslMode.isPresent()) { - final SslMode sslMode = dataSourceReactivePostgreSQLConfig.sslMode.get(); + if (dataSourceReactivePostgreSQLConfig.sslMode().isPresent()) { + final SslMode sslMode = dataSourceReactivePostgreSQLConfig.sslMode().get(); pgConnectOptions.setSslMode(sslMode); // If sslMode is verify-full, we also need a hostname verification algorithm if (sslMode == SslMode.VERIFY_FULL - && (!dataSourceReactiveRuntimeConfig.hostnameVerificationAlgorithm.isPresent() - || "".equals(dataSourceReactiveRuntimeConfig.hostnameVerificationAlgorithm.get()))) { + && (!dataSourceReactiveRuntimeConfig.hostnameVerificationAlgorithm().isPresent() + || "".equals(dataSourceReactiveRuntimeConfig.hostnameVerificationAlgorithm().get()))) { throw new IllegalArgumentException( "quarkus.datasource.reactive.hostname-verification-algorithm must be specified under verify-full sslmode"); } } - pgConnectOptions.setTrustAll(dataSourceReactiveRuntimeConfig.trustAll); + pgConnectOptions.setTrustAll(dataSourceReactiveRuntimeConfig.trustAll()); - configurePemTrustOptions(pgConnectOptions, dataSourceReactiveRuntimeConfig.trustCertificatePem); - configureJksTrustOptions(pgConnectOptions, dataSourceReactiveRuntimeConfig.trustCertificateJks); - configurePfxTrustOptions(pgConnectOptions, dataSourceReactiveRuntimeConfig.trustCertificatePfx); + configurePemTrustOptions(pgConnectOptions, dataSourceReactiveRuntimeConfig.trustCertificatePem()); + configureJksTrustOptions(pgConnectOptions, dataSourceReactiveRuntimeConfig.trustCertificateJks()); + configurePfxTrustOptions(pgConnectOptions, dataSourceReactiveRuntimeConfig.trustCertificatePfx()); - configurePemKeyCertOptions(pgConnectOptions, dataSourceReactiveRuntimeConfig.keyCertificatePem); - configureJksKeyCertOptions(pgConnectOptions, dataSourceReactiveRuntimeConfig.keyCertificateJks); - configurePfxKeyCertOptions(pgConnectOptions, dataSourceReactiveRuntimeConfig.keyCertificatePfx); + configurePemKeyCertOptions(pgConnectOptions, dataSourceReactiveRuntimeConfig.keyCertificatePem()); + configureJksKeyCertOptions(pgConnectOptions, dataSourceReactiveRuntimeConfig.keyCertificateJks()); + configurePfxKeyCertOptions(pgConnectOptions, dataSourceReactiveRuntimeConfig.keyCertificatePfx()); - pgConnectOptions.setReconnectAttempts(dataSourceReactiveRuntimeConfig.reconnectAttempts); + pgConnectOptions.setReconnectAttempts(dataSourceReactiveRuntimeConfig.reconnectAttempts()); - pgConnectOptions.setReconnectInterval(dataSourceReactiveRuntimeConfig.reconnectInterval.toMillis()); + pgConnectOptions.setReconnectInterval(dataSourceReactiveRuntimeConfig.reconnectInterval().toMillis()); - dataSourceReactiveRuntimeConfig.hostnameVerificationAlgorithm.ifPresent( + dataSourceReactiveRuntimeConfig.hostnameVerificationAlgorithm().ifPresent( pgConnectOptions::setHostnameVerificationAlgorithm); - dataSourceReactiveRuntimeConfig.additionalProperties.forEach(pgConnectOptions::addProperty); + dataSourceReactiveRuntimeConfig.additionalProperties().forEach(pgConnectOptions::addProperty); // Use the convention defined by Quarkus Micrometer Vert.x metrics to create metrics prefixed with postgresql. // and the client_name as tag. diff --git a/extensions/redis-cache/deployment/src/main/java/io/quarkus/cache/redis/deployment/RedisCacheProcessor.java b/extensions/redis-cache/deployment/src/main/java/io/quarkus/cache/redis/deployment/RedisCacheProcessor.java index 22ccdb2353519..4de5b1628d3f4 100644 --- a/extensions/redis-cache/deployment/src/main/java/io/quarkus/cache/redis/deployment/RedisCacheProcessor.java +++ b/extensions/redis-cache/deployment/src/main/java/io/quarkus/cache/redis/deployment/RedisCacheProcessor.java @@ -34,7 +34,7 @@ import io.quarkus.deployment.annotations.Record; import io.quarkus.deployment.builditem.CombinedIndexBuildItem; import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem; -import io.quarkus.redis.client.deployment.RequestedRedisClientBuildItem; +import io.quarkus.redis.deployment.client.RequestedRedisClientBuildItem; import io.quarkus.redis.runtime.client.config.RedisConfig; import io.smallrye.mutiny.Uni; diff --git a/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/DevServicesConfig.java b/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/DevServicesConfig.java similarity index 63% rename from extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/DevServicesConfig.java rename to extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/DevServicesConfig.java index f0e3c6035745f..4e2e2a1dd332a 100644 --- a/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/DevServicesConfig.java +++ b/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/DevServicesConfig.java @@ -1,15 +1,14 @@ -package io.quarkus.redis.client.deployment; +package io.quarkus.redis.deployment.client; import java.util.Map; -import java.util.Objects; import java.util.Optional; import java.util.OptionalInt; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; +import io.smallrye.config.WithDefault; @ConfigGroup -public class DevServicesConfig { +public interface DevServicesConfig { /** * If DevServices has been explicitly enabled or disabled. DevServices is generally enabled @@ -18,24 +17,22 @@ public class DevServicesConfig { * When DevServices is enabled Quarkus will attempt to automatically configure and start * a database when running in Dev or Test mode and when Docker is running. */ - @ConfigItem(defaultValue = "true") - public boolean enabled; + @WithDefault("true") + boolean enabled(); /** * The container image name to use, for container based DevServices providers. * If you want to use Redis Stack modules (bloom, graph, search...), use: * {@code redis/redis-stack-server:latest}. */ - @ConfigItem - public Optional imageName; + Optional imageName(); /** * Optional fixed port the dev service will listen to. *

* If not defined, the port will be chosen randomly. */ - @ConfigItem - public OptionalInt port; + OptionalInt port(); /** * Indicates if the Redis server managed by Quarkus Dev Services is shared. @@ -48,8 +45,8 @@ public class DevServicesConfig { *

* Container sharing is only used in dev mode. */ - @ConfigItem(defaultValue = "true") - public boolean shared; + @WithDefault("true") + boolean shared(); /** * The value of the {@code quarkus-dev-service-redis} label attached to the started container. @@ -61,32 +58,11 @@ public class DevServicesConfig { *

* This property is used when you need multiple shared Redis servers. */ - @ConfigItem(defaultValue = "redis") - public String serviceName; + @WithDefault("redis") + String serviceName(); /** * Environment variables that are passed to the container. */ - @ConfigItem - public Map containerEnv; - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - DevServicesConfig that = (DevServicesConfig) o; - return enabled == that.enabled && - Objects.equals(imageName, that.imageName) && - Objects.equals(port, that.port) && - Objects.equals(shared, that.shared) && - Objects.equals(serviceName, that.serviceName) && - Objects.equals(containerEnv, that.containerEnv); - } - - @Override - public int hashCode() { - return Objects.hash(enabled, imageName, port, shared, serviceName, containerEnv); - } + Map containerEnv(); } diff --git a/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/DevServicesRedisProcessor.java b/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/DevServicesRedisProcessor.java similarity index 95% rename from extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/DevServicesRedisProcessor.java rename to extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/DevServicesRedisProcessor.java index 4a0eccdb84e39..fcf87bc90f77d 100644 --- a/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/DevServicesRedisProcessor.java +++ b/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/DevServicesRedisProcessor.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment; +package io.quarkus.redis.deployment.client; import static io.quarkus.runtime.LaunchMode.DEVELOPMENT; @@ -34,7 +34,7 @@ import io.quarkus.deployment.logging.LoggingSetupBuildItem; import io.quarkus.devservices.common.ConfigureUtil; import io.quarkus.devservices.common.ContainerLocator; -import io.quarkus.redis.client.deployment.RedisBuildTimeConfig.DevServiceConfiguration; +import io.quarkus.redis.deployment.client.RedisBuildTimeConfig.DevServiceConfiguration; import io.quarkus.redis.runtime.client.config.RedisConfig; import io.quarkus.runtime.LaunchMode; import io.quarkus.runtime.configuration.ConfigUtils; @@ -70,8 +70,8 @@ public List startRedisContainers(LaunchModeBuildItem LoggingSetupBuildItem loggingSetupBuildItem, GlobalDevServicesConfig devServicesConfig) { - Map currentDevServicesConfiguration = new HashMap<>(config.additionalDevServices); - currentDevServicesConfiguration.put(RedisConfig.DEFAULT_CLIENT_NAME, config.defaultDevService); + Map currentDevServicesConfiguration = new HashMap<>(config.additionalDevServices()); + currentDevServicesConfiguration.put(RedisConfig.DEFAULT_CLIENT_NAME, config.defaultDevService()); // figure out if we need to shut down and restart existing redis containers // if not and the redis containers have already started we just return @@ -101,7 +101,7 @@ public List startRedisContainers(LaunchModeBuildItem for (Entry entry : currentDevServicesConfiguration.entrySet()) { String connectionName = entry.getKey(); RunningDevService devService = startContainer(dockerStatusBuildItem, connectionName, - entry.getValue().devservices, + entry.getValue().devservices(), launchMode.getLaunchMode(), !devServicesSharedNetworkBuildItem.isEmpty(), devServicesConfig.timeout); if (devService == null) { @@ -148,7 +148,7 @@ public List startRedisContainers(LaunchModeBuildItem private RunningDevService startContainer(DockerStatusBuildItem dockerStatusBuildItem, String name, DevServicesConfig devServicesConfig, LaunchMode launchMode, boolean useSharedNetwork, Optional timeout) { - if (!devServicesConfig.enabled) { + if (!devServicesConfig.enabled()) { // explicitly disabled log.debug("Not starting devservices for " + (RedisConfig.isDefaultClient(name) ? "default redis client" : name) + " as it has been disabled in the config"); @@ -171,21 +171,21 @@ private RunningDevService startContainer(DockerStatusBuildItem dockerStatusBuild return null; } - DockerImageName dockerImageName = DockerImageName.parse(devServicesConfig.imageName.orElse(REDIS_7_ALPINE)) + DockerImageName dockerImageName = DockerImageName.parse(devServicesConfig.imageName().orElse(REDIS_7_ALPINE)) .asCompatibleSubstituteFor(REDIS_7_ALPINE); Supplier defaultRedisServerSupplier = () -> { - QuarkusPortRedisContainer redisContainer = new QuarkusPortRedisContainer(dockerImageName, devServicesConfig.port, - launchMode == DEVELOPMENT ? devServicesConfig.serviceName : null, useSharedNetwork); + QuarkusPortRedisContainer redisContainer = new QuarkusPortRedisContainer(dockerImageName, devServicesConfig.port(), + launchMode == DEVELOPMENT ? devServicesConfig.serviceName() : null, useSharedNetwork); timeout.ifPresent(redisContainer::withStartupTimeout); - redisContainer.withEnv(devServicesConfig.containerEnv); + redisContainer.withEnv(devServicesConfig.containerEnv()); redisContainer.start(); String redisHost = REDIS_SCHEME + redisContainer.getHost() + ":" + redisContainer.getPort(); return new RunningDevService(Feature.REDIS_CLIENT.getName(), redisContainer.getContainerId(), redisContainer::close, configPrefix + RedisConfig.HOSTS_CONFIG_NAME, redisHost); }; - return redisContainerLocator.locateContainer(devServicesConfig.serviceName, devServicesConfig.shared, launchMode) + return redisContainerLocator.locateContainer(devServicesConfig.serviceName(), devServicesConfig.shared(), launchMode) .map(containerAddress -> { String redisUrl = REDIS_SCHEME + containerAddress.getUrl(); return new RunningDevService(Feature.REDIS_CLIENT.getName(), containerAddress.getId(), diff --git a/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/RedisBuildTimeConfig.java b/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RedisBuildTimeConfig.java similarity index 55% rename from extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/RedisBuildTimeConfig.java rename to extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RedisBuildTimeConfig.java index a6bac1a32ee56..b8388186140a2 100644 --- a/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/RedisBuildTimeConfig.java +++ b/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RedisBuildTimeConfig.java @@ -1,21 +1,25 @@ -package io.quarkus.redis.client.deployment; +package io.quarkus.redis.deployment.client; import java.util.Map; -import java.util.Objects; import io.quarkus.runtime.annotations.ConfigDocMapKey; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; +import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithDefault; +import io.smallrye.config.WithName; +import io.smallrye.config.WithParentName; -@ConfigRoot -public class RedisBuildTimeConfig { +@ConfigMapping(prefix = "quarkus.redis") +@ConfigRoot(phase = ConfigPhase.BUILD_TIME) +public interface RedisBuildTimeConfig { /** * The default redis client */ - @ConfigItem(name = ConfigItem.PARENT) - public RedisClientBuildTimeConfig defaultRedisClient; + @WithParentName + RedisClientBuildTimeConfig defaultRedisClient(); /** * Configures additional (named) Redis clients. @@ -44,52 +48,37 @@ public class RedisBuildTimeConfig { * } * */ - @ConfigItem(name = ConfigItem.PARENT) + @WithParentName @ConfigDocMapKey("redis-client-name") - public Map namedRedisClients; + Map namedRedisClients(); /** * Whether a health check is published in case the smallrye-health extension is present. */ - @ConfigItem(name = "health.enabled", defaultValue = "true") - public boolean healthEnabled; + @WithName("health.enabled") + @WithDefault("true") + boolean healthEnabled(); /** * Default Dev services configuration. */ - @ConfigItem(name = ConfigItem.PARENT) - public DevServiceConfiguration defaultDevService; + @WithParentName + DevServiceConfiguration defaultDevService(); /** * Additional dev services configurations */ - @ConfigItem(name = ConfigItem.PARENT) + @WithParentName @ConfigDocMapKey("additional-redis-clients") - public Map additionalDevServices; + Map additionalDevServices(); @ConfigGroup - public static class DevServiceConfiguration { + public interface DevServiceConfiguration { /** * Configuration for DevServices *

* DevServices allows Quarkus to automatically start Redis in dev and test mode. */ - @ConfigItem - public DevServicesConfig devservices; - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - DevServiceConfiguration that = (DevServiceConfiguration) o; - return Objects.equals(devservices, that.devservices); - } - - @Override - public int hashCode() { - return Objects.hash(devservices); - } + DevServicesConfig devservices(); } } diff --git a/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/RedisClientBuildTimeConfig.java b/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RedisClientBuildTimeConfig.java similarity index 63% rename from extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/RedisClientBuildTimeConfig.java rename to extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RedisClientBuildTimeConfig.java index 35881a5a397a3..10b09f752696c 100644 --- a/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/RedisClientBuildTimeConfig.java +++ b/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RedisClientBuildTimeConfig.java @@ -1,16 +1,16 @@ -package io.quarkus.redis.client.deployment; +package io.quarkus.redis.deployment.client; import java.util.List; import java.util.Optional; +import io.quarkus.runtime.annotations.ConfigDocDefault; 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; -@SuppressWarnings("OptionalUsedAsFieldOrParameterType") @ConfigGroup -public class RedisClientBuildTimeConfig { +public interface RedisClientBuildTimeConfig { /** * A list of files allowing to pre-load data into the Redis server. @@ -23,20 +23,19 @@ public class RedisClientBuildTimeConfig { *

  • Parameters including double-quotes must be wrapped into single-quotes
  • * */ - @ConfigItem(defaultValueDocumentation = "import.redis in DEV, TEST ; no-file otherwise") - @ConvertWith(TrimmedStringConverter.class) - public Optional> loadScript; + @ConfigDocDefault("import.redis in DEV, TEST ; no-file otherwise") + Optional<@WithConverter(TrimmedStringConverter.class) List> loadScript(); /** * When using {@code redisLoadScript}, indicates if the Redis database must be flushed (erased) before importing. */ - @ConfigItem(defaultValue = "true") - public boolean flushBeforeLoad; + @WithDefault("true") + boolean flushBeforeLoad(); /** * When using {@code redisLoadScript}, indicates if the import should only happen if the database is empty (no keys). */ - @ConfigItem(defaultValue = "true") - public boolean loadOnlyIfEmpty; + @WithDefault("true") + boolean loadOnlyIfEmpty(); } diff --git a/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/RedisClientProcessor.java b/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RedisClientProcessor.java similarity index 96% rename from extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/RedisClientProcessor.java rename to extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RedisClientProcessor.java index f745b7079eb88..55308b824e85d 100644 --- a/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/RedisClientProcessor.java +++ b/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RedisClientProcessor.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment; +package io.quarkus.redis.deployment.client; import static io.quarkus.redis.runtime.client.config.RedisConfig.DEFAULT_CLIENT_NAME; @@ -182,12 +182,12 @@ public void init( recorder.cleanup(shutdown); // Handle data import - preloadRedisData(DEFAULT_CLIENT_NAME, buildTimeConfig.defaultRedisClient, applicationArchivesBuildItem, + preloadRedisData(DEFAULT_CLIENT_NAME, buildTimeConfig.defaultRedisClient(), applicationArchivesBuildItem, launchMode.getLaunchMode(), nativeImageResources, hotDeploymentWatchedFiles, recorder); - if (buildTimeConfig.namedRedisClients != null) { - for (Map.Entry entry : buildTimeConfig.namedRedisClients.entrySet()) { + if (buildTimeConfig.namedRedisClients() != null) { + for (Map.Entry entry : buildTimeConfig.namedRedisClients().entrySet()) { preloadRedisData(entry.getKey(), entry.getValue(), applicationArchivesBuildItem, launchMode.getLaunchMode(), nativeImageResources, hotDeploymentWatchedFiles, recorder); } @@ -197,10 +197,10 @@ public void init( static Set configuredClientNames(RedisBuildTimeConfig buildTimeConfig, Config config) { Set names = new HashSet<>(); // redis client names from dev services - if (buildTimeConfig.defaultDevService.devservices.enabled) { + if (buildTimeConfig.defaultDevService().devservices().enabled()) { names.add(DEFAULT_CLIENT_NAME); } - names.addAll(buildTimeConfig.additionalDevServices.keySet()); + names.addAll(buildTimeConfig.additionalDevServices().keySet()); // redis client names declared in config for (String propertyName : config.getPropertyNames()) { if (propertyName.equals("quarkus.redis.hosts")) { @@ -255,12 +255,12 @@ private void preloadRedisData(String name, RedisClientBuildTimeConfig clientConf if (loadScriptPath != null && !Files.isDirectory(loadScriptPath)) { // enlist resource if present nativeImageResources.produce(new NativeImageResourceBuildItem(importFile)); - } else if (clientConfig != null && clientConfig.loadScript.isPresent()) { + } else if (clientConfig != null && clientConfig.loadScript().isPresent()) { //raise exception if explicit file is not present (i.e. not the default) throw new ConfigurationException( "Unable to find file referenced in '" + RedisConfig.propertyKey(name, "redis-load-script") + "=" - + String.join(", ", clientConfig.loadScript.get()) + + String.join(", ", clientConfig.loadScript().get()) + "'. Remove property or add file to your path."); } // in dev mode we want to make sure that we watch for changes to file even if it doesn't currently exist @@ -274,7 +274,7 @@ private void preloadRedisData(String name, RedisClientBuildTimeConfig clientConf if (!paths.isEmpty()) { if (clientConfig != null) { - recorder.preload(name, paths, clientConfig.flushBeforeLoad, clientConfig.loadOnlyIfEmpty); + recorder.preload(name, paths, clientConfig.flushBeforeLoad(), clientConfig.loadOnlyIfEmpty()); } else { recorder.preload(name, paths, true, true); } @@ -285,7 +285,7 @@ private void preloadRedisData(String name, RedisClientBuildTimeConfig clientConf @BuildStep HealthBuildItem addHealthCheck(RedisBuildTimeConfig buildTimeConfig) { return new HealthBuildItem("io.quarkus.redis.runtime.client.health.RedisHealthCheck", - buildTimeConfig.healthEnabled); + buildTimeConfig.healthEnabled()); } public static final String NO_REDIS_SCRIPT_FILE = "no-file"; @@ -294,7 +294,7 @@ private static List getRedisLoadScript(RedisClientBuildTimeConfig config if (config == null) { return List.of("import.redis"); } - var scripts = config.loadScript; + var scripts = config.loadScript(); if (scripts.isPresent()) { return scripts.get().stream() .filter(s -> !NO_REDIS_SCRIPT_FILE.equalsIgnoreCase(s)) diff --git a/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/RedisDatasourceProcessor.java b/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RedisDatasourceProcessor.java similarity index 95% rename from extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/RedisDatasourceProcessor.java rename to extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RedisDatasourceProcessor.java index 02cd21efcfc24..a9c8679b768a2 100644 --- a/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/RedisDatasourceProcessor.java +++ b/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RedisDatasourceProcessor.java @@ -1,8 +1,8 @@ -package io.quarkus.redis.client.deployment; +package io.quarkus.redis.deployment.client; -import static io.quarkus.redis.client.deployment.RedisClientProcessor.REDIS_CLIENT_ANNOTATION; -import static io.quarkus.redis.client.deployment.RedisClientProcessor.configureAndCreateSyntheticBean; -import static io.quarkus.redis.client.deployment.RedisClientProcessor.configuredClientNames; +import static io.quarkus.redis.deployment.client.RedisClientProcessor.REDIS_CLIENT_ANNOTATION; +import static io.quarkus.redis.deployment.client.RedisClientProcessor.configureAndCreateSyntheticBean; +import static io.quarkus.redis.deployment.client.RedisClientProcessor.configuredClientNames; import static io.quarkus.redis.runtime.client.config.RedisConfig.DEFAULT_CLIENT_NAME; import java.util.Collection; diff --git a/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/RedisMetricsBuildItem.java b/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RedisMetricsBuildItem.java similarity index 91% rename from extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/RedisMetricsBuildItem.java rename to extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RedisMetricsBuildItem.java index 7269b154cf237..1fafce0812eb5 100644 --- a/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/RedisMetricsBuildItem.java +++ b/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RedisMetricsBuildItem.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment; +package io.quarkus.redis.deployment.client; import io.quarkus.builder.item.SimpleBuildItem; import io.quarkus.redis.runtime.client.ObservableRedisMetrics; diff --git a/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/RequestedRedisClientBuildItem.java b/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RequestedRedisClientBuildItem.java similarity index 87% rename from extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/RequestedRedisClientBuildItem.java rename to extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RequestedRedisClientBuildItem.java index 342496cd7c8b0..a35af3572769c 100644 --- a/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/client/deployment/RequestedRedisClientBuildItem.java +++ b/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RequestedRedisClientBuildItem.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment; +package io.quarkus.redis.deployment.client; import io.quarkus.builder.item.MultiBuildItem; diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/RedisConfigClientNamesTest.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/RedisConfigClientNamesTest.java deleted file mode 100644 index 96e88d108df4b..0000000000000 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/RedisConfigClientNamesTest.java +++ /dev/null @@ -1,149 +0,0 @@ -package io.quarkus.redis.client.deployment; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.Map; -import java.util.Set; - -import org.eclipse.microprofile.config.spi.ConfigProviderResolver; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Test; - -import io.smallrye.config.SmallRyeConfig; -import io.smallrye.config.SmallRyeConfigBuilder; -import io.smallrye.config.common.MapBackedConfigSource; - -public class RedisConfigClientNamesTest { - - SmallRyeConfig config; - - @AfterEach - void tearDown() { - if (config != null) { - ConfigProviderResolver.instance().releaseConfig(config); - } - } - - private void createConfig(Map configMap) { - config = new SmallRyeConfigBuilder() - .withSources(new MapBackedConfigSource("test", configMap) { - }) - .build(); - } - - @Test - void testWithEmptyConfig() { - createConfig(Map.of()); - DevServicesConfig devservices = new DevServicesConfig(); - - RedisBuildTimeConfig.DevServiceConfiguration devService = new RedisBuildTimeConfig.DevServiceConfiguration(); - devService.devservices = devservices; - - RedisBuildTimeConfig redisBuildTimeConfig = new RedisBuildTimeConfig(); - redisBuildTimeConfig.defaultDevService = devService; - redisBuildTimeConfig.additionalDevServices = Map.of(); - - Set names = RedisClientProcessor.configuredClientNames(redisBuildTimeConfig, config); - assertThat(names).isEmpty(); - } - - @Test - void testWithDefaultConfig() { - createConfig(Map.of()); - DevServicesConfig devservices = new DevServicesConfig(); - devservices.enabled = true; - - RedisBuildTimeConfig.DevServiceConfiguration devService = new RedisBuildTimeConfig.DevServiceConfiguration(); - devService.devservices = devservices; - - RedisBuildTimeConfig redisBuildTimeConfig = new RedisBuildTimeConfig(); - redisBuildTimeConfig.defaultDevService = devService; - redisBuildTimeConfig.additionalDevServices = Map.of(); - - Set names = RedisClientProcessor.configuredClientNames(redisBuildTimeConfig, config); - assertThat(names).containsOnly(""); - } - - @Test - void testWithAdditionalDevServices() { - createConfig(Map.of()); - DevServicesConfig devservicesCfg = new DevServicesConfig(); - devservicesCfg.enabled = true; - - RedisBuildTimeConfig.DevServiceConfiguration devService = new RedisBuildTimeConfig.DevServiceConfiguration(); - devService.devservices = devservicesCfg; - - RedisBuildTimeConfig redisBuildTimeConfig = new RedisBuildTimeConfig(); - redisBuildTimeConfig.defaultDevService = devService; - - DevServicesConfig additionalDevService = new DevServicesConfig(); - additionalDevService.enabled = true; - - RedisBuildTimeConfig.DevServiceConfiguration additional = new RedisBuildTimeConfig.DevServiceConfiguration(); - additional.devservices = additionalDevService; - redisBuildTimeConfig.additionalDevServices = Map.of("additional", additional); - - Set names = RedisClientProcessor.configuredClientNames(redisBuildTimeConfig, config); - assertThat(names).containsOnly("", "additional"); - } - - @Test - void testWithDisabledDefaultDevServiceConfig() { - createConfig(Map.of()); - DevServicesConfig devservicesCfg = new DevServicesConfig(); - devservicesCfg.enabled = false; - - RedisBuildTimeConfig.DevServiceConfiguration devService = new RedisBuildTimeConfig.DevServiceConfiguration(); - devService.devservices = devservicesCfg; - - RedisBuildTimeConfig redisBuildTimeConfig = new RedisBuildTimeConfig(); - redisBuildTimeConfig.defaultDevService = devService; - - DevServicesConfig additionalDevService = new DevServicesConfig(); - additionalDevService.enabled = true; - - RedisBuildTimeConfig.DevServiceConfiguration additional = new RedisBuildTimeConfig.DevServiceConfiguration(); - additional.devservices = additionalDevService; - redisBuildTimeConfig.additionalDevServices = Map.of("additional", additional); - - Set names = RedisClientProcessor.configuredClientNames(redisBuildTimeConfig, config); - assertThat(names).containsOnly("additional"); - } - - @Test - void testWithDisabledDefaultDevServiceWithHostsConfig() { - createConfig(Map.of("quarkus.redis.hosts", "redis://localhost:1234")); - DevServicesConfig devservicesCfg = new DevServicesConfig(); - devservicesCfg.enabled = false; - - RedisBuildTimeConfig.DevServiceConfiguration devService = new RedisBuildTimeConfig.DevServiceConfiguration(); - devService.devservices = devservicesCfg; - - RedisBuildTimeConfig redisBuildTimeConfig = new RedisBuildTimeConfig(); - redisBuildTimeConfig.defaultDevService = devService; - - redisBuildTimeConfig.additionalDevServices = Map.of(); - - Set names = RedisClientProcessor.configuredClientNames(redisBuildTimeConfig, config); - assertThat(names).containsOnly(""); - } - - @Test - void testWithDisabledDefaultDevServiceWithAdditionalHostsConfig() { - createConfig(Map.of("quarkus.redis.my-redis.hosts", "redis://localhost:5678", - "quarkus.redis.my-redis-2.hosts-provider-name", "my-redis-2-provider")); - DevServicesConfig devservicesCfg = new DevServicesConfig(); - devservicesCfg.enabled = false; - - RedisBuildTimeConfig.DevServiceConfiguration devService = new RedisBuildTimeConfig.DevServiceConfiguration(); - devService.devservices = devservicesCfg; - - RedisBuildTimeConfig redisBuildTimeConfig = new RedisBuildTimeConfig(); - redisBuildTimeConfig.defaultDevService = devService; - - redisBuildTimeConfig.additionalDevServices = Map.of(); - - Set names = RedisClientProcessor.configuredClientNames(redisBuildTimeConfig, config); - assertThat(names).containsOnly("my-redis", "my-redis-2"); - } -} diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/ClientInjectionTest.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/ClientInjectionTest.java similarity index 98% rename from extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/ClientInjectionTest.java rename to extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/ClientInjectionTest.java index 8c535793a23b8..0f01a54c2472a 100644 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/ClientInjectionTest.java +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/ClientInjectionTest.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment; +package io.quarkus.redis.deployment.client; import jakarta.inject.Inject; diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/CustomizerTest.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/CustomizerTest.java similarity index 98% rename from extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/CustomizerTest.java rename to extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/CustomizerTest.java index 36cc8fd857573..0b3f7a4f5d27d 100644 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/CustomizerTest.java +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/CustomizerTest.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment; +package io.quarkus.redis.deployment.client; import java.util.List; import java.util.UUID; diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/RedisConfigClientNamesTest.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/RedisConfigClientNamesTest.java new file mode 100644 index 0000000000000..de4a7fd540287 --- /dev/null +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/RedisConfigClientNamesTest.java @@ -0,0 +1,187 @@ +package io.quarkus.redis.deployment.client; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Map; +import java.util.Optional; +import java.util.OptionalInt; +import java.util.Set; + +import org.eclipse.microprofile.config.spi.ConfigProviderResolver; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; + +import io.quarkus.redis.deployment.client.RedisBuildTimeConfig.DevServiceConfiguration; +import io.smallrye.config.SmallRyeConfig; +import io.smallrye.config.SmallRyeConfigBuilder; +import io.smallrye.config.common.MapBackedConfigSource; + +public class RedisConfigClientNamesTest { + + SmallRyeConfig config; + + @AfterEach + void tearDown() { + if (config != null) { + ConfigProviderResolver.instance().releaseConfig(config); + } + } + + private void createConfig(Map configMap) { + config = new SmallRyeConfigBuilder() + .withSources(new MapBackedConfigSource("test", configMap) { + }) + .build(); + } + + @Test + void testWithEmptyConfig() { + createConfig(Map.of()); + + RedisBuildTimeConfig redisBuildTimeConfig = createRedisBuildTimeConfig( + createDevServiceConfiguration(false), + Map.of()); + + Set names = RedisClientProcessor.configuredClientNames(redisBuildTimeConfig, config); + assertThat(names).isEmpty(); + } + + @Test + void testWithDefaultConfig() { + createConfig(Map.of()); + + RedisBuildTimeConfig redisBuildTimeConfig = createRedisBuildTimeConfig( + createDevServiceConfiguration(true), + Map.of()); + + Set names = RedisClientProcessor.configuredClientNames(redisBuildTimeConfig, config); + assertThat(names).containsOnly(""); + } + + @Test + void testWithAdditionalDevServices() { + createConfig(Map.of()); + + RedisBuildTimeConfig redisBuildTimeConfig = createRedisBuildTimeConfig( + createDevServiceConfiguration(true), + Map.of("additional", createDevServiceConfiguration(true))); + + Set names = RedisClientProcessor.configuredClientNames(redisBuildTimeConfig, config); + assertThat(names).containsOnly("", "additional"); + } + + @Test + void testWithDisabledDefaultDevServiceConfig() { + createConfig(Map.of()); + + RedisBuildTimeConfig redisBuildTimeConfig = createRedisBuildTimeConfig( + createDevServiceConfiguration(false), + Map.of("additional", createDevServiceConfiguration(true))); + + Set names = RedisClientProcessor.configuredClientNames(redisBuildTimeConfig, config); + assertThat(names).containsOnly("additional"); + } + + @Test + void testWithDisabledDefaultDevServiceWithHostsConfig() { + createConfig(Map.of("quarkus.redis.hosts", "redis://localhost:1234")); + + RedisBuildTimeConfig redisBuildTimeConfig = createRedisBuildTimeConfig( + createDevServiceConfiguration(false), + Map.of()); + + Set names = RedisClientProcessor.configuredClientNames(redisBuildTimeConfig, config); + assertThat(names).containsOnly(""); + } + + @Test + void testWithDisabledDefaultDevServiceWithAdditionalHostsConfig() { + createConfig(Map.of("quarkus.redis.my-redis.hosts", "redis://localhost:5678", + "quarkus.redis.my-redis-2.hosts-provider-name", "my-redis-2-provider")); + + RedisBuildTimeConfig redisBuildTimeConfig = createRedisBuildTimeConfig( + createDevServiceConfiguration(false), + Map.of()); + + Set names = RedisClientProcessor.configuredClientNames(redisBuildTimeConfig, config); + assertThat(names).containsOnly("my-redis", "my-redis-2"); + } + + private static RedisBuildTimeConfig createRedisBuildTimeConfig(DevServiceConfiguration defaultDevService, + Map additionalDevServices) { + RedisBuildTimeConfig redisBuildTimeConfig = new RedisBuildTimeConfig() { + + @Override + public RedisClientBuildTimeConfig defaultRedisClient() { + return null; + } + + @Override + public Map namedRedisClients() { + return Map.of(); + } + + @Override + public boolean healthEnabled() { + return false; + } + + @Override + public DevServiceConfiguration defaultDevService() { + return defaultDevService; + } + + @Override + public Map additionalDevServices() { + return additionalDevServices; + } + }; + + return redisBuildTimeConfig; + } + + private static DevServiceConfiguration createDevServiceConfiguration(boolean enabled) { + DevServicesConfig devServicesConfig = new DevServicesConfig() { + + @Override + public boolean enabled() { + return enabled; + } + + @Override + public Optional imageName() { + return Optional.empty(); + } + + @Override + public OptionalInt port() { + return OptionalInt.empty(); + } + + @Override + public boolean shared() { + return false; + } + + @Override + public String serviceName() { + return null; + } + + @Override + public Map containerEnv() { + return Map.of(); + } + }; + + DevServiceConfiguration devServiceConfiguration = new DevServiceConfiguration() { + + @Override + public DevServicesConfig devservices() { + return devServicesConfig; + } + }; + + return devServiceConfiguration; + } +} diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/RedisNoConfTest.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/RedisNoConfTest.java similarity index 95% rename from extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/RedisNoConfTest.java rename to extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/RedisNoConfTest.java index 82f6461e25939..8232b7aaa4e19 100644 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/RedisNoConfTest.java +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/RedisNoConfTest.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment; +package io.quarkus.redis.deployment.client; import jakarta.enterprise.inject.Any; import jakarta.enterprise.inject.Instance; diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/RedisTestResource.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/RedisTestResource.java similarity index 94% rename from extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/RedisTestResource.java rename to extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/RedisTestResource.java index 142008d8eb148..859d3ab729c64 100644 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/RedisTestResource.java +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/RedisTestResource.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment; +package io.quarkus.redis.deployment.client; import java.util.Map; diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/datasource/CustomCodecTest.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/datasource/CustomCodecTest.java similarity index 96% rename from extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/datasource/CustomCodecTest.java rename to extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/datasource/CustomCodecTest.java index 5ceb364a6d820..cc5e86c6d0c8b 100644 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/datasource/CustomCodecTest.java +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/datasource/CustomCodecTest.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment.datasource; +package io.quarkus.redis.deployment.client.datasource; import static org.assertj.core.api.Assertions.assertThat; @@ -14,11 +14,11 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import io.quarkus.redis.client.deployment.RedisTestResource; import io.quarkus.redis.datasource.RedisDataSource; import io.quarkus.redis.datasource.codecs.Codec; import io.quarkus.redis.datasource.codecs.Codecs; import io.quarkus.redis.datasource.hash.HashCommands; +import io.quarkus.redis.deployment.client.RedisTestResource; import io.quarkus.test.QuarkusUnitTest; import io.quarkus.test.common.QuarkusTestResource; diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/datasource/DataSourceInjectionTest.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/datasource/DataSourceInjectionTest.java similarity index 95% rename from extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/datasource/DataSourceInjectionTest.java rename to extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/datasource/DataSourceInjectionTest.java index 621fb5f254ee1..0b9783ca44356 100644 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/datasource/DataSourceInjectionTest.java +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/datasource/DataSourceInjectionTest.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment.datasource; +package io.quarkus.redis.deployment.client.datasource; import java.util.UUID; @@ -12,9 +12,9 @@ import org.junit.jupiter.api.extension.RegisterExtension; import io.quarkus.redis.client.RedisClientName; -import io.quarkus.redis.client.deployment.RedisTestResource; import io.quarkus.redis.datasource.ReactiveRedisDataSource; import io.quarkus.redis.datasource.RedisDataSource; +import io.quarkus.redis.deployment.client.RedisTestResource; import io.quarkus.test.QuarkusUnitTest; import io.quarkus.test.common.QuarkusTestResource; diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/datasource/DataSourceTest.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/datasource/DataSourceTest.java similarity index 92% rename from extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/datasource/DataSourceTest.java rename to extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/datasource/DataSourceTest.java index ec58e9b304fa5..736ec0e854098 100644 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/datasource/DataSourceTest.java +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/datasource/DataSourceTest.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment.datasource; +package io.quarkus.redis.deployment.client.datasource; import jakarta.inject.Inject; @@ -9,9 +9,9 @@ import org.junit.jupiter.api.extension.RegisterExtension; import io.quarkus.redis.client.RedisClientName; -import io.quarkus.redis.client.deployment.RedisTestResource; import io.quarkus.redis.datasource.RedisDataSource; import io.quarkus.redis.datasource.value.ValueCommands; +import io.quarkus.redis.deployment.client.RedisTestResource; import io.quarkus.test.QuarkusUnitTest; import io.quarkus.test.common.QuarkusTestResource; diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/devmode/IncrementResource.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/devmode/IncrementResource.java similarity index 94% rename from extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/devmode/IncrementResource.java rename to extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/devmode/IncrementResource.java index 7dd6cb2ba68ce..6ecdcfc19ca0f 100644 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/devmode/IncrementResource.java +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/devmode/IncrementResource.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment.devmode; +package io.quarkus.redis.deployment.client.devmode; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/devmode/RedisClientDevModeTestCase.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/devmode/RedisClientDevModeTestCase.java similarity index 95% rename from extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/devmode/RedisClientDevModeTestCase.java rename to extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/devmode/RedisClientDevModeTestCase.java index b1d3fa86b2fba..905cef0d54fbc 100644 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/devmode/RedisClientDevModeTestCase.java +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/devmode/RedisClientDevModeTestCase.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment.devmode; +package io.quarkus.redis.deployment.client.devmode; import java.util.function.Function; import java.util.function.Supplier; @@ -12,7 +12,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import io.quarkus.redis.client.deployment.RedisTestResource; +import io.quarkus.redis.deployment.client.RedisTestResource; import io.quarkus.test.QuarkusDevModeTest; import io.quarkus.test.common.QuarkusTestResource; import io.restassured.RestAssured; diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/devmode/RedisClientPreloadDevModeTestCase.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/devmode/RedisClientPreloadDevModeTestCase.java similarity index 94% rename from extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/devmode/RedisClientPreloadDevModeTestCase.java rename to extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/devmode/RedisClientPreloadDevModeTestCase.java index c7f92a468c249..dce82f588c555 100644 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/devmode/RedisClientPreloadDevModeTestCase.java +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/devmode/RedisClientPreloadDevModeTestCase.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment.devmode; +package io.quarkus.redis.deployment.client.devmode; import java.io.File; import java.util.function.Supplier; @@ -10,7 +10,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import io.quarkus.redis.client.deployment.RedisTestResource; +import io.quarkus.redis.deployment.client.RedisTestResource; import io.quarkus.test.QuarkusDevModeTest; import io.quarkus.test.common.QuarkusTestResource; import io.restassured.RestAssured; diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/patterns/BinaryTest.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/patterns/BinaryTest.java similarity index 95% rename from extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/patterns/BinaryTest.java rename to extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/patterns/BinaryTest.java index af6e25caa4c92..01cffd95c4dde 100644 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/patterns/BinaryTest.java +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/patterns/BinaryTest.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment.patterns; +package io.quarkus.redis.deployment.client.patterns; import java.util.NoSuchElementException; import java.util.Random; @@ -12,9 +12,9 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import io.quarkus.redis.client.deployment.RedisTestResource; import io.quarkus.redis.datasource.RedisDataSource; import io.quarkus.redis.datasource.value.ValueCommands; +import io.quarkus.redis.deployment.client.RedisTestResource; import io.quarkus.test.QuarkusUnitTest; import io.quarkus.test.common.QuarkusTestResource; diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/patterns/CacheTest.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/patterns/CacheTest.java similarity index 95% rename from extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/patterns/CacheTest.java rename to extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/patterns/CacheTest.java index 3e116d118feeb..aac3e85f7e441 100644 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/patterns/CacheTest.java +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/patterns/CacheTest.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment.patterns; +package io.quarkus.redis.deployment.client.patterns; import static org.awaitility.Awaitility.await; @@ -11,9 +11,9 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import io.quarkus.redis.client.deployment.RedisTestResource; import io.quarkus.redis.datasource.RedisDataSource; import io.quarkus.redis.datasource.value.ValueCommands; +import io.quarkus.redis.deployment.client.RedisTestResource; import io.quarkus.test.QuarkusUnitTest; import io.quarkus.test.common.QuarkusTestResource; diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/patterns/CounterTest.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/patterns/CounterTest.java similarity index 94% rename from extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/patterns/CounterTest.java rename to extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/patterns/CounterTest.java index 0757a70b00b2b..7d0dc766a6781 100644 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/patterns/CounterTest.java +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/patterns/CounterTest.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment.patterns; +package io.quarkus.redis.deployment.client.patterns; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; @@ -9,9 +9,9 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import io.quarkus.redis.client.deployment.RedisTestResource; import io.quarkus.redis.datasource.RedisDataSource; import io.quarkus.redis.datasource.value.ValueCommands; +import io.quarkus.redis.deployment.client.RedisTestResource; import io.quarkus.test.QuarkusUnitTest; import io.quarkus.test.common.QuarkusTestResource; diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/patterns/PubSubOnStartupTest.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/patterns/PubSubOnStartupTest.java similarity index 97% rename from extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/patterns/PubSubOnStartupTest.java rename to extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/patterns/PubSubOnStartupTest.java index f4ce1faf44868..2842c9cfd6d7d 100644 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/patterns/PubSubOnStartupTest.java +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/patterns/PubSubOnStartupTest.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment.patterns; +package io.quarkus.redis.deployment.client.patterns; import static org.awaitility.Awaitility.await; @@ -16,12 +16,12 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import io.quarkus.redis.client.deployment.RedisTestResource; import io.quarkus.redis.datasource.ReactiveRedisDataSource; import io.quarkus.redis.datasource.RedisDataSource; import io.quarkus.redis.datasource.pubsub.PubSubCommands; import io.quarkus.redis.datasource.pubsub.ReactivePubSubCommands; import io.quarkus.redis.datasource.value.ValueCommands; +import io.quarkus.redis.deployment.client.RedisTestResource; import io.quarkus.runtime.Startup; import io.quarkus.test.QuarkusUnitTest; import io.quarkus.test.common.QuarkusTestResource; diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/patterns/PubSubTest.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/patterns/PubSubTest.java similarity index 96% rename from extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/patterns/PubSubTest.java rename to extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/patterns/PubSubTest.java index 37dc206e81b78..a29a39d28c70e 100644 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/patterns/PubSubTest.java +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/patterns/PubSubTest.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment.patterns; +package io.quarkus.redis.deployment.client.patterns; import static org.awaitility.Awaitility.await; @@ -16,10 +16,10 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import io.quarkus.redis.client.deployment.RedisTestResource; import io.quarkus.redis.datasource.RedisDataSource; import io.quarkus.redis.datasource.pubsub.PubSubCommands; import io.quarkus.redis.datasource.value.ValueCommands; +import io.quarkus.redis.deployment.client.RedisTestResource; import io.quarkus.runtime.Startup; import io.quarkus.test.QuarkusUnitTest; import io.quarkus.test.common.QuarkusTestResource; diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/preloading/DefaultFileForDefaultClientPreloadingTest.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/preloading/DefaultFileForDefaultClientPreloadingTest.java similarity index 94% rename from extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/preloading/DefaultFileForDefaultClientPreloadingTest.java rename to extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/preloading/DefaultFileForDefaultClientPreloadingTest.java index 87c1f523303ae..6419d9e4dd13e 100644 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/preloading/DefaultFileForDefaultClientPreloadingTest.java +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/preloading/DefaultFileForDefaultClientPreloadingTest.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment.preloading; +package io.quarkus.redis.deployment.client.preloading; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.entry; @@ -12,8 +12,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import io.quarkus.redis.client.deployment.RedisTestResource; import io.quarkus.redis.datasource.RedisDataSource; +import io.quarkus.redis.deployment.client.RedisTestResource; import io.quarkus.test.QuarkusUnitTest; import io.quarkus.test.common.QuarkusTestResource; diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/preloading/MissingFilePreloadTest.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/preloading/MissingFilePreloadTest.java similarity index 92% rename from extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/preloading/MissingFilePreloadTest.java rename to extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/preloading/MissingFilePreloadTest.java index 3bcc40a11feae..64fc12756e415 100644 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/preloading/MissingFilePreloadTest.java +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/preloading/MissingFilePreloadTest.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment.preloading; +package io.quarkus.redis.deployment.client.preloading; import static org.assertj.core.api.Assertions.assertThat; @@ -12,8 +12,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import io.quarkus.redis.client.deployment.RedisTestResource; import io.quarkus.redis.datasource.RedisDataSource; +import io.quarkus.redis.deployment.client.RedisTestResource; import io.quarkus.test.QuarkusUnitTest; import io.quarkus.test.common.QuarkusTestResource; diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/preloading/MultiClientImportPreloadingTest.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/preloading/MultiClientImportPreloadingTest.java similarity index 96% rename from extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/preloading/MultiClientImportPreloadingTest.java rename to extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/preloading/MultiClientImportPreloadingTest.java index 5124edfe61bcb..796d8adc174e4 100644 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/preloading/MultiClientImportPreloadingTest.java +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/preloading/MultiClientImportPreloadingTest.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment.preloading; +package io.quarkus.redis.deployment.client.preloading; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.entry; @@ -14,8 +14,8 @@ import org.junit.jupiter.api.extension.RegisterExtension; import io.quarkus.redis.client.RedisClientName; -import io.quarkus.redis.client.deployment.RedisTestResource; import io.quarkus.redis.datasource.RedisDataSource; +import io.quarkus.redis.deployment.client.RedisTestResource; import io.quarkus.test.QuarkusUnitTest; import io.quarkus.test.common.QuarkusTestResource; diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/preloading/MultiClientImportPreloadingWithFlushAllTest.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/preloading/MultiClientImportPreloadingWithFlushAllTest.java similarity index 94% rename from extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/preloading/MultiClientImportPreloadingWithFlushAllTest.java rename to extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/preloading/MultiClientImportPreloadingWithFlushAllTest.java index cb50a71dbe7df..ea0084b546cfb 100644 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/preloading/MultiClientImportPreloadingWithFlushAllTest.java +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/preloading/MultiClientImportPreloadingWithFlushAllTest.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment.preloading; +package io.quarkus.redis.deployment.client.preloading; import static org.assertj.core.api.Assertions.assertThat; @@ -13,8 +13,8 @@ import org.junit.jupiter.api.extension.RegisterExtension; import io.quarkus.redis.client.RedisClientName; -import io.quarkus.redis.client.deployment.RedisTestResource; import io.quarkus.redis.datasource.RedisDataSource; +import io.quarkus.redis.deployment.client.RedisTestResource; import io.quarkus.test.QuarkusUnitTest; import io.quarkus.test.common.QuarkusTestResource; diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/preloading/MultiClientImportPreloadingWithOnlyIfEmptyTest.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/preloading/MultiClientImportPreloadingWithOnlyIfEmptyTest.java similarity index 94% rename from extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/preloading/MultiClientImportPreloadingWithOnlyIfEmptyTest.java rename to extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/preloading/MultiClientImportPreloadingWithOnlyIfEmptyTest.java index 313a6d6b087c7..3a875a126dba8 100644 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/preloading/MultiClientImportPreloadingWithOnlyIfEmptyTest.java +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/preloading/MultiClientImportPreloadingWithOnlyIfEmptyTest.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment.preloading; +package io.quarkus.redis.deployment.client.preloading; import static org.assertj.core.api.Assertions.assertThat; @@ -13,8 +13,8 @@ import org.junit.jupiter.api.extension.RegisterExtension; import io.quarkus.redis.client.RedisClientName; -import io.quarkus.redis.client.deployment.RedisTestResource; import io.quarkus.redis.datasource.RedisDataSource; +import io.quarkus.redis.deployment.client.RedisTestResource; import io.quarkus.test.QuarkusUnitTest; import io.quarkus.test.common.QuarkusTestResource; diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/preloading/MultipleFilesForDefaultClientImportPreloadingTest.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/preloading/MultipleFilesForDefaultClientImportPreloadingTest.java similarity index 95% rename from extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/preloading/MultipleFilesForDefaultClientImportPreloadingTest.java rename to extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/preloading/MultipleFilesForDefaultClientImportPreloadingTest.java index 15e6247fe1474..900a34f0f3c68 100644 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/preloading/MultipleFilesForDefaultClientImportPreloadingTest.java +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/preloading/MultipleFilesForDefaultClientImportPreloadingTest.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment.preloading; +package io.quarkus.redis.deployment.client.preloading; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.entry; @@ -13,8 +13,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import io.quarkus.redis.client.deployment.RedisTestResource; import io.quarkus.redis.datasource.RedisDataSource; +import io.quarkus.redis.deployment.client.RedisTestResource; import io.quarkus.test.QuarkusUnitTest; import io.quarkus.test.common.QuarkusTestResource; diff --git a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/preloading/NonDefaultFileForDefaultClientImportPreloadingTest.java b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/preloading/NonDefaultFileForDefaultClientImportPreloadingTest.java similarity index 94% rename from extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/preloading/NonDefaultFileForDefaultClientImportPreloadingTest.java rename to extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/preloading/NonDefaultFileForDefaultClientImportPreloadingTest.java index 1deebc7ca644c..b21aa0528e91c 100644 --- a/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/client/deployment/preloading/NonDefaultFileForDefaultClientImportPreloadingTest.java +++ b/extensions/redis-client/deployment/src/test/java/io/quarkus/redis/deployment/client/preloading/NonDefaultFileForDefaultClientImportPreloadingTest.java @@ -1,4 +1,4 @@ -package io.quarkus.redis.client.deployment.preloading; +package io.quarkus.redis.deployment.client.preloading; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.entry; @@ -13,8 +13,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import io.quarkus.redis.client.deployment.RedisTestResource; import io.quarkus.redis.datasource.RedisDataSource; +import io.quarkus.redis.deployment.client.RedisTestResource; import io.quarkus.test.QuarkusUnitTest; import io.quarkus.test.common.QuarkusTestResource; diff --git a/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/RedisClientRecorder.java b/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/RedisClientRecorder.java index 0fa2c0c432c16..1060772089656 100644 --- a/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/RedisClientRecorder.java +++ b/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/RedisClientRecorder.java @@ -103,10 +103,10 @@ public ConfigurationException get() { static Optional getConfigForName(RedisConfig cfg, String name) { if (RedisConfig.isDefaultClient(name)) { - return Optional.ofNullable(cfg.defaultRedisClient); + return Optional.ofNullable(cfg.defaultRedisClient()); } - for (Map.Entry entry : cfg.namedRedisClients.entrySet()) { + for (Map.Entry entry : cfg.namedRedisClients().entrySet()) { if (entry.getKey().equalsIgnoreCase(name)) { return Optional.of(entry.getValue()); } @@ -192,9 +192,9 @@ public RedisClient get() { private Duration getTimeoutForClient(String name) { Duration timeout; if (RedisConfig.isDefaultClient(name)) { - timeout = config.defaultRedisClient.timeout; + timeout = config.defaultRedisClient().timeout(); } else { - timeout = config.namedRedisClients.get(name).timeout; + timeout = config.namedRedisClients().get(name).timeout(); } return timeout; } diff --git a/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/VertxRedisClientFactory.java b/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/VertxRedisClientFactory.java index 683c154f93b49..c929e0e0eb5f7 100644 --- a/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/VertxRedisClientFactory.java +++ b/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/VertxRedisClientFactory.java @@ -45,13 +45,13 @@ public static Redis create(String name, Vertx vertx, RedisClientConfig config) { RedisOptions options = new RedisOptions(); List hosts = new ArrayList<>(); - if (config.hosts.isPresent()) { - hosts.addAll(config.hosts.get()); - for (URI uri : config.hosts.get()) { + if (config.hosts().isPresent()) { + hosts.addAll(config.hosts().get()); + for (URI uri : config.hosts().get()) { options.addConnectionString(uri.toString().trim()); } - } else if (config.hostsProviderName.isPresent()) { - RedisHostsProvider hostsProvider = findProvider(config.hostsProviderName.get()); + } else if (config.hostsProviderName().isPresent()) { + RedisHostsProvider hostsProvider = findProvider(config.hostsProviderName().get()); Set computedHosts = hostsProvider.getHosts(); hosts.addAll(computedHosts); for (URI uri : computedHosts) { @@ -62,26 +62,26 @@ public static Redis create(String name, Vertx vertx, RedisClientConfig config) { " 'quarkus.redis.host-provider-name' and have a bean providing the hosts programmatically."); } - if (RedisClientType.STANDALONE == config.clientType) { + if (RedisClientType.STANDALONE == config.clientType()) { if (hosts.size() > 1) { throw new ConfigurationException("Multiple Redis hosts supplied for non-clustered configuration"); } } - config.masterName.ifPresent(options::setMasterName); - options.setMaxNestedArrays(config.maxNestedArrays); - options.setMaxPoolSize(config.maxPoolSize); - options.setMaxPoolWaiting(config.maxPoolWaiting); - options.setMaxWaitingHandlers(config.maxWaitingHandlers); + config.masterName().ifPresent(options::setMasterName); + options.setMaxNestedArrays(config.maxNestedArrays()); + options.setMaxPoolSize(config.maxPoolSize()); + options.setMaxPoolWaiting(config.maxPoolWaiting()); + options.setMaxWaitingHandlers(config.maxWaitingHandlers()); - options.setProtocolNegotiation(config.protocolNegotiation); - options.setPassword(config.password.orElse(null)); - config.poolCleanerInterval.ifPresent(d -> options.setPoolCleanerInterval((int) d.toMillis())); - options.setPoolRecycleTimeout((int) config.poolRecycleTimeout.toMillis()); + options.setProtocolNegotiation(config.protocolNegotiation()); + options.setPassword(config.password().orElse(null)); + config.poolCleanerInterval().ifPresent(d -> options.setPoolCleanerInterval((int) d.toMillis())); + options.setPoolRecycleTimeout((int) config.poolRecycleTimeout().toMillis()); - config.role.ifPresent(options::setRole); - options.setType(config.clientType); - config.replicas.ifPresent(options::setUseReplicas); + config.role().ifPresent(options::setRole); + options.setType(config.clientType()); + config.replicas().ifPresent(options::setUseReplicas); options.setNetClientOptions(toNetClientOptions(config)); @@ -107,61 +107,61 @@ private static void customize(String name, RedisOptions options) { } private static NetClientOptions toNetClientOptions(RedisClientConfig config) { - NetConfig tcp = config.tcp; - TlsConfig tls = config.tls; + NetConfig tcp = config.tcp(); + TlsConfig tls = config.tls(); NetClientOptions net = new NetClientOptions(); - tcp.alpn.ifPresent(net::setUseAlpn); - tcp.applicationLayerProtocols.ifPresent(net::setApplicationLayerProtocols); - tcp.connectionTimeout.ifPresent(d -> net.setConnectTimeout((int) d.toMillis())); - tls.hostnameVerificationAlgorithm.ifPresent(net::setHostnameVerificationAlgorithm); - tcp.idleTimeout.ifPresent(d -> net.setIdleTimeout((int) d.toSeconds())); + tcp.alpn().ifPresent(net::setUseAlpn); + tcp.applicationLayerProtocols().ifPresent(net::setApplicationLayerProtocols); + tcp.connectionTimeout().ifPresent(d -> net.setConnectTimeout((int) d.toMillis())); + tls.hostnameVerificationAlgorithm().ifPresent(net::setHostnameVerificationAlgorithm); + tcp.idleTimeout().ifPresent(d -> net.setIdleTimeout((int) d.toSeconds())); - tcp.keepAlive.ifPresent(b -> net.setTcpKeepAlive(true)); - tcp.noDelay.ifPresent(b -> net.setTcpNoDelay(true)); + tcp.keepAlive().ifPresent(b -> net.setTcpKeepAlive(true)); + tcp.noDelay().ifPresent(b -> net.setTcpNoDelay(true)); - net.setSsl(tls.enabled).setTrustAll(tls.trustAll); + net.setSsl(tls.enabled()).setTrustAll(tls.trustAll()); - configurePemTrustOptions(net, tls.trustCertificatePem); - configureJksTrustOptions(net, tls.trustCertificateJks); - configurePfxTrustOptions(net, tls.trustCertificatePfx); + configurePemTrustOptions(net, tls.trustCertificatePem()); + configureJksTrustOptions(net, tls.trustCertificateJks()); + configurePfxTrustOptions(net, tls.trustCertificatePfx()); - configurePemKeyCertOptions(net, tls.keyCertificatePem); - configureJksKeyCertOptions(net, tls.keyCertificateJks); - configurePfxKeyCertOptions(net, tls.keyCertificatePfx); + configurePemKeyCertOptions(net, tls.keyCertificatePem()); + configureJksKeyCertOptions(net, tls.keyCertificateJks()); + configurePfxKeyCertOptions(net, tls.keyCertificatePfx()); - net.setReconnectAttempts(config.reconnectAttempts); - net.setReconnectInterval(config.reconnectInterval.toMillis()); + net.setReconnectAttempts(config.reconnectAttempts()); + net.setReconnectInterval(config.reconnectInterval().toMillis()); - tcp.localAddress.ifPresent(net::setLocalAddress); - tcp.nonProxyHosts.ifPresent(net::setNonProxyHosts); - tcp.proxyOptions.ifPresent(s -> { + tcp.localAddress().ifPresent(net::setLocalAddress); + tcp.nonProxyHosts().ifPresent(net::setNonProxyHosts); + if (tcp.proxyOptions().host().isPresent()) { ProxyOptions po = new ProxyOptions(); - po.setHost(s.host); - po.setType(s.type); - po.setPort(s.port); - s.username.ifPresent(po::setUsername); - s.password.ifPresent(po::setPassword); + po.setHost(tcp.proxyOptions().host().get()); + po.setType(tcp.proxyOptions().type()); + po.setPort(tcp.proxyOptions().port()); + tcp.proxyOptions().username().ifPresent(po::setUsername); + tcp.proxyOptions().password().ifPresent(po::setPassword); net.setProxyOptions(po); - }); - tcp.readIdleTimeout.ifPresent(d -> net.setReadIdleTimeout((int) d.toSeconds())); - tcp.reconnectAttempts.ifPresent(net::setReconnectAttempts); - tcp.reconnectInterval.ifPresent(v -> net.setReconnectInterval(v.toMillis())); - tcp.reuseAddress.ifPresent(net::setReuseAddress); - tcp.reusePort.ifPresent(net::setReusePort); - tcp.receiveBufferSize.ifPresent(net::setReceiveBufferSize); - tcp.sendBufferSize.ifPresent(net::setSendBufferSize); - tcp.soLinger.ifPresent(d -> net.setSoLinger((int) d.toMillis())); - tcp.secureTransportProtocols.ifPresent(net::setEnabledSecureTransportProtocols); - tcp.trafficClass.ifPresent(net::setTrafficClass); - tcp.noDelay.ifPresent(net::setTcpNoDelay); - tcp.cork.ifPresent(net::setTcpCork); - tcp.keepAlive.ifPresent(net::setTcpKeepAlive); - tcp.fastOpen.ifPresent(net::setTcpFastOpen); - tcp.quickAck.ifPresent(net::setTcpQuickAck); - tcp.writeIdleTimeout.ifPresent(d -> net.setWriteIdleTimeout((int) d.toSeconds())); - - tls.hostnameVerificationAlgorithm.ifPresent(net::setHostnameVerificationAlgorithm); + } + tcp.readIdleTimeout().ifPresent(d -> net.setReadIdleTimeout((int) d.toSeconds())); + tcp.reconnectAttempts().ifPresent(net::setReconnectAttempts); + tcp.reconnectInterval().ifPresent(v -> net.setReconnectInterval(v.toMillis())); + tcp.reuseAddress().ifPresent(net::setReuseAddress); + tcp.reusePort().ifPresent(net::setReusePort); + tcp.receiveBufferSize().ifPresent(net::setReceiveBufferSize); + tcp.sendBufferSize().ifPresent(net::setSendBufferSize); + tcp.soLinger().ifPresent(d -> net.setSoLinger((int) d.toMillis())); + tcp.secureTransportProtocols().ifPresent(net::setEnabledSecureTransportProtocols); + tcp.trafficClass().ifPresent(net::setTrafficClass); + tcp.noDelay().ifPresent(net::setTcpNoDelay); + tcp.cork().ifPresent(net::setTcpCork); + tcp.keepAlive().ifPresent(net::setTcpKeepAlive); + tcp.fastOpen().ifPresent(net::setTcpFastOpen); + tcp.quickAck().ifPresent(net::setTcpQuickAck); + tcp.writeIdleTimeout().ifPresent(d -> net.setWriteIdleTimeout((int) d.toSeconds())); + + tls.hostnameVerificationAlgorithm().ifPresent(net::setHostnameVerificationAlgorithm); return net; } diff --git a/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/config/NetConfig.java b/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/config/NetConfig.java index 842332498f43b..56eaf716d20cb 100644 --- a/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/config/NetConfig.java +++ b/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/config/NetConfig.java @@ -7,149 +7,124 @@ import java.util.Set; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; -@SuppressWarnings("OptionalUsedAsFieldOrParameterType") @ConfigGroup -public class NetConfig { +public interface NetConfig { /** * Set the ALPN usage. */ - @ConfigItem - public Optional alpn; + Optional alpn(); /** * Sets the list of application-layer protocols to provide to the server during the * {@code Application-Layer Protocol Negotiation}. */ - @ConfigItem - public Optional> applicationLayerProtocols; + Optional> applicationLayerProtocols(); /** * Sets the list of enabled SSL/TLS protocols. */ - @ConfigItem - public Optional> secureTransportProtocols; + Optional> secureTransportProtocols(); /** * Set the idle timeout. */ - @ConfigItem - public Optional idleTimeout; + Optional idleTimeout(); /** * Set the connect timeout. */ - @ConfigItem - public Optional connectionTimeout; + Optional connectionTimeout(); /** * Set a list of remote hosts that are not proxied when the client is configured to use a proxy. */ - @ConfigItem - public Optional> nonProxyHosts; + Optional> nonProxyHosts(); /** * Set proxy options for connections via CONNECT proxy */ - @ConfigItem - public Optional proxyOptions; + ProxyConfig proxyOptions(); /** * Set the read idle timeout. */ - @ConfigItem - public Optional readIdleTimeout; + Optional readIdleTimeout(); /** * Set the TCP receive buffer size. */ - @ConfigItem - public OptionalInt receiveBufferSize; + OptionalInt receiveBufferSize(); /** * Set the value of reconnect attempts. */ - @ConfigItem - public OptionalInt reconnectAttempts; + OptionalInt reconnectAttempts(); /** * Set the reconnect interval. */ - @ConfigItem - public Optional reconnectInterval; + Optional reconnectInterval(); /** * Whether to reuse the address. */ - @ConfigItem - public Optional reuseAddress; + Optional reuseAddress(); /** * Whether to reuse the port. */ - @ConfigItem - public Optional reusePort; + Optional reusePort(); /** * Set the TCP send buffer size. */ - @ConfigItem - public OptionalInt sendBufferSize; + OptionalInt sendBufferSize(); /** * Set the {@code SO_linger} keep alive duration. */ - @ConfigItem - public Optional soLinger; + Optional soLinger(); /** * Enable the {@code TCP_CORK} option - only with linux native transport. */ - @ConfigItem - public Optional cork; + Optional cork(); /** * Enable the {@code TCP_FASTOPEN} option - only with linux native transport. */ - @ConfigItem - public Optional fastOpen; + Optional fastOpen(); /** * Set whether keep alive is enabled */ - @ConfigItem - public Optional keepAlive; + Optional keepAlive(); /** * Set whether no delay is enabled */ - @ConfigItem - public Optional noDelay; + Optional noDelay(); /** * Enable the {@code TCP_QUICKACK} option - only with linux native transport. */ - @ConfigItem - public Optional quickAck; + Optional quickAck(); /** * Set the value of traffic class. */ - @ConfigItem - public OptionalInt trafficClass; + OptionalInt trafficClass(); /** * Set the write idle timeout. */ - @ConfigItem - public Optional writeIdleTimeout; + Optional writeIdleTimeout(); /** * Set the local interface to bind for network connections. * When the local address is null, it will pick any local address, the default local address is null. */ - @ConfigItem - public Optional localAddress; + Optional localAddress(); } diff --git a/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/config/ProxyConfig.java b/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/config/ProxyConfig.java index bb6fb3b040b81..aff77e22892b3 100644 --- a/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/config/ProxyConfig.java +++ b/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/config/ProxyConfig.java @@ -3,41 +3,38 @@ import java.util.Optional; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; +import io.smallrye.config.WithDefault; import io.vertx.core.net.ProxyType; @ConfigGroup -public class ProxyConfig { +public interface ProxyConfig { /** * Set proxy username. */ - @ConfigItem - public Optional username; + Optional username(); /** * Set proxy password. */ - @ConfigItem - public Optional password; + Optional password(); /** * Set proxy port. Defaults to 3128. */ - @ConfigItem(defaultValue = "3128") - public int port; + @WithDefault("3128") + int port(); /** * Set proxy host. */ - @ConfigItem - public String host; + Optional host(); /** * Set proxy type. * Accepted values are: {@code HTTP} (default), {@code SOCKS4} and {@code SOCKS5}. */ - @ConfigItem(defaultValue = "http") - public ProxyType type; + @WithDefault("http") + ProxyType type(); } diff --git a/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/config/RedisClientConfig.java b/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/config/RedisClientConfig.java index 7a193cd474a06..5fcd5069be44f 100644 --- a/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/config/RedisClientConfig.java +++ b/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/config/RedisClientConfig.java @@ -5,16 +5,17 @@ import java.util.Optional; import java.util.Set; +import io.quarkus.runtime.annotations.ConfigDocDefault; import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; +import io.smallrye.config.WithDefault; import io.vertx.redis.client.RedisClientType; import io.vertx.redis.client.RedisReplicas; import io.vertx.redis.client.RedisRole; -@SuppressWarnings("OptionalUsedAsFieldOrParameterType") @ConfigGroup -public class RedisClientConfig { +public interface RedisClientConfig { + /** * The redis hosts to use while connecting to the redis server. Only the cluster and sentinel modes will consider more than * 1 element. @@ -25,8 +26,7 @@ public class RedisClientConfig { * * @see Redis scheme on www.iana.org */ - @ConfigItem(name = RedisConfig.HOSTS_CONFIG_NAME) - public Optional> hosts; + Optional> hosts(); /** * The hosts provider bean name. @@ -37,75 +37,72 @@ public class RedisClientConfig { *

    * Used when `quarkus.redis.hosts` is not set. */ - @ConfigItem - public Optional hostsProviderName; + Optional hostsProviderName(); /** * The maximum delay to wait before a blocking command to redis server times out */ - @ConfigItem(defaultValue = "10s") - public Duration timeout; + @WithDefault("10s") + Duration timeout(); /** * The redis client type. * Accepted values are: {@code STANDALONE} (default), {@code CLUSTER}, {@code REPLICATION}, {@code SENTINEL}. */ - @ConfigItem(defaultValue = "standalone") - public RedisClientType clientType; + @WithDefault("standalone") + RedisClientType clientType(); /** * The master name (only considered in HA mode). */ - @ConfigItem(defaultValueDocumentation = "my-master") - public Optional masterName; + @ConfigDocDefault("my-master") + Optional masterName(); /** * The role name (only considered in Sentinel / HA mode). * Accepted values are: {@code MASTER}, {@code REPLICA}, {@code SENTINEL}. */ - @ConfigItem(defaultValueDocumentation = "master") - public Optional role; + @ConfigDocDefault("master") + Optional role(); /** * Whether to use replicas nodes (only considered in Cluster mode). * Accepted values are: {@code ALWAYS}, {@code NEVER}, {@code SHARE}. */ - @ConfigItem(defaultValueDocumentation = "never") - public Optional replicas; + @ConfigDocDefault("never") + Optional replicas(); /** * The default password for cluster/sentinel connections. *

    * If not set it will try to extract the value from the current default {@code #hosts}. */ - @ConfigItem - public Optional password; + Optional password(); /** * The maximum size of the connection pool. When working with cluster or sentinel. *

    * This value should be at least the total number of cluster member (or number of sentinels + 1) */ - @ConfigItem(defaultValue = "6") - public int maxPoolSize; + @WithDefault("6") + int maxPoolSize(); /** * The maximum waiting requests for a connection from the pool. */ - @ConfigItem(defaultValue = "24") - public int maxPoolWaiting; + @WithDefault("24") + int maxPoolWaiting(); /** * The duration indicating how often should the connection pool cleaner executes. */ - @ConfigItem - public Optional poolCleanerInterval; + Optional poolCleanerInterval(); /** * The timeout for a connection recycling. */ - @ConfigItem(defaultValue = "15") - public Duration poolRecycleTimeout; + @WithDefault("15") + Duration poolRecycleTimeout(); /** * Sets how many handlers is the client willing to queue. @@ -113,69 +110,66 @@ public class RedisClientConfig { * The client will always work on pipeline mode, this means that messages can start queueing. * Using this configuration option, you can control how much backlog you're willing to accept. */ - @ConfigItem(defaultValue = "2048") - public int maxWaitingHandlers; + @WithDefault("2048") + int maxWaitingHandlers(); /** * Tune how much nested arrays are allowed on a redis response. This affects the parser performance. */ - @ConfigItem(defaultValue = "32") - public int maxNestedArrays; + @WithDefault("32") + int maxNestedArrays(); /** * The number of reconnection attempts when a pooled connection cannot be established on first try. */ - @ConfigItem(defaultValue = "0") - public int reconnectAttempts; + @WithDefault("0") + int reconnectAttempts(); /** * The interval between reconnection attempts when a pooled connection cannot be established on first try. */ - @ConfigItem(defaultValue = "1") - public Duration reconnectInterval; + @WithDefault("1") + Duration reconnectInterval(); /** * Should the client perform {@code RESP protocol negotiation during the connection handshake. */ - @ConfigItem(defaultValue = "true") - public boolean protocolNegotiation; + @WithDefault("true") + boolean protocolNegotiation(); /** * TCP config. */ - @ConfigItem @ConfigDocSection - public NetConfig tcp; + NetConfig tcp(); /** * SSL/TLS config. */ - @ConfigItem @ConfigDocSection - public TlsConfig tls; + TlsConfig tls(); - @Override - public String toString() { + default String toDebugString() { return "RedisClientConfig{" + - "hosts=" + hosts + - ", hostsProviderName=" + hostsProviderName + - ", timeout=" + timeout + - ", clientType=" + clientType + - ", masterName=" + masterName + - ", role=" + role + - ", replicas=" + replicas + - ", password=" + password + - ", maxPoolSize=" + maxPoolSize + - ", maxPoolWaiting=" + maxPoolWaiting + - ", poolCleanerInterval=" + poolCleanerInterval + - ", poolRecycleTimeout=" + poolRecycleTimeout + - ", maxWaitingHandlers=" + maxWaitingHandlers + - ", maxNestedArrays=" + maxNestedArrays + - ", reconnectAttempts=" + reconnectAttempts + - ", reconnectInterval=" + reconnectInterval + - ", protocolNegotiation=" + protocolNegotiation + - ", tcp=" + tcp + - ", tls=" + tls + + "hosts=" + hosts() + + ", hostsProviderName=" + hostsProviderName() + + ", timeout=" + timeout() + + ", clientType=" + clientType() + + ", masterName=" + masterName() + + ", role=" + role() + + ", replicas=" + replicas() + + ", password=" + password() + + ", maxPoolSize=" + maxPoolSize() + + ", maxPoolWaiting=" + maxPoolWaiting() + + ", poolCleanerInterval=" + poolCleanerInterval() + + ", poolRecycleTimeout=" + poolRecycleTimeout() + + ", maxWaitingHandlers=" + maxWaitingHandlers() + + ", maxNestedArrays=" + maxNestedArrays() + + ", reconnectAttempts=" + reconnectAttempts() + + ", reconnectInterval=" + reconnectInterval() + + ", protocolNegotiation=" + protocolNegotiation() + + ", tcp=" + tcp() + + ", tls=" + tls() + '}'; } diff --git a/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/config/RedisConfig.java b/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/config/RedisConfig.java index a393329ab8fd7..ac13188c6338b 100644 --- a/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/config/RedisConfig.java +++ b/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/config/RedisConfig.java @@ -3,20 +3,24 @@ import java.util.Map; import io.quarkus.runtime.annotations.ConfigDocMapKey; -import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithParentName; + +@ConfigMapping(prefix = "quarkus.redis") +@ConfigRoot(phase = ConfigPhase.RUN_TIME) +public interface RedisConfig { -@ConfigRoot(phase = ConfigPhase.RUN_TIME, name = RedisConfig.REDIS_CONFIG_ROOT_NAME) -public class RedisConfig { public final static String REDIS_CONFIG_ROOT_NAME = "redis"; public final static String HOSTS_CONFIG_NAME = "hosts"; public static final String DEFAULT_CLIENT_NAME = ""; + /** * The default redis client */ - @ConfigItem(name = ConfigItem.PARENT) - public RedisClientConfig defaultRedisClient; + @WithParentName + RedisClientConfig defaultRedisClient(); /** * Configures additional (named) Redis clients. @@ -45,19 +49,18 @@ public class RedisConfig { * } * */ - @ConfigItem(name = ConfigItem.PARENT) + @WithParentName @ConfigDocMapKey("redis-client-name") - public Map namedRedisClients; + Map namedRedisClients(); - public static boolean isDefaultClient(String name) { + static boolean isDefaultClient(String name) { return DEFAULT_CLIENT_NAME.equalsIgnoreCase(name); } - public static String propertyKey(String name, String radical) { + static String propertyKey(String name, String radical) { String prefix = DEFAULT_CLIENT_NAME.equals(name) ? "quarkus.redis." : "quarkus.redis.\"" + name + "\"."; return prefix + radical; } - } diff --git a/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/config/TlsConfig.java b/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/config/TlsConfig.java index 52ec32b7189b3..44a4126b52752 100644 --- a/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/config/TlsConfig.java +++ b/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/config/TlsConfig.java @@ -3,81 +3,73 @@ import java.util.Optional; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.vertx.core.runtime.config.JksConfiguration; import io.quarkus.vertx.core.runtime.config.PemKeyCertConfiguration; import io.quarkus.vertx.core.runtime.config.PemTrustCertConfiguration; import io.quarkus.vertx.core.runtime.config.PfxConfiguration; +import io.smallrye.config.WithDefault; -@SuppressWarnings("OptionalUsedAsFieldOrParameterType") @ConfigGroup -public class TlsConfig { +public interface TlsConfig { /** * Whether SSL/TLS is enabled. */ - @ConfigItem(defaultValue = "false") - public boolean enabled; + @WithDefault("false") + boolean enabled(); /** * Enable trusting all certificates. Disabled by default. */ - @ConfigItem(defaultValue = "false") - public boolean trustAll; + @WithDefault("false") + boolean trustAll(); /** * Trust configuration in the PEM format. *

    * When enabled, {@code #trust-certificate-jks} and {@code #trust-certificate-pfx} must be disabled. */ - @ConfigItem - public PemTrustCertConfiguration trustCertificatePem; + PemTrustCertConfiguration trustCertificatePem(); /** * Trust configuration in the JKS format. *

    * When enabled, {@code #trust-certificate-pem} and {@code #trust-certificate-pfx} must be disabled. */ - @ConfigItem - public JksConfiguration trustCertificateJks; + JksConfiguration trustCertificateJks(); /** * Trust configuration in the PFX format. *

    * When enabled, {@code #trust-certificate-jks} and {@code #trust-certificate-pem} must be disabled. */ - @ConfigItem - public PfxConfiguration trustCertificatePfx; + PfxConfiguration trustCertificatePfx(); /** * Key/cert configuration in the PEM format. *

    * When enabled, {@code key-certificate-jks} and {@code #key-certificate-pfx} must be disabled. */ - @ConfigItem - public PemKeyCertConfiguration keyCertificatePem; + PemKeyCertConfiguration keyCertificatePem(); /** * Key/cert configuration in the JKS format. *

    * When enabled, {@code #key-certificate-pem} and {@code #key-certificate-pfx} must be disabled. */ - @ConfigItem - public JksConfiguration keyCertificateJks; + JksConfiguration keyCertificateJks(); /** * Key/cert configuration in the PFX format. *

    * When enabled, {@code key-certificate-jks} and {@code #key-certificate-pem} must be disabled. */ - @ConfigItem - public PfxConfiguration keyCertificatePfx; + PfxConfiguration keyCertificatePfx(); /** * The hostname verification algorithm to use in case the server's identity should be checked. * Should be HTTPS, LDAPS or an empty string. */ - @ConfigItem - public Optional hostnameVerificationAlgorithm; + Optional hostnameVerificationAlgorithm(); } diff --git a/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/health/RedisHealthCheck.java b/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/health/RedisHealthCheck.java index 2a986c6aa8a6a..d30c2068ef704 100644 --- a/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/health/RedisHealthCheck.java +++ b/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/client/health/RedisHealthCheck.java @@ -72,9 +72,9 @@ private String getClientName(Bean bean) { private Duration getTimeout(String name) { if (RedisConfig.isDefaultClient(name)) { - return config.defaultRedisClient.timeout; + return config.defaultRedisClient().timeout(); } else { - return config.namedRedisClients.get(name).timeout; + return config.namedRedisClients().get(name).timeout(); } } diff --git a/extensions/vertx-http/runtime/src/main/java/io/quarkus/vertx/http/runtime/VertxHttpRecorder.java b/extensions/vertx-http/runtime/src/main/java/io/quarkus/vertx/http/runtime/VertxHttpRecorder.java index 9ea8dffcd4ecd..a2dd06ae56a58 100644 --- a/extensions/vertx-http/runtime/src/main/java/io/quarkus/vertx/http/runtime/VertxHttpRecorder.java +++ b/extensions/vertx-http/runtime/src/main/java/io/quarkus/vertx/http/runtime/VertxHttpRecorder.java @@ -51,6 +51,7 @@ import io.quarkus.runtime.ShutdownContext; import io.quarkus.runtime.annotations.Recorder; import io.quarkus.runtime.configuration.ConfigInstantiator; +import io.quarkus.runtime.configuration.ConfigUtils; import io.quarkus.runtime.configuration.MemorySize; import io.quarkus.runtime.shutdown.ShutdownConfig; import io.quarkus.vertx.core.runtime.VertxCoreRecorder; @@ -243,8 +244,10 @@ public static void startServerAfterFailedStart() { Supplier supplier = VertxCoreRecorder.getVertx(); Vertx vertx; if (supplier == null) { - VertxConfiguration vertxConfiguration = new VertxConfiguration(); - ConfigInstantiator.handleObject(vertxConfiguration); + VertxConfiguration vertxConfiguration = ConfigUtils.emptyConfigBuilder() + .addDiscoveredSources() + .withMapping(VertxConfiguration.class) + .build().getConfigMapping(VertxConfiguration.class); vertx = VertxCoreRecorder.recoverFailedStart(vertxConfiguration).get(); } else { vertx = supplier.get(); diff --git a/extensions/vertx/deployment/src/main/java/io/quarkus/vertx/deployment/VertxBuildConfig.java b/extensions/vertx/deployment/src/main/java/io/quarkus/vertx/deployment/VertxBuildConfig.java index b2c13043ae971..2405c327c0d2b 100644 --- a/extensions/vertx/deployment/src/main/java/io/quarkus/vertx/deployment/VertxBuildConfig.java +++ b/extensions/vertx/deployment/src/main/java/io/quarkus/vertx/deployment/VertxBuildConfig.java @@ -1,17 +1,21 @@ package io.quarkus.vertx.deployment; -import io.quarkus.runtime.annotations.ConfigItem; +import io.quarkus.runtime.annotations.ConfigDocIgnore; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithDefault; -@ConfigRoot(name = "vertx", phase = ConfigPhase.BUILD_TIME) -public class VertxBuildConfig { +@ConfigMapping(prefix = "quarkus.vertx") +@ConfigRoot(phase = ConfigPhase.BUILD_TIME) +public interface VertxBuildConfig { /** * If set to {@code true} then a customized current context factory (backed by a Vert.x duplicated local context) is used * for normal scopes in ArC. */ - @ConfigItem(generateDocumentation = false, defaultValue = "true") - public boolean customizeArcContext; + @ConfigDocIgnore + @WithDefault("true") + public boolean customizeArcContext(); } diff --git a/extensions/vertx/deployment/src/main/java/io/quarkus/vertx/deployment/VertxProcessor.java b/extensions/vertx/deployment/src/main/java/io/quarkus/vertx/deployment/VertxProcessor.java index 0b45eb5d072d3..389d837468266 100644 --- a/extensions/vertx/deployment/src/main/java/io/quarkus/vertx/deployment/VertxProcessor.java +++ b/extensions/vertx/deployment/src/main/java/io/quarkus/vertx/deployment/VertxProcessor.java @@ -103,7 +103,7 @@ VertxBuildItem build(CoreVertxBuildItem vertx, VertxRecorder recorder, @Record(ExecutionTime.STATIC_INIT) void currentContextFactory(BuildProducer currentContextFactory, VertxBuildConfig buildConfig, VertxRecorder recorder) { - if (buildConfig.customizeArcContext) { + if (buildConfig.customizeArcContext()) { currentContextFactory.produce(new CurrentContextFactoryBuildItem(recorder.currentContextFactory())); } } diff --git a/extensions/vertx/latebound-mdc-provider/pom.xml b/extensions/vertx/latebound-mdc-provider/pom.xml index 33c15658fdcd3..2681b17337dc5 100644 --- a/extensions/vertx/latebound-mdc-provider/pom.xml +++ b/extensions/vertx/latebound-mdc-provider/pom.xml @@ -10,7 +10,7 @@ 4.0.0 quarkus-vertx-latebound-mdc-provider - Quarkus - Quarkus - Vert.x Late Bound MDC Provider + Quarkus - Vert.x Late Bound MDC Provider Quarkus Vert.x Late Bound MDC Provider diff --git a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/QuarkusExecutorFactory.java b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/QuarkusExecutorFactory.java index d5652f6bb29c5..4e59dd5f1abe0 100644 --- a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/QuarkusExecutorFactory.java +++ b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/QuarkusExecutorFactory.java @@ -53,20 +53,20 @@ private ExecutorService internalCreateExecutor(ThreadFactory threadFactory, Inte builder.setMaximumPoolSize(maxConcurrency != null ? maxConcurrency : Math.max(8 * cpus, 200)); if (conf != null) { - if (conf.queueSize.isPresent()) { - if (conf.queueSize.getAsInt() < 0) { + if (conf.queueSize().isPresent()) { + if (conf.queueSize().getAsInt() < 0) { builder.setMaximumQueueSize(Integer.MAX_VALUE); } else { - builder.setMaximumQueueSize(conf.queueSize.getAsInt()); + builder.setMaximumQueueSize(conf.queueSize().getAsInt()); } } - builder.setGrowthResistance(conf.growthResistance); - builder.setKeepAliveTime(conf.keepAliveTime); + builder.setGrowthResistance(conf.growthResistance()); + builder.setKeepAliveTime(conf.keepAliveTime()); } final EnhancedQueueExecutor eqe = builder.build(); - if (conf != null && conf.prefill) { + if (conf != null && conf.prefill()) { eqe.prestartAllCoreThreads(); } diff --git a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/SSLConfigHelper.java b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/SSLConfigHelper.java index 05644a3f7bb62..e7d77a2ca3158 100644 --- a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/SSLConfigHelper.java +++ b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/SSLConfigHelper.java @@ -14,7 +14,7 @@ public class SSLConfigHelper { public static void configurePemTrustOptions(TCPSSLOptions options, PemTrustCertConfiguration configuration) { - if (configuration.enabled) { + if (configuration.enabled()) { ensureTrustOptionsNotSet(options); options.setTrustOptions(toPemTrustOptions(configuration)); } @@ -22,8 +22,8 @@ public static void configurePemTrustOptions(TCPSSLOptions options, PemTrustCertC private static PemTrustOptions toPemTrustOptions(PemTrustCertConfiguration configuration) { PemTrustOptions pemTrustOptions = new PemTrustOptions(); - if (configuration.certs.isPresent()) { - for (String cert : configuration.certs.get()) { + if (configuration.certs().isPresent()) { + for (String cert : configuration.certs().get()) { pemTrustOptions.addCertPath(cert); } } @@ -31,7 +31,7 @@ private static PemTrustOptions toPemTrustOptions(PemTrustCertConfiguration confi } public static void configureJksTrustOptions(TCPSSLOptions options, JksConfiguration configuration) { - if (configuration.enabled) { + if (configuration.enabled()) { ensureTrustOptionsNotSet(options); options.setTrustOptions(toJksOptions(configuration)); } @@ -39,17 +39,17 @@ public static void configureJksTrustOptions(TCPSSLOptions options, JksConfigurat private static JksOptions toJksOptions(JksConfiguration configuration) { JksOptions jksOptions = new JksOptions(); - if (configuration.path.isPresent()) { - jksOptions.setPath(configuration.path.get()); + if (configuration.path().isPresent()) { + jksOptions.setPath(configuration.path().get()); } - if (configuration.password.isPresent()) { - jksOptions.setPassword(configuration.password.get()); + if (configuration.password().isPresent()) { + jksOptions.setPassword(configuration.password().get()); } return jksOptions; } public static void configurePfxTrustOptions(TCPSSLOptions options, PfxConfiguration configuration) { - if (configuration.enabled) { + if (configuration.enabled()) { ensureTrustOptionsNotSet(options); options.setTrustOptions(toPfxOptions(configuration)); } @@ -57,11 +57,11 @@ public static void configurePfxTrustOptions(TCPSSLOptions options, PfxConfigurat private static PfxOptions toPfxOptions(PfxConfiguration configuration) { PfxOptions pfxOptions = new PfxOptions(); - if (configuration.path.isPresent()) { - pfxOptions.setPath(configuration.path.get()); + if (configuration.path().isPresent()) { + pfxOptions.setPath(configuration.path().get()); } - if (configuration.password.isPresent()) { - pfxOptions.setPassword(configuration.password.get()); + if (configuration.password().isPresent()) { + pfxOptions.setPassword(configuration.password().get()); } return pfxOptions; } @@ -73,7 +73,7 @@ private static void ensureTrustOptionsNotSet(TCPSSLOptions options) { } public static void configurePemKeyCertOptions(TCPSSLOptions options, PemKeyCertConfiguration configuration) { - if (configuration.enabled) { + if (configuration.enabled()) { ensureKeyCertOptionsNotSet(options); options.setKeyCertOptions(toPemKeyCertOptions(configuration)); } @@ -81,13 +81,13 @@ public static void configurePemKeyCertOptions(TCPSSLOptions options, PemKeyCertC private static KeyCertOptions toPemKeyCertOptions(PemKeyCertConfiguration configuration) { PemKeyCertOptions pemKeyCertOptions = new PemKeyCertOptions(); - if (configuration.certs.isPresent()) { - for (String cert : configuration.certs.get()) { + if (configuration.certs().isPresent()) { + for (String cert : configuration.certs().get()) { pemKeyCertOptions.addCertPath(cert); } } - if (configuration.keys.isPresent()) { - for (String cert : configuration.keys.get()) { + if (configuration.keys().isPresent()) { + for (String cert : configuration.keys().get()) { pemKeyCertOptions.addKeyPath(cert); } } @@ -95,14 +95,14 @@ private static KeyCertOptions toPemKeyCertOptions(PemKeyCertConfiguration config } public static void configureJksKeyCertOptions(TCPSSLOptions options, JksConfiguration configuration) { - if (configuration.enabled) { + if (configuration.enabled()) { ensureKeyCertOptionsNotSet(options); options.setKeyCertOptions(toJksOptions(configuration)); } } public static void configurePfxKeyCertOptions(TCPSSLOptions options, PfxConfiguration configuration) { - if (configuration.enabled) { + if (configuration.enabled()) { ensureKeyCertOptionsNotSet(options); options.setKeyCertOptions(toPfxOptions(configuration)); } diff --git a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/VertxCoreRecorder.java b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/VertxCoreRecorder.java index 5ac0b5769c9d4..5d578a4160c90 100644 --- a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/VertxCoreRecorder.java +++ b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/VertxCoreRecorder.java @@ -219,7 +219,7 @@ public VertxThread newVertxThread(Runnable target, String name, boolean worker, return createVertxThread(target, name, worker, maxExecTime, maxExecTimeUnit, launchMode, nonDevModeTccl); } }; - if (conf != null && conf.cluster != null && conf.cluster.clustered) { + if (conf != null && conf.cluster() != null && conf.cluster().clustered()) { CompletableFuture latch = new CompletableFuture<>(); new VertxBuilder(options) .threadFactory(vertxThreadFactory) @@ -296,7 +296,7 @@ private static Vertx logVertxInitialization(Vertx vertx) { private static VertxOptions convertToVertxOptions(VertxConfiguration conf, VertxOptions options, boolean allowClustering, ShutdownContext shutdown) { - if (!conf.useAsyncDNS) { + if (!conf.useAsyncDNS()) { System.setProperty(ResolverProvider.DISABLE_DNS_RESOLVER_PROP_NAME, "true"); } @@ -309,13 +309,13 @@ private static VertxOptions convertToVertxOptions(VertxConfiguration conf, Vertx } FileSystemOptions fileSystemOptions = new FileSystemOptions() - .setFileCachingEnabled(conf.caching) - .setClassPathResolvingEnabled(conf.classpathResolving); + .setFileCachingEnabled(conf.caching()) + .setClassPathResolvingEnabled(conf.classpathResolving()); String fileCacheDir = System.getProperty(CACHE_DIR_BASE_PROP_NAME); if (fileCacheDir == null) { File tmp = new File(System.getProperty("java.io.tmpdir", ".") + File.separator + VERTX_CACHE); - boolean cacheDirRequired = conf.caching || conf.classpathResolving; + boolean cacheDirRequired = conf.caching() || conf.classpathResolving(); if (!tmp.isDirectory() && cacheDirRequired) { if (!tmp.mkdirs()) { LOGGER.warnf("Unable to create Vert.x cache directory : %s", tmp.getAbsolutePath()); @@ -349,26 +349,26 @@ public void run() { } options.setFileSystemOptions(fileSystemOptions); - options.setWorkerPoolSize(conf.workerPoolSize); - options.setInternalBlockingPoolSize(conf.internalBlockingPoolSize); - blockingThreadPoolSize = conf.internalBlockingPoolSize; + options.setWorkerPoolSize(conf.workerPoolSize()); + options.setInternalBlockingPoolSize(conf.internalBlockingPoolSize()); + blockingThreadPoolSize = conf.internalBlockingPoolSize(); - options.setBlockedThreadCheckInterval(conf.warningExceptionTime.toMillis()); - if (conf.eventLoopsPoolSize.isPresent()) { - options.setEventLoopPoolSize(conf.eventLoopsPoolSize.getAsInt()); + options.setBlockedThreadCheckInterval(conf.warningExceptionTime().toMillis()); + if (conf.eventLoopsPoolSize().isPresent()) { + options.setEventLoopPoolSize(conf.eventLoopsPoolSize().getAsInt()); } else { options.setEventLoopPoolSize(calculateDefaultIOThreads()); } - options.setMaxEventLoopExecuteTime(conf.maxEventLoopExecuteTime.toMillis()); + options.setMaxEventLoopExecuteTime(conf.maxEventLoopExecuteTime().toMillis()); options.setMaxEventLoopExecuteTimeUnit(TimeUnit.MILLISECONDS); - options.setMaxWorkerExecuteTime(conf.maxWorkerExecuteTime.toMillis()); + options.setMaxWorkerExecuteTime(conf.maxWorkerExecuteTime().toMillis()); options.setMaxWorkerExecuteTimeUnit(TimeUnit.MILLISECONDS); - options.setWarningExceptionTime(conf.warningExceptionTime.toNanos()); + options.setWarningExceptionTime(conf.warningExceptionTime().toNanos()); - options.setPreferNativeTransport(conf.preferNativeTransport); + options.setPreferNativeTransport(conf.preferNativeTransport()); return options; } @@ -428,65 +428,66 @@ public void handle(AsyncResult ar) { } private static void initializeClusterOptions(VertxConfiguration conf, VertxOptions options) { - ClusterConfiguration cluster = conf.cluster; - options.getEventBusOptions().setClusterPingReplyInterval(cluster.pingReplyInterval.toMillis()); - options.getEventBusOptions().setClusterPingInterval(cluster.pingInterval.toMillis()); - if (cluster.host != null) { - options.getEventBusOptions().setHost(cluster.host); + ClusterConfiguration cluster = conf.cluster(); + options.getEventBusOptions().setClusterPingReplyInterval(cluster.pingReplyInterval().toMillis()); + options.getEventBusOptions().setClusterPingInterval(cluster.pingInterval().toMillis()); + if (cluster.host() != null) { + options.getEventBusOptions().setHost(cluster.host()); } - if (cluster.port.isPresent()) { - options.getEventBusOptions().setPort(cluster.port.getAsInt()); + if (cluster.port().isPresent()) { + options.getEventBusOptions().setPort(cluster.port().getAsInt()); } - if (cluster.publicHost.isPresent()) { - options.getEventBusOptions().setClusterPublicHost(cluster.publicHost.get()); + if (cluster.publicHost().isPresent()) { + options.getEventBusOptions().setClusterPublicHost(cluster.publicHost().get()); } - if (cluster.publicPort.isPresent()) { - options.getEventBusOptions().setPort(cluster.publicPort.getAsInt()); + if (cluster.publicPort().isPresent()) { + options.getEventBusOptions().setPort(cluster.publicPort().getAsInt()); } } private static void setEventBusOptions(VertxConfiguration conf, VertxOptions options) { - EventBusConfiguration eb = conf.eventbus; + EventBusConfiguration eb = conf.eventbus(); EventBusOptions opts = new EventBusOptions(); - opts.setAcceptBacklog(eb.acceptBacklog.orElse(-1)); - opts.setClientAuth(ClientAuth.valueOf(eb.clientAuth.toUpperCase())); - opts.setConnectTimeout((int) (Math.min(Integer.MAX_VALUE, eb.connectTimeout.toMillis()))); + opts.setAcceptBacklog(eb.acceptBacklog().orElse(-1)); + opts.setClientAuth(ClientAuth.valueOf(eb.clientAuth().toUpperCase())); + opts.setConnectTimeout((int) (Math.min(Integer.MAX_VALUE, eb.connectTimeout().toMillis()))); opts.setIdleTimeout( - eb.idleTimeout.isPresent() ? (int) Math.max(1, Math.min(Integer.MAX_VALUE, eb.idleTimeout.get().getSeconds())) + eb.idleTimeout().isPresent() + ? (int) Math.max(1, Math.min(Integer.MAX_VALUE, eb.idleTimeout().get().getSeconds())) : 0); - opts.setSendBufferSize(eb.sendBufferSize.orElse(-1)); - opts.setSoLinger(eb.soLinger.orElse(-1)); - opts.setSsl(eb.ssl); - opts.setReceiveBufferSize(eb.receiveBufferSize.orElse(-1)); - opts.setReconnectAttempts(eb.reconnectAttempts); - opts.setReconnectInterval(eb.reconnectInterval.toMillis()); - opts.setReuseAddress(eb.reuseAddress); - opts.setReusePort(eb.reusePort); - opts.setTrafficClass(eb.trafficClass.orElse(-1)); - opts.setTcpKeepAlive(eb.tcpKeepAlive); - opts.setTcpNoDelay(eb.tcpNoDelay); - opts.setTrustAll(eb.trustAll); + opts.setSendBufferSize(eb.sendBufferSize().orElse(-1)); + opts.setSoLinger(eb.soLinger().orElse(-1)); + opts.setSsl(eb.ssl()); + opts.setReceiveBufferSize(eb.receiveBufferSize().orElse(-1)); + opts.setReconnectAttempts(eb.reconnectAttempts()); + opts.setReconnectInterval(eb.reconnectInterval().toMillis()); + opts.setReuseAddress(eb.reuseAddress()); + opts.setReusePort(eb.reusePort()); + opts.setTrafficClass(eb.trafficClass().orElse(-1)); + opts.setTcpKeepAlive(eb.tcpKeepAlive()); + opts.setTcpNoDelay(eb.tcpNoDelay()); + opts.setTrustAll(eb.trustAll()); // Certificates and trust. - configurePemKeyCertOptions(opts, eb.keyCertificatePem); - configureJksKeyCertOptions(opts, eb.keyCertificateJks); - configurePfxKeyCertOptions(opts, eb.keyCertificatePfx); + configurePemKeyCertOptions(opts, eb.keyCertificatePem()); + configureJksKeyCertOptions(opts, eb.keyCertificateJks()); + configurePfxKeyCertOptions(opts, eb.keyCertificatePfx()); - configurePemTrustOptions(opts, eb.trustCertificatePem); - configureJksKeyCertOptions(opts, eb.trustCertificateJks); - configurePfxTrustOptions(opts, eb.trustCertificatePfx); + configurePemTrustOptions(opts, eb.trustCertificatePem()); + configureJksKeyCertOptions(opts, eb.trustCertificateJks()); + configurePfxTrustOptions(opts, eb.trustCertificatePfx()); options.setEventBusOptions(opts); } private static void setAddressResolverOptions(VertxConfiguration conf, VertxOptions options) { - AddressResolverConfiguration ar = conf.resolver; + AddressResolverConfiguration ar = conf.resolver(); AddressResolverOptions opts = new AddressResolverOptions(); - opts.setCacheMaxTimeToLive(ar.cacheMaxTimeToLive); - opts.setCacheMinTimeToLive(ar.cacheMinTimeToLive); - opts.setCacheNegativeTimeToLive(ar.cacheNegativeTimeToLive); - opts.setMaxQueries(ar.maxQueries); - opts.setQueryTimeout(ar.queryTimeout.toMillis()); + opts.setCacheMaxTimeToLive(ar.cacheMaxTimeToLive()); + opts.setCacheMinTimeToLive(ar.cacheMinTimeToLive()); + opts.setCacheNegativeTimeToLive(ar.cacheNegativeTimeToLive()); + opts.setMaxQueries(ar.maxQueries()); + opts.setQueryTimeout(ar.queryTimeout().toMillis()); options.setAddressResolverOptions(opts); } @@ -512,8 +513,8 @@ public EventLoopGroup get() { public Supplier calculateEventLoopThreads(VertxConfiguration conf) { int threads; - if (conf.eventLoopsPoolSize.isPresent()) { - threads = conf.eventLoopsPoolSize.getAsInt(); + if (conf.eventLoopsPoolSize().isPresent()) { + threads = conf.eventLoopsPoolSize().getAsInt(); } else { threads = calculateDefaultIOThreads(); } diff --git a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/AddressResolverConfiguration.java b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/AddressResolverConfiguration.java index 985e86c8509e8..54a9947e8f512 100644 --- a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/AddressResolverConfiguration.java +++ b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/AddressResolverConfiguration.java @@ -3,40 +3,40 @@ import java.time.Duration; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; +import io.smallrye.config.WithDefault; @ConfigGroup -public class AddressResolverConfiguration { +public interface AddressResolverConfiguration { /** * The maximum amount of time in seconds that a successfully resolved address will be cached. *

    * If not set explicitly, resolved addresses may be cached forever. */ - @ConfigItem(defaultValue = "2147483647") - public int cacheMaxTimeToLive; + @WithDefault("2147483647") + int cacheMaxTimeToLive(); /** * The minimum amount of time in seconds that a successfully resolved address will be cached. */ - @ConfigItem(defaultValue = "0") - public int cacheMinTimeToLive; + @WithDefault("0") + int cacheMinTimeToLive(); /** * The amount of time in seconds that an unsuccessful attempt to resolve an address will be cached. */ - @ConfigItem(defaultValue = "0") - public int cacheNegativeTimeToLive; + @WithDefault("0") + int cacheNegativeTimeToLive(); /** * The maximum number of queries to be sent during a resolution. */ - @ConfigItem(defaultValue = "4") - public int maxQueries; + @WithDefault("4") + int maxQueries(); /** * The duration after which a DNS query is considered to be failed. */ - @ConfigItem(defaultValue = "5S") - public Duration queryTimeout; + @WithDefault("5S") + Duration queryTimeout(); } diff --git a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/ClusterConfiguration.java b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/ClusterConfiguration.java index 93e3bd3dddd42..6a602ad1e1aea 100644 --- a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/ClusterConfiguration.java +++ b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/ClusterConfiguration.java @@ -5,50 +5,47 @@ import java.util.OptionalInt; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; +import io.smallrye.config.WithDefault; @ConfigGroup -public class ClusterConfiguration { +public interface ClusterConfiguration { /** * The host name. */ - @ConfigItem(defaultValue = "localhost") - public String host; + @WithDefault("localhost") + String host(); /** * The port. */ - @ConfigItem - public OptionalInt port; + OptionalInt port(); /** * The public host name. */ - @ConfigItem - public Optional publicHost; + Optional publicHost(); /** * The public port. */ - @ConfigItem - public OptionalInt publicPort; + OptionalInt publicPort(); /** * Enables or disables the clustering. */ - @ConfigItem - public boolean clustered; + @WithDefault("false") + boolean clustered(); /** * The ping interval. */ - @ConfigItem(defaultValue = "20") - public Duration pingInterval; + @WithDefault("20") + Duration pingInterval(); /** * The ping reply interval. */ - @ConfigItem(defaultValue = "20") - public Duration pingReplyInterval; + @WithDefault("20") + Duration pingReplyInterval(); } diff --git a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/EventBusConfiguration.java b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/EventBusConfiguration.java index ae289a76d02c8..7e7615754f4cc 100644 --- a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/EventBusConfiguration.java +++ b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/EventBusConfiguration.java @@ -5,141 +5,129 @@ import java.util.OptionalInt; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; +import io.smallrye.config.WithDefault; @ConfigGroup -public class EventBusConfiguration { +public interface EventBusConfiguration { /** * The key configuration for the PEM format. */ - @ConfigItem - public PemKeyCertConfiguration keyCertificatePem; + PemKeyCertConfiguration keyCertificatePem(); /** * The key configuration for the JKS format. */ - @ConfigItem - public JksConfiguration keyCertificateJks; + JksConfiguration keyCertificateJks(); /** * The key configuration for the PFX format. */ - @ConfigItem - public PfxConfiguration keyCertificatePfx; + PfxConfiguration keyCertificatePfx(); /** * The trust key configuration for the PEM format. */ - @ConfigItem - public PemTrustCertConfiguration trustCertificatePem; + PemTrustCertConfiguration trustCertificatePem(); /** * The trust key configuration for the JKS format. */ - @ConfigItem - public JksConfiguration trustCertificateJks; + JksConfiguration trustCertificateJks(); /** * The trust key configuration for the PFX format. */ - @ConfigItem - public PfxConfiguration trustCertificatePfx; + PfxConfiguration trustCertificatePfx(); /** * The accept backlog. */ - @ConfigItem - public OptionalInt acceptBacklog; + OptionalInt acceptBacklog(); /** * The client authentication. */ - @ConfigItem(defaultValue = "NONE") - public String clientAuth; + @WithDefault("NONE") + String clientAuth(); /** * The connect timeout. */ - @ConfigItem(defaultValue = "60") - public Duration connectTimeout; + @WithDefault("60") + Duration connectTimeout(); /** * The idle timeout in milliseconds. */ - @ConfigItem - public Optional idleTimeout; + Optional idleTimeout(); /** * The receive buffer size. */ - @ConfigItem - public OptionalInt receiveBufferSize; + OptionalInt receiveBufferSize(); /** * The number of reconnection attempts. */ - @ConfigItem - public int reconnectAttempts; + @WithDefault("0") + int reconnectAttempts(); /** * The reconnection interval in milliseconds. */ - @ConfigItem(defaultValue = "1") - public Duration reconnectInterval; + @WithDefault("1") + Duration reconnectInterval(); /** * Whether to reuse the address. */ - @ConfigItem(defaultValue = "true") - public boolean reuseAddress; + @WithDefault("true") + boolean reuseAddress(); /** * Whether to reuse the port. */ - @ConfigItem - public boolean reusePort; + @WithDefault("false") + boolean reusePort(); /** * The send buffer size. */ - @ConfigItem - public OptionalInt sendBufferSize; + OptionalInt sendBufferSize(); /** * The so linger. */ - @ConfigItem(name = "soLinger") - public OptionalInt soLinger; + OptionalInt soLinger(); /** * Enables or Disabled SSL. */ - @ConfigItem - public boolean ssl; + @WithDefault("false") + boolean ssl(); /** * Whether to keep the TCP connection opened (keep-alive). */ - @ConfigItem - public boolean tcpKeepAlive; + @WithDefault("false") + boolean tcpKeepAlive(); /** * Configure the TCP no delay. */ - @ConfigItem(defaultValue = "true") - public boolean tcpNoDelay; + @WithDefault("true") + boolean tcpNoDelay(); /** * Configure the traffic class. */ - @ConfigItem - public OptionalInt trafficClass; + OptionalInt trafficClass(); /** * Enables or disables the trust all parameter. */ - @ConfigItem - public boolean trustAll; + @WithDefault("false") + boolean trustAll(); } diff --git a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/JksConfiguration.java b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/JksConfiguration.java index 762b6f3e3cf84..1d382585135ca 100644 --- a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/JksConfiguration.java +++ b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/JksConfiguration.java @@ -3,26 +3,26 @@ import java.util.Optional; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; +import io.smallrye.config.WithDefault; +import io.smallrye.config.WithParentName; @ConfigGroup -public class JksConfiguration { +public interface JksConfiguration { /** * JKS config is disabled by default. */ - @ConfigItem(name = ConfigItem.PARENT, defaultValue = "false") - public boolean enabled = false; + @WithParentName + @WithDefault("false") + boolean enabled(); /** * Path of the key file (JKS format). */ - @ConfigItem - public Optional path = Optional.empty(); + Optional path(); /** * Password of the key file. */ - @ConfigItem - public Optional password = Optional.empty(); + Optional password(); } diff --git a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/PemKeyCertConfiguration.java b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/PemKeyCertConfiguration.java index b244c1653247c..dd20000655c8e 100644 --- a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/PemKeyCertConfiguration.java +++ b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/PemKeyCertConfiguration.java @@ -4,27 +4,27 @@ import java.util.Optional; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; +import io.smallrye.config.WithDefault; +import io.smallrye.config.WithParentName; @ConfigGroup -public class PemKeyCertConfiguration { +public interface PemKeyCertConfiguration { /** * PEM Key/cert config is disabled by default. */ - @ConfigItem(name = ConfigItem.PARENT, defaultValue = "false") - public boolean enabled = false; + @WithParentName + @WithDefault("false") + boolean enabled(); /** * Comma-separated list of the path to the key files (Pem format). */ - @ConfigItem - public Optional> keys = Optional.empty(); + Optional> keys(); /** * Comma-separated list of the path to the certificate files (Pem format). */ - @ConfigItem - public Optional> certs = Optional.empty(); + Optional> certs(); } diff --git a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/PemTrustCertConfiguration.java b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/PemTrustCertConfiguration.java index 6605e927e12c6..15dda1543430e 100644 --- a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/PemTrustCertConfiguration.java +++ b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/PemTrustCertConfiguration.java @@ -4,21 +4,22 @@ import java.util.Optional; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; +import io.smallrye.config.WithDefault; +import io.smallrye.config.WithParentName; @ConfigGroup -public class PemTrustCertConfiguration { +public interface PemTrustCertConfiguration { /** * PEM Trust config is disabled by default. */ - @ConfigItem(name = ConfigItem.PARENT, defaultValue = "false") - public boolean enabled = false; + @WithParentName + @WithDefault("false") + boolean enabled(); /** * Comma-separated list of the trust certificate files (Pem format). */ - @ConfigItem - public Optional> certs = Optional.empty(); + Optional> certs(); } diff --git a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/PfxConfiguration.java b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/PfxConfiguration.java index abe0e181fdc28..c1f929a831759 100644 --- a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/PfxConfiguration.java +++ b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/PfxConfiguration.java @@ -3,26 +3,26 @@ import java.util.Optional; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; +import io.smallrye.config.WithDefault; +import io.smallrye.config.WithParentName; @ConfigGroup -public class PfxConfiguration { +public interface PfxConfiguration { /** * PFX config is disabled by default. */ - @ConfigItem(name = ConfigItem.PARENT, defaultValue = "false") - public boolean enabled = false; + @WithParentName + @WithDefault("false") + boolean enabled(); /** * Path to the key file (PFX format). */ - @ConfigItem - public Optional path = Optional.empty(); + Optional path(); /** * Password of the key. */ - @ConfigItem - public Optional password = Optional.empty(); + Optional password(); } diff --git a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/VertxConfiguration.java b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/VertxConfiguration.java index 64956933fa62f..ce4fb73e1731d 100644 --- a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/VertxConfiguration.java +++ b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/core/runtime/config/VertxConfiguration.java @@ -3,66 +3,66 @@ import java.time.Duration; import java.util.OptionalInt; -import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithDefault; +@ConfigMapping(prefix = "quarkus.vertx") @ConfigRoot(phase = ConfigPhase.RUN_TIME) -public class VertxConfiguration { +public interface VertxConfiguration { /** * Enables or disables the Vert.x cache. */ - @ConfigItem(defaultValue = "true") - public boolean caching; + @WithDefault("true") + boolean caching(); /** * Enables or disabled the Vert.x classpath resource resolver. */ - @ConfigItem(defaultValue = "true") - public boolean classpathResolving; + @WithDefault("true") + boolean classpathResolving(); /** * The number of event loops. By default, it matches the number of CPUs detected on the system. */ - @ConfigItem - public OptionalInt eventLoopsPoolSize; + OptionalInt eventLoopsPoolSize(); /** * The maximum amount of time the event loop can be blocked. */ - @ConfigItem(defaultValue = "2") - public Duration maxEventLoopExecuteTime; + @WithDefault("2") + Duration maxEventLoopExecuteTime(); /** * The amount of time before a warning is displayed if the event loop is blocked. */ - @ConfigItem(defaultValue = "2") - public Duration warningExceptionTime; + @WithDefault("2") + Duration warningExceptionTime(); /** * The size of the worker thread pool. */ - @ConfigItem(defaultValue = "20") - public int workerPoolSize; + @WithDefault("20") + int workerPoolSize(); /** * The maximum amount of time the worker thread can be blocked. */ - @ConfigItem(defaultValue = "60") - public Duration maxWorkerExecuteTime; + @WithDefault("60") + Duration maxWorkerExecuteTime(); /** * The size of the internal thread pool (used for the file system). */ - @ConfigItem(defaultValue = "20") - public int internalBlockingPoolSize; + @WithDefault("20") + int internalBlockingPoolSize(); /** * The queue size. For most applications this should be unbounded */ - @ConfigItem - public OptionalInt queueSize; + OptionalInt queueSize(); /** * The executor growth resistance. @@ -72,51 +72,48 @@ public class VertxConfiguration { * threads beyond the core size should be created as aggressively as threads within it; a value of {@code 1.0f} * implies that threads beyond the core size should never be created. */ - @ConfigItem - public float growthResistance; + @WithDefault("0") + float growthResistance(); /** * The amount of time a thread will stay alive with no work. */ - @ConfigItem(defaultValue = "30") - public Duration keepAliveTime; + @WithDefault("30") + Duration keepAliveTime(); /** * Prefill thread pool when creating a new Executor. * When {@link io.vertx.core.spi.ExecutorServiceFactory#createExecutor} is called, * initialise with the number of defined threads at startup */ - @ConfigItem(defaultValue = "false") - public boolean prefill; + @WithDefault("false") + boolean prefill(); /** * Enables the async DNS resolver. */ - @ConfigItem - public boolean useAsyncDNS; + @WithDefault("false") + boolean useAsyncDNS(); /** * The event bus configuration. */ - @ConfigItem - public EventBusConfiguration eventbus; + EventBusConfiguration eventbus(); /** * The cluster configuration. */ - @ConfigItem - public ClusterConfiguration cluster; + ClusterConfiguration cluster(); /** * The address resolver configuration. */ - @ConfigItem - public AddressResolverConfiguration resolver; + AddressResolverConfiguration resolver(); /** * Enable or disable native transport */ - @ConfigItem - public boolean preferNativeTransport; + @WithDefault("false") + boolean preferNativeTransport(); } diff --git a/extensions/vertx/runtime/src/test/java/io/quarkus/vertx/core/runtime/VertxCoreProducerTest.java b/extensions/vertx/runtime/src/test/java/io/quarkus/vertx/core/runtime/VertxCoreProducerTest.java index 62bd8a0466429..7637442f08752 100644 --- a/extensions/vertx/runtime/src/test/java/io/quarkus/vertx/core/runtime/VertxCoreProducerTest.java +++ b/extensions/vertx/runtime/src/test/java/io/quarkus/vertx/core/runtime/VertxCoreProducerTest.java @@ -2,6 +2,7 @@ import java.time.Duration; import java.util.Arrays; +import java.util.List; import java.util.Optional; import java.util.OptionalInt; import java.util.concurrent.atomic.AtomicBoolean; @@ -42,18 +43,59 @@ public void tearDown() throws Exception { @Test public void shouldEnableClustering() { - VertxConfiguration configuration = createDefaultConfiguration(); - ClusterConfiguration cc = configuration.cluster; - cc.clustered = true; - cc.pingReplyInterval = Duration.ofSeconds(2); - cc.pingInterval = Duration.ofSeconds(2); - cc.publicHost = Optional.empty(); - configuration.workerPoolSize = 10; - configuration.warningExceptionTime = Duration.ofSeconds(1); - configuration.internalBlockingPoolSize = 5; - configuration.eventbus.connectTimeout = Duration.ofMinutes(1); - configuration.eventbus.acceptBacklog = OptionalInt.empty(); - configuration.cluster = cc; + VertxConfiguration configuration = new DefaultVertxConfiguration() { + + @Override + public ClusterConfiguration cluster() { + return new ClusterConfiguration() { + + @Override + public OptionalInt publicPort() { + return OptionalInt.empty(); + } + + @Override + public Optional publicHost() { + return Optional.empty(); + } + + @Override + public OptionalInt port() { + return OptionalInt.empty(); + } + + @Override + public Duration pingReplyInterval() { + return Duration.ofSeconds(2); + } + + @Override + public Duration pingInterval() { + return Duration.ofSeconds(2); + } + + @Override + public String host() { + return "localhost"; + } + + @Override + public boolean clustered() { + return true; + } + }; + } + + @Override + public int workerPoolSize() { + return 10; + } + + @Override + public Duration warningExceptionTime() { + return Duration.ofSeconds(1); + } + }; try { VertxCoreRecorder.initialize(configuration, null, null, LaunchMode.TEST); @@ -66,12 +108,38 @@ public void shouldEnableClustering() { @Test public void shouldConfigureAddressResolver() { - VertxConfiguration configuration = createDefaultConfiguration(); - AddressResolverConfiguration ar = configuration.resolver; - ar.cacheMaxTimeToLive = 3; - ar.cacheNegativeTimeToLive = 1; - ar.maxQueries = 2; - ar.queryTimeout = Duration.ofMillis(200L); + VertxConfiguration configuration = new DefaultVertxConfiguration() { + @Override + public AddressResolverConfiguration resolver() { + return new AddressResolverConfiguration() { + + @Override + public Duration queryTimeout() { + return Duration.ofMillis(200L); + } + + @Override + public int maxQueries() { + return 2; + } + + @Override + public int cacheNegativeTimeToLive() { + return 1; + } + + @Override + public int cacheMinTimeToLive() { + return 0; + } + + @Override + public int cacheMaxTimeToLive() { + return 3; + } + }; + } + }; VertxOptionsCustomizer customizers = new VertxOptionsCustomizer(Arrays.asList( new Consumer() { @@ -100,72 +168,357 @@ public void accept(VertxOptions vertxOptions) { called.set(true); } })); - Vertx v = VertxCoreRecorder.initialize(createDefaultConfiguration(), customizers, null, LaunchMode.TEST); + Vertx v = VertxCoreRecorder.initialize(new DefaultVertxConfiguration(), customizers, null, LaunchMode.TEST); Assertions.assertTrue(called.get(), "Customizer should get called during initialization"); } - private VertxConfiguration createDefaultConfiguration() { - final VertxConfiguration vc = new VertxConfiguration(); - vc.caching = true; - vc.classpathResolving = true; - vc.eventLoopsPoolSize = OptionalInt.empty(); - vc.maxEventLoopExecuteTime = Duration.ofSeconds(2); - vc.warningExceptionTime = Duration.ofSeconds(2); - vc.workerPoolSize = 20; - vc.maxWorkerExecuteTime = Duration.ofSeconds(1); - vc.internalBlockingPoolSize = 20; - vc.queueSize = OptionalInt.empty(); - vc.keepAliveTime = Duration.ofSeconds(30); - vc.useAsyncDNS = false; - vc.preferNativeTransport = false; - vc.eventbus = new EventBusConfiguration(); - vc.eventbus.keyCertificatePem = new PemKeyCertConfiguration(); - vc.eventbus.keyCertificatePem.keys = Optional.empty(); - vc.eventbus.keyCertificatePem.certs = Optional.empty(); - vc.eventbus.keyCertificateJks = new JksConfiguration(); - vc.eventbus.keyCertificateJks.path = Optional.empty(); - vc.eventbus.keyCertificateJks.password = Optional.empty(); - vc.eventbus.keyCertificatePfx = new PfxConfiguration(); - vc.eventbus.keyCertificatePfx.path = Optional.empty(); - vc.eventbus.keyCertificatePfx.password = Optional.empty(); - vc.eventbus.trustCertificatePem = new PemTrustCertConfiguration(); - vc.eventbus.trustCertificatePem.certs = Optional.empty(); - vc.eventbus.trustCertificateJks = new JksConfiguration(); - vc.eventbus.trustCertificateJks.path = Optional.empty(); - vc.eventbus.trustCertificateJks.password = Optional.empty(); - vc.eventbus.trustCertificatePfx = new PfxConfiguration(); - vc.eventbus.trustCertificatePfx.path = Optional.empty(); - vc.eventbus.trustCertificatePfx.password = Optional.empty(); - vc.eventbus.acceptBacklog = OptionalInt.empty(); - vc.eventbus.clientAuth = "NONE"; - vc.eventbus.connectTimeout = Duration.ofSeconds(60); - vc.eventbus.idleTimeout = Optional.empty(); - vc.eventbus.receiveBufferSize = OptionalInt.empty(); - vc.eventbus.reconnectAttempts = 0; - vc.eventbus.reconnectInterval = Duration.ofSeconds(1); - vc.eventbus.reuseAddress = true; - vc.eventbus.reusePort = false; - vc.eventbus.sendBufferSize = OptionalInt.empty(); - vc.eventbus.soLinger = OptionalInt.empty(); - vc.eventbus.ssl = false; - vc.eventbus.tcpKeepAlive = false; - vc.eventbus.tcpNoDelay = true; - vc.eventbus.trafficClass = OptionalInt.empty(); - vc.eventbus.trustAll = false; - vc.cluster = new ClusterConfiguration(); - vc.cluster.host = "localhost"; - vc.cluster.port = OptionalInt.empty(); - vc.cluster.publicHost = Optional.empty(); - vc.cluster.publicPort = OptionalInt.empty(); - vc.cluster.clustered = false; - vc.cluster.pingInterval = Duration.ofSeconds(20); - vc.cluster.pingReplyInterval = Duration.ofSeconds(20); - vc.resolver = new AddressResolverConfiguration(); - vc.resolver.cacheMaxTimeToLive = Integer.MAX_VALUE; - vc.resolver.cacheMinTimeToLive = 0; - vc.resolver.cacheNegativeTimeToLive = 0; - vc.resolver.maxQueries = 4; - vc.resolver.queryTimeout = Duration.ofSeconds(5); - return vc; + private static class DefaultVertxConfiguration implements VertxConfiguration { + @Override + public boolean caching() { + return true; + } + + @Override + public boolean classpathResolving() { + return true; + } + + @Override + public OptionalInt eventLoopsPoolSize() { + return OptionalInt.empty(); + } + + @Override + public Duration maxEventLoopExecuteTime() { + return Duration.ofSeconds(2); + } + + @Override + public Duration warningExceptionTime() { + return Duration.ofSeconds(2); + } + + @Override + public int workerPoolSize() { + return 20; + } + + @Override + public Duration maxWorkerExecuteTime() { + return Duration.ofSeconds(1); + } + + @Override + public int internalBlockingPoolSize() { + return 20; + } + + @Override + public OptionalInt queueSize() { + return OptionalInt.empty(); + } + + @Override + public float growthResistance() { + return 0; + } + + @Override + public Duration keepAliveTime() { + return Duration.ofSeconds(30); + } + + @Override + public boolean prefill() { + return false; + } + + @Override + public boolean useAsyncDNS() { + return false; + } + + @Override + public EventBusConfiguration eventbus() { + return new EventBusConfiguration() { + + @Override + public PfxConfiguration trustCertificatePfx() { + return new PfxConfiguration() { + @Override + public Optional path() { + return Optional.empty(); + } + + @Override + public Optional password() { + return Optional.empty(); + } + + @Override + public boolean enabled() { + return false; + } + }; + } + + @Override + public PemTrustCertConfiguration trustCertificatePem() { + return new PemTrustCertConfiguration() { + + @Override + public boolean enabled() { + return false; + } + + @Override + public Optional> certs() { + return Optional.empty(); + } + }; + } + + @Override + public JksConfiguration trustCertificateJks() { + return new JksConfiguration() { + + @Override + public Optional path() { + return Optional.empty(); + } + + @Override + public Optional password() { + return Optional.empty(); + } + + @Override + public boolean enabled() { + return false; + } + }; + } + + @Override + public boolean trustAll() { + return false; + } + + @Override + public OptionalInt trafficClass() { + return OptionalInt.empty(); + } + + @Override + public boolean tcpNoDelay() { + return false; + } + + @Override + public boolean tcpKeepAlive() { + return false; + } + + @Override + public boolean ssl() { + return false; + } + + @Override + public OptionalInt soLinger() { + return OptionalInt.empty(); + } + + @Override + public OptionalInt sendBufferSize() { + return OptionalInt.empty(); + } + + @Override + public boolean reusePort() { + return false; + } + + @Override + public boolean reuseAddress() { + return false; + } + + @Override + public Duration reconnectInterval() { + return Duration.ofSeconds(1); + } + + @Override + public int reconnectAttempts() { + return 0; + } + + @Override + public OptionalInt receiveBufferSize() { + return OptionalInt.empty(); + } + + @Override + public PfxConfiguration keyCertificatePfx() { + return new PfxConfiguration() { + + @Override + public Optional path() { + return Optional.empty(); + } + + @Override + public Optional password() { + return Optional.empty(); + } + + @Override + public boolean enabled() { + return false; + } + }; + } + + @Override + public PemKeyCertConfiguration keyCertificatePem() { + return new PemKeyCertConfiguration() { + + @Override + public Optional> keys() { + return Optional.empty(); + } + + @Override + public boolean enabled() { + return false; + } + + @Override + public Optional> certs() { + return Optional.empty(); + } + }; + } + + @Override + public JksConfiguration keyCertificateJks() { + return new JksConfiguration() { + + @Override + public Optional path() { + return Optional.empty(); + } + + @Override + public Optional password() { + return Optional.empty(); + } + + @Override + public boolean enabled() { + return false; + } + }; + } + + @Override + public Optional idleTimeout() { + return Optional.empty(); + } + + @Override + public Duration connectTimeout() { + return Duration.ofSeconds(60); + } + + @Override + public String clientAuth() { + return "NONE"; + } + + @Override + public OptionalInt acceptBacklog() { + return OptionalInt.empty(); + } + }; + } + + @Override + public ClusterConfiguration cluster() { + return new ClusterConfiguration() { + + @Override + public OptionalInt publicPort() { + return OptionalInt.empty(); + } + + @Override + public Optional publicHost() { + return Optional.empty(); + } + + @Override + public OptionalInt port() { + return OptionalInt.empty(); + } + + @Override + public Duration pingReplyInterval() { + return Duration.ofSeconds(20); + } + + @Override + public Duration pingInterval() { + return Duration.ofSeconds(20); + } + + @Override + public String host() { + return "localhost"; + } + + @Override + public boolean clustered() { + return false; + } + }; + } + + @Override + public AddressResolverConfiguration resolver() { + return new AddressResolverConfiguration() { + + @Override + public Duration queryTimeout() { + return Duration.ofSeconds(5); + } + + @Override + public int maxQueries() { + return 4; + } + + @Override + public int cacheNegativeTimeToLive() { + return 0; + } + + @Override + public int cacheMinTimeToLive() { + return 0; + } + + @Override + public int cacheMaxTimeToLive() { + return Integer.MAX_VALUE; + } + }; + } + + @Override + public boolean preferNativeTransport() { + return false; + } } }