Skip to content

Commit 01d0b81

Browse files
committed
Fixed constructors to prevent potential backwards compat issues
1 parent eac41a5 commit 01d0b81

File tree

3 files changed

+128
-15
lines changed

3 files changed

+128
-15
lines changed

log4j-mongodb4/src/main/java/org/apache/logging/log4j/mongodb4/MongoDb4Connection.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,35 @@ public MongoDb4Connection(
8585
this.collection = getOrCreateMongoCollection(mongoDatabase, collectionName, isCapped, sizeInBytes);
8686
}
8787

88+
@Deprecated
89+
public MongoDb4Connection(
90+
final ConnectionString connectionString,
91+
final MongoClient mongoClient,
92+
final MongoDatabase mongoDatabase,
93+
final boolean isCapped,
94+
final Long sizeInBytes) {
95+
this.connectionString = connectionString;
96+
this.mongoClient = mongoClient;
97+
this.collection =
98+
getOrCreateMongoCollection(mongoDatabase, connectionString.getCollection(), isCapped, sizeInBytes);
99+
}
100+
101+
@Deprecated
102+
public MongoDb4Connection(
103+
final ConnectionString connectionString,
104+
final MongoClient mongoClient,
105+
final MongoDatabase mongoDatabase,
106+
final boolean isCapped,
107+
final Integer sizeInBytes) {
108+
this(
109+
connectionString,
110+
mongoClient,
111+
mongoDatabase,
112+
connectionString.getCollection(),
113+
isCapped,
114+
Long.valueOf(sizeInBytes));
115+
}
116+
88117
@Override
89118
public void closeImpl() {
90119
// LOG4J2-1196

log4j-mongodb4/src/main/java/org/apache/logging/log4j/mongodb4/MongoDb4Provider.java

Lines changed: 76 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,79 @@ private MongoDb4Provider(
205205
final String collectionName,
206206
final boolean isCapped,
207207
final Long collectionSize) {
208+
ConnectionString connectionString;
209+
try {
210+
connectionString = new ConnectionString(connectionStringSource);
211+
} catch (final IllegalArgumentException e) {
212+
LOGGER.error("Invalid MongoDB connection string `{}`.", connectionStringSource, e);
213+
throw e;
214+
}
215+
216+
String effectiveDatabaseName = databaseName != null ? databaseName : connectionString.getDatabase();
217+
String effectiveCollectionName = collectionName != null ? collectionName : connectionString.getCollection();
218+
// Validate the provided databaseName property
219+
try {
220+
MongoNamespace.checkDatabaseNameValidity(effectiveDatabaseName);
221+
} catch (final IllegalArgumentException e) {
222+
LOGGER.error("Invalid MongoDB database name `{}`.", effectiveDatabaseName, e);
223+
throw e;
224+
}
225+
// Validate the provided collectionName property
226+
try {
227+
MongoNamespace.checkCollectionNameValidity(effectiveCollectionName);
228+
} catch (final IllegalArgumentException e) {
229+
LOGGER.error("Invalid MongoDB collection name `{}`.", effectiveCollectionName, e);
230+
throw e;
231+
}
232+
LOGGER.debug("Creating ConnectionString {}...", connectionStringSource);
233+
this.connectionString = new ConnectionString(connectionStringSource);
234+
LOGGER.debug("Created ConnectionString {}", connectionString);
235+
LOGGER.debug("Creating MongoClientSettings...");
236+
// @formatter:off
237+
final MongoClientSettings settings = MongoClientSettings.builder()
238+
.applyConnectionString(this.connectionString)
239+
.codecRegistry(CODEC_REGISTRIES)
240+
.build();
241+
// @formatter:on
242+
LOGGER.debug("Created MongoClientSettings {}", settings);
243+
LOGGER.debug("Creating MongoClient {}...", settings);
244+
this.mongoClient = MongoClients.create(settings);
245+
LOGGER.debug("Created MongoClient {}", mongoClient);
246+
LOGGER.debug("Getting MongoDatabase {}...", effectiveDatabaseName);
247+
this.mongoDatabase = this.mongoClient.getDatabase(effectiveDatabaseName);
248+
LOGGER.debug("Got MongoDatabase {}", mongoDatabase);
249+
this.isCapped = isCapped;
250+
this.collectionSize = collectionSize;
251+
this.collectionName = effectiveCollectionName;
252+
}
253+
254+
private MongoDb4Provider(final String connectionStringSource, final boolean isCapped, final Long collectionSize) {
255+
256+
ConnectionString connectionString;
257+
try {
258+
connectionString = new ConnectionString(connectionStringSource);
259+
} catch (final IllegalArgumentException e) {
260+
LOGGER.error("Invalid MongoDB connection string `{}`.", connectionStringSource, e);
261+
throw e;
262+
}
263+
264+
String effectiveDatabaseName = connectionString.getDatabase();
265+
String effectiveCollectionName = connectionString.getCollection();
266+
// Validate the provided databaseName property
267+
try {
268+
MongoNamespace.checkDatabaseNameValidity(effectiveDatabaseName);
269+
} catch (final IllegalArgumentException e) {
270+
LOGGER.error("Invalid MongoDB database name `{}`.", effectiveDatabaseName, e);
271+
throw e;
272+
}
273+
// Validate the provided collectionName property
274+
try {
275+
MongoNamespace.checkCollectionNameValidity(effectiveCollectionName);
276+
} catch (final IllegalArgumentException e) {
277+
LOGGER.error("Invalid MongoDB collection name `{}`.", effectiveCollectionName, e);
278+
throw e;
279+
}
280+
208281
LOGGER.debug("Creating ConnectionString {}...", connectionStringSource);
209282
this.connectionString = new ConnectionString(connectionStringSource);
210283
LOGGER.debug("Created ConnectionString {}", connectionString);
@@ -219,12 +292,12 @@ private MongoDb4Provider(
219292
LOGGER.debug("Creating MongoClient {}...", settings);
220293
this.mongoClient = MongoClients.create(settings);
221294
LOGGER.debug("Created MongoClient {}", mongoClient);
222-
LOGGER.debug("Getting MongoDatabase {}...", databaseName);
223-
this.mongoDatabase = this.mongoClient.getDatabase(databaseName);
295+
LOGGER.debug("Getting MongoDatabase {}...", effectiveDatabaseName);
296+
this.mongoDatabase = this.mongoClient.getDatabase(effectiveCollectionName);
224297
LOGGER.debug("Got MongoDatabase {}", mongoDatabase);
225298
this.isCapped = isCapped;
226299
this.collectionSize = collectionSize;
227-
this.collectionName = collectionName;
300+
this.collectionName = effectiveCollectionName;
228301
}
229302

230303
@Override

log4j-mongodb4/src/test/java/org/apache/logging/log4j/mongodb4/MongoDb4ProviderTest.java

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
import static org.junit.jupiter.api.Assertions.assertNotNull;
2121
import static org.junit.jupiter.api.Assertions.assertNull;
2222

23+
import com.mongodb.MongoNamespace;
24+
import com.mongodb.client.MongoCollection;
25+
import java.lang.reflect.Field;
2326
import org.junit.jupiter.api.Test;
2427

2528
class MongoDb4ProviderTest {
@@ -89,12 +92,11 @@ void createProviderWithDatabaseOnConnectionString() {
8992
.build();
9093

9194
assertNotNull(provider);
92-
assertEquals(
93-
collectionName,
94-
provider.getConnection().getCollection().getNamespace().getCollectionName());
95-
assertEquals(
96-
"logging",
97-
provider.getConnection().getCollection().getNamespace().getDatabaseName());
95+
96+
MongoNamespace namespace = findProviderNamespace(provider);
97+
assertEquals(collectionName, namespace.getCollectionName());
98+
99+
assertEquals("logging", namespace.getDatabaseName());
98100
}
99101

100102
@Test
@@ -107,11 +109,20 @@ void createProviderConfigOverridesConnectionString() {
107109
.build();
108110

109111
assertNotNull(provider);
110-
assertEquals(
111-
collectionName,
112-
provider.getConnection().getCollection().getNamespace().getCollectionName());
113-
assertEquals(
114-
databaseName,
115-
provider.getConnection().getCollection().getNamespace().getDatabaseName());
112+
MongoNamespace namespace = findProviderNamespace(provider);
113+
assertEquals(collectionName, namespace.getCollectionName());
114+
assertEquals(databaseName, namespace.getDatabaseName());
115+
}
116+
117+
private static MongoNamespace findProviderNamespace(final MongoDb4Provider provider) {
118+
MongoDb4Connection connection = provider.getConnection();
119+
try {
120+
Field collectionField = connection.getClass().getDeclaredField("collection");
121+
collectionField.setAccessible(true);
122+
MongoCollection<?> collection = (MongoCollection<?>) collectionField.get(connection);
123+
return collection.getNamespace();
124+
} catch (Exception exception) {
125+
throw new RuntimeException(exception);
126+
}
116127
}
117128
}

0 commit comments

Comments
 (0)