From ebb3243c304f061f2d1830aa8dd16fba61dcd0e6 Mon Sep 17 00:00:00 2001 From: Morten Holm Date: Tue, 21 Jan 2025 12:02:30 +0100 Subject: [PATCH] Support maxIdleTimeMS parameter --- pom.xml | 2 +- .../spring/mongo/AbstractMongoDBConfig.java | 29 +++++++++++++----- .../mongo/AbstractMongoDBConfigTest.java | 30 +++++++++++++++---- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/pom.xml b/pom.xml index 6b34445..2861fbc 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.kapeta nosql-mongodb - 1.1.3 + 1.2.0 ${project.groupId}:${project.artifactId} MongoDB support for Kapeta Spring Boot SDK diff --git a/src/main/java/com/kapeta/spring/mongo/AbstractMongoDBConfig.java b/src/main/java/com/kapeta/spring/mongo/AbstractMongoDBConfig.java index 002f2f5..4b3f506 100644 --- a/src/main/java/com/kapeta/spring/mongo/AbstractMongoDBConfig.java +++ b/src/main/java/com/kapeta/spring/mongo/AbstractMongoDBConfig.java @@ -28,6 +28,9 @@ import org.springframework.lang.NonNull; import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; /** * Mongo configuration class. @@ -39,6 +42,8 @@ abstract public class AbstractMongoDBConfig { private static final String PORT_TYPE = "mongodb"; + private static final String[] SUPPORTED_MONGO_OPTIONS = { "maxIdleTimeMS", "ssl"}; + @Autowired private KapetaConfigurationProvider configurationProvider; @@ -91,18 +96,26 @@ protected MongoProperties createMongoUriProperties(String databaseName, String d String username = mongoInfo.getCredentials().get("username"); String password = mongoInfo.getCredentials().getOrDefault("password",""); - String ssl = "ssl=false"; - if(mongoInfo.getOptions().containsKey("ssl")) { - if (Boolean.parseBoolean(mongoInfo.getOptions().get("ssl").toString())) { - ssl = "ssl=true"; + Map options = new HashMap<>(); + for (String option : SUPPORTED_MONGO_OPTIONS) { + if (mongoInfo.getOptions().containsKey(option)) { + options.put(option, mongoInfo.getOptions().get(option).toString()); } } - String dbAuthDBStr = String.format("&authSource=%s", dbAuthDB); - if (StringUtils.isEmpty(dbAuthDB)) { - dbAuthDBStr = ""; + + if (!StringUtils.isBlank(dbAuthDB)) { + options.put("authSource", dbAuthDB); + } + + String formattedOptions = options.entrySet().stream() + .map(e -> e.getKey() + "=" + e.getValue()) + .collect(Collectors.joining("&")); + + if (!StringUtils.isBlank(formattedOptions)) { + formattedOptions = "?" + formattedOptions; } - String uri = String.format("mongodb+srv://%s:%s@%s/%s?%s%s", username, password, mongoInfo.getHost(), databaseName,ssl, dbAuthDBStr); + String uri = String.format("mongodb+srv://%s:%s@%s/%s%s", username, password, mongoInfo.getHost(), databaseName, formattedOptions); MongoProperties properties = new MongoProperties(); properties.setUri(uri); diff --git a/src/test/java/com/kapeta/spring/mongo/AbstractMongoDBConfigTest.java b/src/test/java/com/kapeta/spring/mongo/AbstractMongoDBConfigTest.java index 7a9ff45..b362455 100644 --- a/src/test/java/com/kapeta/spring/mongo/AbstractMongoDBConfigTest.java +++ b/src/test/java/com/kapeta/spring/mongo/AbstractMongoDBConfigTest.java @@ -4,12 +4,10 @@ */ package com.kapeta.spring.mongo; -import com.kapeta.spring.config.providers.TestConfigProvider; import com.kapeta.spring.config.providers.types.ResourceInfo; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.mongo.MongoProperties; - import java.util.HashMap; import java.util.Map; @@ -36,7 +34,7 @@ public void testCreateMongoUriProperties() { MongoProperties properties = mongoDBConfig.createMongoUriProperties("testDB", "admin", resourceInfo); - assertEquals("mongodb+srv://testUser:testPass@testHost/testDB?ssl=true&authSource=admin", properties.getUri()); + assertEquals("mongodb+srv://testUser:testPass@testHost/testDB?authSource=admin&ssl=true", properties.getUri()); } @@ -58,7 +56,7 @@ public void testSSLFalse() { MongoProperties properties = mongoDBConfig.createMongoUriProperties("testDB", "admin", resourceInfo); - assertEquals("mongodb+srv://testUser:testPass@testHost/testDB?ssl=false&authSource=admin", properties.getUri()); + assertEquals("mongodb+srv://testUser:testPass@testHost/testDB?authSource=admin&ssl=false", properties.getUri()); } @Test @@ -78,7 +76,7 @@ public void testEmptySSLConfig() { MongoProperties properties = mongoDBConfig.createMongoUriProperties("testDB", "admin", resourceInfo); - assertEquals("mongodb+srv://testUser:testPass@testHost/testDB?ssl=false&authSource=admin", properties.getUri()); + assertEquals("mongodb+srv://testUser:testPass@testHost/testDB?authSource=admin", properties.getUri()); } @Test @@ -102,6 +100,28 @@ public void testEmptyAuthSource() { assertEquals("mongodb+srv://testUser:testPass@testHost/testDB?ssl=true", properties.getUri()); } + @Test + public void testMoreParameters() { + Map credentials = new HashMap<>(); + credentials.put("username", "testUser"); + credentials.put("password", "testPass"); + + Map options = new HashMap<>(); + options.put("ssl", "true"); + options.put("maxIdleTimeMS", "120000"); + + TestMongoDBConfig mongoDBConfig = new TestMongoDBConfig("testResource"); + + ResourceInfo resourceInfo = new ResourceInfo(); + resourceInfo.setCredentials(credentials); + resourceInfo.setOptions(options); + resourceInfo.setHost("testHost"); + + MongoProperties properties = mongoDBConfig.createMongoUriProperties("testDB", "", resourceInfo); + + assertEquals("mongodb+srv://testUser:testPass@testHost/testDB?maxIdleTimeMS=120000&ssl=true", properties.getUri()); + } + private class TestMongoDBConfig extends AbstractMongoDBConfig { public TestMongoDBConfig(String resourceName) { super(resourceName);