Skip to content

Commit

Permalink
feat: Liquibase use mongo client
Browse files Browse the repository at this point in the history
feat: Try to use a different way
  • Loading branch information
Thomas Canava authored and Malandril committed Feb 18, 2025
1 parent c190b10 commit f975608
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,25 @@
import java.io.FileNotFoundException;
import java.nio.file.Paths;
import java.util.Map;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

import com.mongodb.client.MongoClient;

import io.quarkus.arc.Arc;
import io.quarkus.liquibase.mongodb.runtime.LiquibaseMongodbBuildTimeConfig;
import io.quarkus.liquibase.mongodb.runtime.LiquibaseMongodbConfig;
import io.quarkus.mongodb.runtime.MongoClientBeanUtil;
import io.quarkus.mongodb.runtime.MongoClientConfig;
import io.quarkus.mongodb.runtime.MongoClients;
import io.quarkus.runtime.util.StringUtil;
import liquibase.Contexts;
import liquibase.LabelExpression;
import liquibase.Liquibase;
import liquibase.database.Database;
import liquibase.database.DatabaseFactory;
import liquibase.ext.mongodb.database.MongoConnection;
import liquibase.ext.mongodb.database.MongoLiquibaseDatabase;
import liquibase.resource.ClassLoaderResourceAccessor;
import liquibase.resource.CompositeResourceAccessor;
import liquibase.resource.DirectoryResourceAccessor;
Expand Down Expand Up @@ -82,55 +88,30 @@ private String parseChangeLog(String changeLog) {
}

public Liquibase createLiquibase() {
MongoClients clients = Arc.container().select(MongoClients.class).stream().findFirst().orElseThrow();
try (ResourceAccessor resourceAccessor = resolveResourceAccessor()) {
String parsedChangeLog = parseChangeLog(liquibaseMongodbBuildTimeConfig.changeLog());
String connectionString = this.mongoClientConfig.connectionString().orElse("mongodb://localhost:27017");

// Every MongoDB client configuration must be added to the connection string, we didn't add all as it would be too much to support.
// For reference, all connections string options can be found here: https://www.mongodb.com/docs/manual/reference/connection-string/#connection-string-options.

Matcher matcher = HAS_DB.matcher(connectionString);
if (!matcher.matches() || matcher.group("db") == null || matcher.group("db").isEmpty()) {
connectionString = matcher.replaceFirst(
"${prefix}${hosts}/"
+ this.mongoClientConfig.database()
.orElseThrow(() -> new IllegalArgumentException("Config property " +
"'quarkus.mongodb.database' must be defined when no database exist in the connection string"))
+ "${options}");
}
if (mongoClientConfig.credentials().authSource().isPresent()) {
boolean alreadyHasQueryParams = connectionString.contains("?");
connectionString += (alreadyHasQueryParams ? "&" : "?") + "authSource="
+ mongoClientConfig.credentials().authSource().get();
Optional<String> maybeDatabase = mongoClientConfig.database().or(() -> {
String foundDB = matcher.group("db");
if (matcher.matches() && !StringUtil.isNullOrEmpty(foundDB)) {
return Optional.of(foundDB);
}
return Optional.empty();
});
if (maybeDatabase.isEmpty()) {
throw new IllegalStateException("No mongodb database defined in configuration, or in connection-string");
}
if (mongoClientConfig.credentials().authMechanism().isPresent()) {
boolean alreadyHasQueryParams = connectionString.contains("?");
connectionString += (alreadyHasQueryParams ? "&" : "?") + "authMechanism="
+ mongoClientConfig.credentials().authMechanism().get();
Database database = createDatabase(clients, maybeDatabase.get());
liquibaseMongodbConfig.liquibaseCatalogName().ifPresent(database::setLiquibaseCatalogName);
liquibaseMongodbConfig.liquibaseSchemaName().ifPresent(database::setLiquibaseSchemaName);
liquibaseMongodbConfig.liquibaseTablespaceName().ifPresent(database::setLiquibaseTablespaceName);
if (liquibaseMongodbConfig.defaultCatalogName().isPresent()) {
database.setDefaultCatalogName(liquibaseMongodbConfig.defaultCatalogName().get());
}
if (!mongoClientConfig.credentials().authMechanismProperties().isEmpty()) {
boolean alreadyHasQueryParams = connectionString.contains("?");
connectionString += (alreadyHasQueryParams ? "&" : "?") + "authMechanismProperties="
+ mongoClientConfig.credentials().authMechanismProperties().entrySet().stream()
.map(prop -> prop.getKey() + ":" + prop.getValue()).collect(Collectors.joining(","));
}

Database database = DatabaseFactory.getInstance().openDatabase(connectionString,
this.mongoClientConfig.credentials().username().orElse(null),
this.mongoClientConfig.credentials().password().orElse(null),
null, resourceAccessor);

if (database != null) {
liquibaseMongodbConfig.liquibaseCatalogName().ifPresent(database::setLiquibaseCatalogName);
liquibaseMongodbConfig.liquibaseSchemaName().ifPresent(database::setLiquibaseSchemaName);
liquibaseMongodbConfig.liquibaseTablespaceName().ifPresent(database::setLiquibaseTablespaceName);

if (liquibaseMongodbConfig.defaultCatalogName().isPresent()) {
database.setDefaultCatalogName(liquibaseMongodbConfig.defaultCatalogName().get());
}
if (liquibaseMongodbConfig.defaultSchemaName().isPresent()) {
database.setDefaultSchemaName(liquibaseMongodbConfig.defaultSchemaName().get());
}
if (liquibaseMongodbConfig.defaultSchemaName().isPresent()) {
database.setDefaultSchemaName(liquibaseMongodbConfig.defaultSchemaName().get());
}
Liquibase liquibase = new Liquibase(parsedChangeLog, resourceAccessor, database);

Expand All @@ -145,6 +126,17 @@ public Liquibase createLiquibase() {
}
}

private Database createDatabase(MongoClients clients, String databaseName) {
MongoConnection databaseConnection = new MongoConnection();
MongoClient mongoClient = clients.createMongoClient(liquibaseMongodbConfig.mongodbClient()
.orElse(MongoClientBeanUtil.DEFAULT_MONGOCLIENT_NAME));
databaseConnection.setMongoClient(mongoClient);
databaseConnection.setMongoDatabase(mongoClient.getDatabase(databaseName));
Database database = new MongoLiquibaseDatabase();
database.setConnection(databaseConnection);
return database;
}

public LiquibaseMongodbConfig getConfiguration() {
return liquibaseMongodbConfig;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ public interface LiquibaseMongodbConfig {
@WithDefault("true")
boolean enabled();

/**
* Mongodb client name to use to connect to database, defaults to the default mongodb client.
*/
Optional<String> mongodbClient();

/**
* The migrate at start flag
*/
Expand Down

0 comments on commit f975608

Please sign in to comment.