diff --git a/core/deployment/src/main/java/io/quarkus/deployment/configuration/RunTimeConfigurationGenerator.java b/core/deployment/src/main/java/io/quarkus/deployment/configuration/RunTimeConfigurationGenerator.java index 377bac70e18c28..be8e34db07a4e0 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/configuration/RunTimeConfigurationGenerator.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/configuration/RunTimeConfigurationGenerator.java @@ -268,7 +268,7 @@ private RunTimeConfigurationGenerator() { } public static final class GenerateOperation implements AutoCloseable { - final boolean devMode; + final boolean liveReloadPossible; final LaunchMode launchMode; final AccessorFinder accessorFinder; final ClassOutput classOutput; @@ -286,8 +286,6 @@ public static final class GenerateOperation implements AutoCloseable { // default values given in the build configuration final Map specifiedRunTimeDefaultValues; final Map buildTimeRunTimeVisibleValues; - // default values produced by extensions via build item - final Map runTimeDefaults; final Map enclosingMemberMethods = new HashMap<>(); final Map, MethodDescriptor> groupInitMethods = new HashMap<>(); final Map, FieldDescriptor> configRootsByType = new HashMap<>(); @@ -321,7 +319,7 @@ public static final class GenerateOperation implements AutoCloseable { GenerateOperation(Builder builder) { this.launchMode = builder.launchMode; - this.devMode = builder.launchMode == LaunchMode.DEVELOPMENT; + this.liveReloadPossible = builder.liveReloadPossible; final BuildTimeConfigurationReader.ReadResult buildTimeReadResult = builder.buildTimeReadResult; buildTimeConfigResult = Assert.checkNotNullParam("buildTimeReadResult", buildTimeReadResult); specifiedRunTimeDefaultValues = Assert.checkNotNullParam("specifiedRunTimeDefaultValues", @@ -330,7 +328,6 @@ public static final class GenerateOperation implements AutoCloseable { buildTimeReadResult.getBuildTimeRunTimeVisibleValues()); classOutput = Assert.checkNotNullParam("classOutput", builder.getClassOutput()); roots = Assert.checkNotNullParam("builder.roots", builder.getBuildTimeReadResult().getAllRoots()); - runTimeDefaults = Assert.checkNotNullParam("runTimeDefaults", builder.getRunTimeDefaults()); additionalTypes = Assert.checkNotNullParam("additionalTypes", builder.getAdditionalTypes()); additionalBootstrapConfigSourceProviders = builder.getAdditionalBootstrapConfigSourceProviders(); staticConfigSources = builder.getStaticConfigSources(); @@ -348,7 +345,7 @@ public static final class GenerateOperation implements AutoCloseable { mc.invokeSpecialMethod(MethodDescriptor.ofConstructor(Object.class), mc.getThis()); mc.returnValue(null); } - if (devMode) { + if (liveReloadPossible) { reinit = cc.getMethodCreator(REINIT); reinit.setModifiers(Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC); } else { @@ -470,7 +467,7 @@ public void run() { // make the build time config global until we read the run time config - // at run time (when we're ready) we update the factory and then release the build time config installConfiguration(clinitConfig, clinit); - if (devMode) { + if (liveReloadPossible) { final ResultHandle buildTimeRunTimeDefaultValuesConfigSource = reinit .readStaticField(C_BUILD_TIME_RUN_TIME_DEFAULTS_CONFIG_SOURCE); // create the map for build time config source @@ -550,7 +547,7 @@ public void run() { // create the map for run time specified values config source final ResultHandle specifiedRunTimeValues = clinit.newInstance(HM_NEW); - if (!devMode) { + if (!liveReloadPossible) { //we don't need these in devmode //including it would just cache the first values //but these can already just be read directly, as we are in the same JVM @@ -559,17 +556,10 @@ public void run() { clinit.load(entry.getValue())); } } - for (Map.Entry entry : runTimeDefaults.entrySet()) { - if (!specifiedRunTimeDefaultValues.containsKey(entry.getKey())) { - // only add entry if the user didn't override it - clinit.invokeVirtualMethod(HM_PUT, specifiedRunTimeValues, clinit.load(entry.getKey()), - clinit.load(entry.getValue())); - } - } final ResultHandle specifiedRunTimeSource = clinit.newInstance(PCS_NEW, specifiedRunTimeValues, clinit.load("Specified default values"), clinit.load(Integer.MIN_VALUE + 100)); cc.getFieldCreator(C_SPECIFIED_RUN_TIME_CONFIG_SOURCE) - .setModifiers(Opcodes.ACC_STATIC | (devMode ? Opcodes.ACC_VOLATILE : Opcodes.ACC_FINAL)); + .setModifiers(Opcodes.ACC_STATIC | (liveReloadPossible ? Opcodes.ACC_VOLATILE : Opcodes.ACC_FINAL)); clinit.writeStaticField(C_SPECIFIED_RUN_TIME_CONFIG_SOURCE, specifiedRunTimeSource); // add in the custom sources that bootstrap config needs @@ -722,7 +712,7 @@ public void run() { // config root field is volatile in dev mode, final otherwise; we initialize it from clinit, and readConfig in dev mode cc.getFieldCreator(rootFieldDescriptor) .setModifiers(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC - | (devMode ? Opcodes.ACC_VOLATILE : Opcodes.ACC_FINAL)); + | (liveReloadPossible ? Opcodes.ACC_VOLATILE : Opcodes.ACC_FINAL)); // construct instance in ResultHandle instance; @@ -742,7 +732,7 @@ public void run() { } clinit.invokeStaticMethod(initGroup, clinitConfig, clinitNameBuilder, instance); clinit.invokeVirtualMethod(SB_SET_LENGTH, clinitNameBuilder, clInitOldLen); - if (devMode) { + if (liveReloadPossible) { instance = readConfig.readStaticField(rootFieldDescriptor); if (!rootName.isEmpty()) { readConfig.invokeVirtualMethod(SB_APPEND_CHAR, readConfigNameBuilder, readConfig.load('.')); @@ -812,7 +802,7 @@ public void run() { clinit.invokeStaticMethod(CD_UNKNOWN_PROPERTIES, clinit.readStaticField(FieldDescriptor.of(cc.getClassName(), "unused", List.class))); - if (devMode) { + if (liveReloadPossible) { configSweepLoop(siParserBody, readConfig, runTimeConfig); } // generate sweep for run time @@ -1689,10 +1679,10 @@ public static Builder builder() { } public static final class Builder { + public boolean liveReloadPossible; private LaunchMode launchMode; private ClassOutput classOutput; private BuildTimeConfigurationReader.ReadResult buildTimeReadResult; - private Map runTimeDefaults; private List> additionalTypes; private List additionalBootstrapConfigSourceProviders; @@ -1717,6 +1707,11 @@ public Builder setClassOutput(final ClassOutput classOutput) { return this; } + public Builder setLiveReloadPossible(boolean liveReloadPossible) { + this.liveReloadPossible = liveReloadPossible; + return this; + } + BuildTimeConfigurationReader.ReadResult getBuildTimeReadResult() { return buildTimeReadResult; } @@ -1726,15 +1721,6 @@ public Builder setBuildTimeReadResult(final BuildTimeConfigurationReader.ReadRes return this; } - Map getRunTimeDefaults() { - return runTimeDefaults; - } - - public Builder setRunTimeDefaults(final Map runTimeDefaults) { - this.runTimeDefaults = runTimeDefaults; - return this; - } - List> getAdditionalTypes() { return additionalTypes; } diff --git a/core/deployment/src/main/java/io/quarkus/deployment/steps/ConfigGenerationBuildStep.java b/core/deployment/src/main/java/io/quarkus/deployment/steps/ConfigGenerationBuildStep.java index 76baaac11caab7..bd4cbca5449471 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/steps/ConfigGenerationBuildStep.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/steps/ConfigGenerationBuildStep.java @@ -38,6 +38,7 @@ import io.quarkus.deployment.builditem.LaunchModeBuildItem; import io.quarkus.deployment.builditem.LiveReloadBuildItem; import io.quarkus.deployment.builditem.RunTimeConfigurationDefaultBuildItem; +import io.quarkus.deployment.builditem.RunTimeConfigurationSourceValueBuildItem; import io.quarkus.deployment.builditem.StaticInitConfigSourceFactoryBuildItem; import io.quarkus.deployment.builditem.StaticInitConfigSourceProviderBuildItem; import io.quarkus.deployment.builditem.SuppressNonRuntimeConfigChangedWarningBuildItem; @@ -49,9 +50,10 @@ import io.quarkus.deployment.logging.LoggingSetupBuildItem; import io.quarkus.gizmo.ClassCreator; import io.quarkus.gizmo.ClassOutput; +import io.quarkus.runtime.LaunchMode; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.StaticInitSafe; -import io.quarkus.runtime.configuration.ConfigChangeRecorder; +import io.quarkus.runtime.configuration.ConfigRecorder; import io.quarkus.runtime.configuration.ConfigurationRuntimeConfig; import io.quarkus.runtime.configuration.RuntimeOverrideConfigSource; import io.smallrye.config.ConfigMappings.ConfigClassWithPrefix; @@ -78,13 +80,24 @@ void staticInitSources( PropertiesLocationConfigSourceFactory.class.getName())); } + @BuildStep + @Record(ExecutionTime.RUNTIME_INIT) + RunTimeConfigurationSourceValueBuildItem devTestConfig(List runTimeDefaults, + ConfigRecorder recorder) { + if (runTimeDefaults.isEmpty()) { + return null; + } + return new RunTimeConfigurationSourceValueBuildItem(recorder.config(runTimeDefaults.stream().collect( + Collectors.toMap(RunTimeConfigurationDefaultBuildItem::getKey, RunTimeConfigurationDefaultBuildItem::getValue)), + Integer.MIN_VALUE + 50)); + } + /** * Generate the Config class that instantiates MP Config and holds all the config objects */ @BuildStep void generateConfigClass( ConfigurationBuildItem configItem, - List runTimeDefaults, List typeItems, LaunchModeBuildItem launchModeBuildItem, BuildProducer generatedClass, @@ -100,13 +113,6 @@ void generateConfigClass( return; } - Map defaults = new HashMap<>(); - for (RunTimeConfigurationDefaultBuildItem item : runTimeDefaults) { - if (defaults.putIfAbsent(item.getKey(), item.getValue()) != null) { - throw new IllegalStateException("More than one default value for " + item.getKey() + " was produced"); - } - } - Set discoveredConfigSources = discoverService(ConfigSource.class, reflectiveClass); Set discoveredConfigSourceProviders = discoverService(ConfigSourceProvider.class, reflectiveClass); Set discoveredConfigSourceFactories = discoverService(ConfigSourceFactory.class, reflectiveClass); @@ -125,7 +131,8 @@ void generateConfigClass( .setBuildTimeReadResult(configItem.getReadResult()) .setClassOutput(new GeneratedClassGizmoAdaptor(generatedClass, false)) .setLaunchMode(launchModeBuildItem.getLaunchMode()) - .setRunTimeDefaults(defaults) + .setLiveReloadPossible(launchModeBuildItem.getLaunchMode() == LaunchMode.DEVELOPMENT + || launchModeBuildItem.isAuxiliaryApplication()) .setAdditionalTypes(typeItems.stream().map(ConfigurationTypeBuildItem::getValueType).collect(toList())) .setAdditionalBootstrapConfigSourceProviders( getAdditionalBootstrapConfigSourceProviders(additionalBootstrapConfigSourceProviders)) @@ -163,7 +170,7 @@ public SuppressNonRuntimeConfigChangedWarningBuildItem ignoreQuarkusProfileChang @BuildStep @Record(ExecutionTime.RUNTIME_INIT) public void checkForBuildTimeConfigChange( - ConfigChangeRecorder recorder, ConfigurationBuildItem configItem, LoggingSetupBuildItem loggingSetupBuildItem, + ConfigRecorder recorder, ConfigurationBuildItem configItem, LoggingSetupBuildItem loggingSetupBuildItem, ConfigurationRuntimeConfig configurationConfig, List suppressNonRuntimeConfigChangedWarningItems) { BuildTimeConfigurationReader.ReadResult readResult = configItem.getReadResult(); diff --git a/core/deployment/src/main/java/io/quarkus/deployment/steps/DevServicesConfigBuildStep.java b/core/deployment/src/main/java/io/quarkus/deployment/steps/DevServicesConfigBuildStep.java index 7831fbc703e40d..fbe44bbd7b74c8 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/steps/DevServicesConfigBuildStep.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/steps/DevServicesConfigBuildStep.java @@ -15,11 +15,11 @@ import io.quarkus.deployment.builditem.DevServicesConfigResultBuildItem; import io.quarkus.deployment.builditem.DevServicesLauncherConfigResultBuildItem; import io.quarkus.deployment.builditem.DevServicesNativeConfigResultBuildItem; -import io.quarkus.deployment.builditem.LiveReloadBuildItem; import io.quarkus.deployment.builditem.RunTimeConfigurationDefaultBuildItem; import io.quarkus.deployment.builditem.ServiceStartBuildItem; class DevServicesConfigBuildStep { + static volatile Map oldConfig; @BuildStep List deprecated(List items) { @@ -30,18 +30,16 @@ List deprecated(List runtimeConfig, - List devServicesConfigResultBuildItems, - LiveReloadBuildItem liveReloadBuildItem) { + List devServicesConfigResultBuildItems) { Map newProperties = new HashMap<>(devServicesConfigResultBuildItems.stream().collect( Collectors.toMap(DevServicesConfigResultBuildItem::getKey, DevServicesConfigResultBuildItem::getValue))); Config config = ConfigProvider.getConfig(); - PreviousConfig oldProperties = liveReloadBuildItem.getContextObject(PreviousConfig.class); //check if there are existing already started dev services //if there were no changes to the processors they don't produce config //so we merge existing config from previous runs //we also check the current config, as the dev service may have been disabled by explicit config - if (oldProperties != null) { - for (Map.Entry entry : oldProperties.config.entrySet()) { + if (oldConfig != null) { + for (Map.Entry entry : oldConfig.entrySet()) { if (!newProperties.containsKey(entry.getKey()) && config.getOptionalValue(entry.getKey(), String.class).isEmpty()) { newProperties.put(entry.getKey(), entry.getValue()); @@ -51,15 +49,7 @@ DevServicesLauncherConfigResultBuildItem setup(BuildProducer entry : newProperties.entrySet()) { runtimeConfig.produce(new RunTimeConfigurationDefaultBuildItem(entry.getKey(), entry.getValue())); } - liveReloadBuildItem.setContextObject(PreviousConfig.class, new PreviousConfig(newProperties)); + oldConfig = newProperties; return new DevServicesLauncherConfigResultBuildItem(Collections.unmodifiableMap(newProperties)); } - - static class PreviousConfig { - final Map config; - - public PreviousConfig(Map config) { - this.config = config; - } - } } diff --git a/core/runtime/src/main/java/io/quarkus/runtime/configuration/ConfigChangeRecorder.java b/core/runtime/src/main/java/io/quarkus/runtime/configuration/ConfigRecorder.java similarity index 72% rename from core/runtime/src/main/java/io/quarkus/runtime/configuration/ConfigChangeRecorder.java rename to core/runtime/src/main/java/io/quarkus/runtime/configuration/ConfigRecorder.java index eb7a8e09bb58f4..0ac68312921fc9 100644 --- a/core/runtime/src/main/java/io/quarkus/runtime/configuration/ConfigChangeRecorder.java +++ b/core/runtime/src/main/java/io/quarkus/runtime/configuration/ConfigRecorder.java @@ -1,6 +1,7 @@ package io.quarkus.runtime.configuration; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; @@ -8,15 +9,19 @@ import org.eclipse.microprofile.config.Config; import org.eclipse.microprofile.config.ConfigProvider; +import org.eclipse.microprofile.config.spi.ConfigSource; +import org.eclipse.microprofile.config.spi.ConfigSourceProvider; import org.jboss.logging.Logger; +import io.quarkus.runtime.RuntimeValue; import io.quarkus.runtime.annotations.Recorder; import io.quarkus.runtime.configuration.ConfigurationRuntimeConfig.BuildTimeMismatchAtRuntime; +import io.smallrye.config.common.MapBackedConfigSource; @Recorder -public class ConfigChangeRecorder { +public class ConfigRecorder { - private static final Logger log = Logger.getLogger(ConfigChangeRecorder.class); + private static final Logger log = Logger.getLogger(ConfigRecorder.class); public void handleConfigChange(ConfigurationRuntimeConfig configurationConfig, Map buildTimeConfig) { Config configProvider = ConfigProvider.getConfig(); @@ -50,4 +55,14 @@ public void handleConfigChange(ConfigurationRuntimeConfig configurationConfig, M } } + + public RuntimeValue config(Map values, int priority) { + return new RuntimeValue<>(new ConfigSourceProvider() { + @Override + public Iterable getConfigSources(ClassLoader forClassLoader) { + return Collections.singleton(new MapBackedConfigSource("Runtime Default Values", values, priority) { + }); + } + }); + } } 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 313ce4d5ece550..e8dd481ca2c6f2 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 @@ -269,6 +269,13 @@ private DevServicesDatasourceResultBuildItem.DbResult startDevDb(String dbName, if (datasource.getPassword() != null) { devDebProperties.put(prefix + "password", datasource.getPassword()); } + + String devservices = prefix + "devservices."; + for (var name : ConfigProvider.getConfig().getPropertyNames()) { + if (name.startsWith(devservices)) { + devDebProperties.put(name, ConfigProvider.getConfig().getValue(name, String.class)); + } + } return new DevServicesDatasourceResultBuildItem.DbResult(defaultDbKind.get(), devDebProperties); } } diff --git a/extensions/jdbc/jdbc-postgresql/deployment/pom.xml b/extensions/jdbc/jdbc-postgresql/deployment/pom.xml index cbfd96e78561d2..739ecf38927e95 100644 --- a/extensions/jdbc/jdbc-postgresql/deployment/pom.xml +++ b/extensions/jdbc/jdbc-postgresql/deployment/pom.xml @@ -48,6 +48,16 @@ assertj-core test + + io.quarkus + quarkus-resteasy-reactive-deployment + test + + + io.rest-assured + rest-assured + test + diff --git a/extensions/jdbc/jdbc-postgresql/deployment/src/test/java/io/quarkus/jdbc/postgresql/deployment/DevServicesPostgresqlDatasourceDevModeTestCase.java b/extensions/jdbc/jdbc-postgresql/deployment/src/test/java/io/quarkus/jdbc/postgresql/deployment/DevServicesPostgresqlDatasourceDevModeTestCase.java new file mode 100644 index 00000000000000..a2e6cca4ff2078 --- /dev/null +++ b/extensions/jdbc/jdbc-postgresql/deployment/src/test/java/io/quarkus/jdbc/postgresql/deployment/DevServicesPostgresqlDatasourceDevModeTestCase.java @@ -0,0 +1,53 @@ +package io.quarkus.jdbc.postgresql.deployment; + +import java.util.logging.Level; + +import javax.inject.Inject; + +import org.hamcrest.Matchers; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.StringAsset; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.agroal.api.AgroalDataSource; +import io.quarkus.test.QuarkusDevModeTest; +import io.restassured.RestAssured; + +public class DevServicesPostgresqlDatasourceDevModeTestCase { + + @RegisterExtension + static QuarkusDevModeTest test = new QuarkusDevModeTest() + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) + .addClass(PgResource.class) + .addAsResource(new StringAsset(""), "application.properties")) + // Expect no warnings (in particular from Agroal) + .setLogRecordPredicate(record -> record.getLevel().intValue() >= Level.WARNING.intValue() + // There are other warnings: JDK8, TestContainers, drivers, ... + // Ignore them: we're only interested in Agroal here. + && record.getMessage().contains("Agroal")); + + @Inject + AgroalDataSource dataSource; + + @Test + public void testDatasource() throws Exception { + RestAssured.get("/pg/save?name=foo&value=bar") + .then().statusCode(204); + + RestAssured.get("/pg/get?name=foo") + .then().statusCode(200) + .body(Matchers.equalTo("bar")); + + test.modifyResourceFile("application.properties", s -> "quarkus.datasource.devservices.properties.log=TRACE"); + + RestAssured.get("/pg/get?name=foo") + .then().statusCode(404); + RestAssured.get("/pg/save?name=foo&value=bar") + .then().statusCode(204); + RestAssured.get("/pg/get?name=foo") + .then().statusCode(200) + .body(Matchers.equalTo("bar")); + } +} diff --git a/extensions/jdbc/jdbc-postgresql/deployment/src/test/java/io/quarkus/jdbc/postgresql/deployment/PgResource.java b/extensions/jdbc/jdbc-postgresql/deployment/src/test/java/io/quarkus/jdbc/postgresql/deployment/PgResource.java new file mode 100644 index 00000000000000..52a412899eeb4c --- /dev/null +++ b/extensions/jdbc/jdbc-postgresql/deployment/src/test/java/io/quarkus/jdbc/postgresql/deployment/PgResource.java @@ -0,0 +1,58 @@ +package io.quarkus.jdbc.postgresql.deployment; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import javax.transaction.Transactional; +import javax.ws.rs.GET; +import javax.ws.rs.NotFoundException; +import javax.ws.rs.Path; +import javax.ws.rs.QueryParam; + +import io.agroal.api.AgroalDataSource; +import io.smallrye.common.annotation.Blocking; + +@Path("/pg") +@Blocking +public class PgResource { + + @Inject + AgroalDataSource ds; + + @PostConstruct + @Transactional + public void setup() throws Exception { + try (var con = ds.getConnection()) { + try (var smt = con.createStatement()) { + smt.executeUpdate("create table foo (name varchar(100) primary key not null, value varchar(100));"); + } + } + } + + @GET + @Path("save") + public void save(@QueryParam("name") String name, @QueryParam("value") String value) throws Exception { + try (var con = ds.getConnection()) { + try (var smt = con.prepareStatement("insert into foo (name, value) values (?,?)")) { + smt.setString(1, name); + smt.setString(2, value); + smt.execute(); + } + } + } + + @GET + @Path("get") + public String get(@QueryParam("name") String name) throws Exception { + try (var con = ds.getConnection()) { + try (var smt = con.prepareStatement("select (value) from foo where name = ?")) { + smt.setString(1, name); + try (var rs = smt.executeQuery()) { + if (!rs.next()) { + throw new NotFoundException(); + } + return rs.getString(1); + } + } + } + } +} diff --git a/extensions/mongodb-client/deployment/src/main/java/io/quarkus/mongodb/deployment/MongoClientProcessor.java b/extensions/mongodb-client/deployment/src/main/java/io/quarkus/mongodb/deployment/MongoClientProcessor.java index 700c5173ce6426..bf674418945b53 100644 --- a/extensions/mongodb-client/deployment/src/main/java/io/quarkus/mongodb/deployment/MongoClientProcessor.java +++ b/extensions/mongodb-client/deployment/src/main/java/io/quarkus/mongodb/deployment/MongoClientProcessor.java @@ -30,7 +30,6 @@ import com.mongodb.event.ConnectionPoolListener; import io.quarkus.arc.deployment.AdditionalBeanBuildItem; -import io.quarkus.arc.deployment.BeanArchiveIndexBuildItem; import io.quarkus.arc.deployment.BeanContainerBuildItem; import io.quarkus.arc.deployment.BeanRegistrationPhaseBuildItem; import io.quarkus.arc.deployment.SyntheticBeanBuildItem; @@ -149,7 +148,7 @@ List addExtensionPointsToNative(CodecProviderBuildItem } @BuildStep - public void mongoClientNames(BeanArchiveIndexBuildItem indexBuildItem, + public void mongoClientNames(CombinedIndexBuildItem indexBuildItem, BuildProducer mongoClientName) { Set values = new HashSet<>(); IndexView indexView = indexBuildItem.getIndex(); @@ -203,10 +202,19 @@ void additionalBeans(BuildProducer additionalBeans) { additionalBeans.produce(AdditionalBeanBuildItem.builder().addBeanClasses(MongoClients.class).setUnremovable().build()); } + @BuildStep + void connectionNames( + List mongoClientNames, + BuildProducer mongoConnections) { + mongoConnections.produce(new MongoConnectionNameBuildItem(MongoClientBeanUtil.DEFAULT_MONGOCLIENT_NAME)); + for (MongoClientNameBuildItem bi : mongoClientNames) { + mongoConnections.produce(new MongoConnectionNameBuildItem(bi.getName())); + } + } + @Record(STATIC_INIT) @BuildStep void build( - List mongoClientNames, MongoClientRecorder recorder, SslNativeConfigBuildItem sslNativeConfig, CodecProviderBuildItem codecProvider, @@ -214,7 +222,6 @@ void build( BsonDiscriminatorBuildItem bsonDiscriminator, CommandListenerBuildItem commandListener, List connectionPoolListenerProvider, - BuildProducer mongoConnections, BuildProducer syntheticBeanBuildItemBuildProducer) { List> poolListenerList = new ArrayList<>(connectionPoolListenerProvider.size()); @@ -230,11 +237,6 @@ void build( bsonDiscriminator.getBsonDiscriminatorClassNames(), commandListener.getCommandListenerClassNames(), poolListenerList, sslNativeConfig.isExplicitlyDisabled())) .done()); - - mongoConnections.produce(new MongoConnectionNameBuildItem(MongoClientBeanUtil.DEFAULT_MONGOCLIENT_NAME)); - for (MongoClientNameBuildItem bi : mongoClientNames) { - mongoConnections.produce(new MongoConnectionNameBuildItem(bi.getName())); - } } @Record(ExecutionTime.RUNTIME_INIT) @@ -384,4 +386,4 @@ void registerServiceBinding(Capabilities capabilities, BuildProducer