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 de383813d88a7..87f20d5fe2d22 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 @@ -24,6 +24,7 @@ import io.quarkus.agroal.runtime.DataSources; import io.quarkus.agroal.runtime.DataSourcesJdbcBuildTimeConfig; import io.quarkus.agroal.runtime.TransactionIntegration; +import io.quarkus.agroal.spi.DefaultDataSourceDbKindBuildItem; import io.quarkus.agroal.spi.JdbcDataSourceBuildItem; import io.quarkus.agroal.spi.JdbcDriverBuildItem; import io.quarkus.arc.deployment.AdditionalBeanBuildItem; @@ -67,6 +68,7 @@ void agroal(BuildProducer feature, void build( DataSourcesBuildTimeConfig dataSourcesBuildTimeConfig, DataSourcesJdbcBuildTimeConfig dataSourcesJdbcBuildTimeConfig, + List defaultDbKinds, List jdbcDriverBuildItems, BuildProducer reflectiveClass, BuildProducer resource, @@ -81,7 +83,7 @@ void build( List aggregatedDataSourceBuildTimeConfigs = getAggregatedConfigBuildItems( dataSourcesBuildTimeConfig, dataSourcesJdbcBuildTimeConfig, - jdbcDriverBuildItems); + jdbcDriverBuildItems, defaultDbKinds); if (aggregatedDataSourceBuildTimeConfigs.isEmpty()) { log.warn("The Agroal dependency is present but no JDBC datasources have been defined."); @@ -255,16 +257,21 @@ void generateDataSourceBeans(AgroalRecorder recorder, private List getAggregatedConfigBuildItems( DataSourcesBuildTimeConfig dataSourcesBuildTimeConfig, DataSourcesJdbcBuildTimeConfig dataSourcesJdbcBuildTimeConfig, - List jdbcDriverBuildItems) { + List jdbcDriverBuildItems, List defaultDbKinds) { List dataSources = new ArrayList<>(); - if (dataSourcesBuildTimeConfig.defaultDataSource.dbKind.isPresent()) { + Optional effectiveDbKind = dataSourcesBuildTimeConfig.defaultDataSource.dbKind; + if (!effectiveDbKind.isPresent() && (defaultDbKinds.size() == 1)) { + effectiveDbKind = Optional.of(defaultDbKinds.get(0).getDbKind()); + } + + if (effectiveDbKind.isPresent()) { if (dataSourcesJdbcBuildTimeConfig.jdbc.enabled) { dataSources.add(new AggregatedDataSourceBuildTimeConfigBuildItem(DataSourceUtil.DEFAULT_DATASOURCE_NAME, dataSourcesBuildTimeConfig.defaultDataSource, dataSourcesJdbcBuildTimeConfig.jdbc, - dataSourcesBuildTimeConfig.defaultDataSource.dbKind.get(), - resolveDriver(DataSourceUtil.DEFAULT_DATASOURCE_NAME, dataSourcesBuildTimeConfig.defaultDataSource, + effectiveDbKind.get(), + resolveDriver(DataSourceUtil.DEFAULT_DATASOURCE_NAME, effectiveDbKind.get(), dataSourcesJdbcBuildTimeConfig.jdbc, jdbcDriverBuildItems))); } } @@ -279,20 +286,20 @@ private List getAggregatedConfigBu entry.getValue(), jdbcBuildTimeConfig, entry.getValue().dbKind.get(), - resolveDriver(entry.getKey(), entry.getValue(), jdbcBuildTimeConfig, jdbcDriverBuildItems))); + resolveDriver(entry.getKey(), entry.getValue().dbKind.get(), jdbcBuildTimeConfig, jdbcDriverBuildItems))); } return dataSources; } - private String resolveDriver(String dataSourceName, DataSourceBuildTimeConfig dataSourceBuildTimeConfig, + private String resolveDriver(String dataSourceName, String dbKind, DataSourceJdbcBuildTimeConfig dataSourceJdbcBuildTimeConfig, List jdbcDriverBuildItems) { if (dataSourceJdbcBuildTimeConfig.driver.isPresent()) { return dataSourceJdbcBuildTimeConfig.driver.get(); } Optional matchingJdbcDriver = jdbcDriverBuildItems.stream() - .filter(i -> dataSourceBuildTimeConfig.dbKind.get().equals(i.getDbKind())) + .filter(i -> dbKind.equals(i.getDbKind())) .findFirst(); if (matchingJdbcDriver.isPresent()) { @@ -306,7 +313,7 @@ private String resolveDriver(String dataSourceName, DataSourceBuildTimeConfig da } throw new ConfigurationException("Unable to find a JDBC driver corresponding to the database kind '" - + dataSourceBuildTimeConfig.dbKind.get() + "' for the " + + dbKind + "' for the " + (DataSourceUtil.isDefault(dataSourceName) ? "default datasource" : "datasource '" + dataSourceName + "'") + ". Either provide a suitable JDBC driver extension, define the driver manually, or disable the JDBC datasource by adding " diff --git a/extensions/agroal/spi/src/main/java/io/quarkus/agroal/spi/DefaultDataSourceDbKindBuildItem.java b/extensions/agroal/spi/src/main/java/io/quarkus/agroal/spi/DefaultDataSourceDbKindBuildItem.java new file mode 100644 index 0000000000000..edae0ec659f9c --- /dev/null +++ b/extensions/agroal/spi/src/main/java/io/quarkus/agroal/spi/DefaultDataSourceDbKindBuildItem.java @@ -0,0 +1,21 @@ +package io.quarkus.agroal.spi; + +import io.quarkus.builder.item.MultiBuildItem; + +/** + * A build item that represents the "quarkus.datasource.db-kind" value. + * This is generated by specific extensions that are meant to take away the burden of + * configuring anything datasource related from the user. + */ +public final class DefaultDataSourceDbKindBuildItem extends MultiBuildItem { + + private final String dbKind; + + public DefaultDataSourceDbKindBuildItem(String dbKind) { + this.dbKind = dbKind; + } + + public String getDbKind() { + return dbKind; + } +} diff --git a/extensions/jdbc/jdbc-postgresql/deployment/src/main/java/io/quarkus/jdbc/postgresql/deployment/JDBCPostgreSQLProcessor.java b/extensions/jdbc/jdbc-postgresql/deployment/src/main/java/io/quarkus/jdbc/postgresql/deployment/JDBCPostgreSQLProcessor.java index 1680495160c9a..31b7f0dcc9e3c 100644 --- a/extensions/jdbc/jdbc-postgresql/deployment/src/main/java/io/quarkus/jdbc/postgresql/deployment/JDBCPostgreSQLProcessor.java +++ b/extensions/jdbc/jdbc-postgresql/deployment/src/main/java/io/quarkus/jdbc/postgresql/deployment/JDBCPostgreSQLProcessor.java @@ -1,5 +1,6 @@ package io.quarkus.jdbc.postgresql.deployment; +import io.quarkus.agroal.spi.DefaultDataSourceDbKindBuildItem; import io.quarkus.agroal.spi.JdbcDriverBuildItem; import io.quarkus.arc.deployment.AdditionalBeanBuildItem; import io.quarkus.arc.processor.BuiltinScope; @@ -42,11 +43,14 @@ void configureAgroalConnection(BuildProducer additional } @BuildStep - void registerServiceBinding(Capabilities capabilities, BuildProducer serviceProvider) { + void registerServiceBinding(Capabilities capabilities, + BuildProducer serviceProvider, + BuildProducer dbKind) { if (capabilities.isPresent(Capability.KUBERNETES_SERVICE_BINDING)) { serviceProvider.produce( new ServiceProviderBuildItem("io.quarkus.kubernetes.service.binding.runtime.ServiceBindingConverter", PostgreSqlServiceBindingConverter.class.getName())); + dbKind.produce(new DefaultDataSourceDbKindBuildItem(DatabaseKind.POSTGRESQL)); } } }