Skip to content

Commit 4aff442

Browse files
committed
JAVA-2564: Overload MongoClient and MongoDatabase methods to take a ClientSession
1 parent c4002a5 commit 4aff442

12 files changed

+461
-57
lines changed

driver/src/main/com/mongodb/ListCollectionsIterableImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ final class ListCollectionsIterableImpl<TResult> extends MongoIterableImpl<TResu
3737
private Bson filter;
3838
private long maxTimeMS;
3939

40-
ListCollectionsIterableImpl(final String databaseName, final Class<TResult> resultClass, final CodecRegistry codecRegistry,
41-
final ReadPreference readPreference, final OperationExecutor executor) {
42-
super(executor, ReadConcern.DEFAULT, readPreference); // TODO: read concern?
40+
ListCollectionsIterableImpl(final ClientSession clientSession, final String databaseName, final Class<TResult> resultClass,
41+
final CodecRegistry codecRegistry, final ReadPreference readPreference, final OperationExecutor executor) {
42+
super(clientSession, executor, ReadConcern.DEFAULT, readPreference); // TODO: read concern?
4343
this.databaseName = notNull("databaseName", databaseName);
4444
this.resultClass = notNull("resultClass", resultClass);
4545
this.codecRegistry = notNull("codecRegistry", codecRegistry);

driver/src/main/com/mongodb/ListDatabasesIterableImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ final class ListDatabasesIterableImpl<TResult> extends MongoIterableImpl<TResult
3333

3434
private long maxTimeMS;
3535

36-
ListDatabasesIterableImpl(final Class<TResult> resultClass, final CodecRegistry codecRegistry,
36+
ListDatabasesIterableImpl(final ClientSession clientSession, final Class<TResult> resultClass, final CodecRegistry codecRegistry,
3737
final ReadPreference readPreference, final OperationExecutor executor) {
38-
super(executor, ReadConcern.DEFAULT, readPreference); // TODO: read concern?
38+
super(clientSession, executor, ReadConcern.DEFAULT, readPreference); // TODO: read concern?
3939
this.resultClass = notNull("clazz", resultClass);
4040
this.codecRegistry = notNull("codecRegistry", codecRegistry);
4141
}

driver/src/main/com/mongodb/MongoClient.java

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import java.io.Closeable;
3535
import java.util.List;
3636

37+
import static com.mongodb.assertions.Assertions.notNull;
3738
import static java.util.Arrays.asList;
3839
import static org.bson.codecs.configuration.CodecRegistries.fromProviders;
3940

@@ -368,8 +369,25 @@ public List<MongoCredential> getCredentialsList() {
368369
* @since 3.0
369370
*/
370371
public MongoIterable<String> listDatabaseNames() {
371-
return new ListDatabasesIterableImpl<BsonDocument>(BsonDocument.class, getDefaultCodecRegistry(),
372-
ReadPreference.primary(), createOperationExecutor()).map(new Function<BsonDocument, String>() {
372+
return executeListDatabaseNames(null);
373+
}
374+
375+
/**
376+
* Get a list of the database names
377+
*
378+
* @param clientSession the client session with which to associate this operation
379+
* @return an iterable containing all the names of all the databases
380+
* @since 3.6
381+
* @mongodb.server.release 3.6
382+
* @mongodb.driver.manual reference/command/listDatabases List Databases
383+
*/
384+
public MongoIterable<String> listDatabaseNames(final ClientSession clientSession) {
385+
return executeListDatabaseNames(clientSession);
386+
}
387+
388+
private MongoIterable<String> executeListDatabaseNames(final ClientSession clientSession) {
389+
notNull("clientSession", clientSession);
390+
return executeListDatabases(clientSession, BsonDocument.class).map(new Function<BsonDocument, String>() {
373391
@Override
374392
public String apply(final BsonDocument result) {
375393
return result.getString("name").getValue();
@@ -396,8 +414,39 @@ public ListDatabasesIterable<Document> listDatabases() {
396414
* @since 3.0
397415
*/
398416
public <T> ListDatabasesIterable<T> listDatabases(final Class<T> clazz) {
399-
return new ListDatabasesIterableImpl<T>(clazz, getMongoClientOptions().getCodecRegistry(),
400-
ReadPreference.primary(), createOperationExecutor());
417+
return executeListDatabases(null, clazz);
418+
}
419+
420+
/**
421+
* Gets the list of databases
422+
*
423+
* @param clientSession the client session with which to associate this operation
424+
* @return the list of databases
425+
* @since 3.6
426+
* @mongodb.server.release 3.6
427+
*/
428+
public ListDatabasesIterable<Document> listDatabases(final ClientSession clientSession) {
429+
return listDatabases(clientSession, Document.class);
430+
}
431+
432+
/**
433+
* Gets the list of databases
434+
*
435+
* @param clientSession the client session with which to associate this operation
436+
* @param clazz the class to cast the database documents to
437+
* @param <T> the type of the class to use instead of {@code Document}.
438+
* @return the list of databases
439+
* @since 3.6
440+
* @mongodb.server.release 3.6
441+
*/
442+
public <T> ListDatabasesIterable<T> listDatabases(final ClientSession clientSession, final Class<T> clazz) {
443+
notNull("clientSession", clientSession);
444+
return executeListDatabases(clientSession, clazz);
445+
}
446+
447+
private <T> ListDatabasesIterable<T> executeListDatabases(final ClientSession clientSession, final Class<T> clazz) {
448+
return new ListDatabasesIterableImpl<T>(clientSession, clazz, getMongoClientOptions().getCodecRegistry(),
449+
ReadPreference.primary(), createOperationExecutor());
401450
}
402451

403452
/**

driver/src/main/com/mongodb/MongoDatabaseImpl.java

Lines changed: 112 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import java.util.ArrayList;
3737
import java.util.List;
3838

39-
import static com.mongodb.MongoClient.getDefaultCodecRegistry;
4039
import static com.mongodb.MongoNamespace.checkDatabaseNameValidity;
4140
import static com.mongodb.assertions.Assertions.notNull;
4241

@@ -132,25 +131,71 @@ public <TResult> TResult runCommand(final Bson command, final Class<TResult> res
132131

133132
@Override
134133
public <TResult> TResult runCommand(final Bson command, final ReadPreference readPreference, final Class<TResult> resultClass) {
134+
return executeCommand(null, command, readPreference, resultClass);
135+
}
136+
137+
@Override
138+
public Document runCommand(final ClientSession clientSession, final Bson command) {
139+
return runCommand(clientSession, command, ReadPreference.primary(), Document.class);
140+
}
141+
142+
@Override
143+
public Document runCommand(final ClientSession clientSession, final Bson command, final ReadPreference readPreference) {
144+
return runCommand(clientSession, command, readPreference, Document.class);
145+
}
146+
147+
@Override
148+
public <TResult> TResult runCommand(final ClientSession clientSession, final Bson command, final Class<TResult> resultClass) {
149+
return runCommand(clientSession, command, ReadPreference.primary(), resultClass);
150+
}
151+
152+
@Override
153+
public <TResult> TResult runCommand(final ClientSession clientSession, final Bson command, final ReadPreference readPreference,
154+
final Class<TResult> resultClass) {
155+
notNull("clientSession", clientSession);
156+
return executeCommand(clientSession, command, readPreference, resultClass);
157+
}
158+
159+
private <TResult> TResult executeCommand(final ClientSession clientSession, final Bson command, final ReadPreference readPreference,
160+
final Class<TResult> resultClass) {
135161
notNull("readPreference", readPreference);
136162
return executor.execute(new CommandReadOperation<TResult>(getName(), toBsonDocument(command), codecRegistry.get(resultClass)),
137-
readPreference);
163+
readPreference, clientSession);
138164
}
139165

140166
@Override
141167
public void drop() {
142-
executor.execute(new DropDatabaseOperation(name, getWriteConcern()));
168+
executeDrop(null);
169+
}
170+
171+
@Override
172+
public void drop(final ClientSession clientSession) {
173+
executeDrop(clientSession);
174+
}
175+
176+
private void executeDrop(final ClientSession clientSession) {
177+
executor.execute(new DropDatabaseOperation(name, getWriteConcern()), clientSession);
143178
}
144179

145180
@Override
146181
public MongoIterable<String> listCollectionNames() {
147-
return new ListCollectionsIterableImpl<BsonDocument>(name, BsonDocument.class, getDefaultCodecRegistry(), ReadPreference.primary(),
148-
executor).map(new Function<BsonDocument, String>() {
149-
@Override
150-
public String apply(final BsonDocument result) {
151-
return result.getString("name").getValue();
152-
}
153-
});
182+
return executeListCollectionNames(null);
183+
}
184+
185+
@Override
186+
public MongoIterable<String> listCollectionNames(final ClientSession clientSession) {
187+
return executeListCollectionNames(clientSession);
188+
}
189+
190+
private MongoIterable<String> executeListCollectionNames(final ClientSession clientSession) {
191+
notNull("clientSession", clientSession);
192+
return executeListCollections(clientSession, BsonDocument.class)
193+
.map(new Function<BsonDocument, String>() {
194+
@Override
195+
public String apply(final BsonDocument result) {
196+
return result.getString("name").getValue();
197+
}
198+
});
154199
}
155200

156201
@Override
@@ -160,7 +205,24 @@ public ListCollectionsIterable<Document> listCollections() {
160205

161206
@Override
162207
public <TResult> ListCollectionsIterable<TResult> listCollections(final Class<TResult> resultClass) {
163-
return new ListCollectionsIterableImpl<TResult>(name, resultClass, codecRegistry, ReadPreference.primary(), executor);
208+
return executeListCollections(null, resultClass);
209+
}
210+
211+
@Override
212+
public ListCollectionsIterable<Document> listCollections(final ClientSession clientSession) {
213+
return listCollections(clientSession, Document.class);
214+
}
215+
216+
@Override
217+
public <TResult> ListCollectionsIterable<TResult> listCollections(final ClientSession clientSession, final Class<TResult> resultClass) {
218+
notNull("clientSession", clientSession);
219+
return executeListCollections(clientSession, resultClass);
220+
}
221+
222+
private <TResult> ListCollectionsIterable<TResult> executeListCollections(final ClientSession clientSession,
223+
final Class<TResult> resultClass) {
224+
return new ListCollectionsIterableImpl<TResult>(clientSession, name, resultClass, codecRegistry, ReadPreference.primary(),
225+
executor);
164226
}
165227

166228
@Override
@@ -169,8 +231,25 @@ public void createCollection(final String collectionName) {
169231
}
170232

171233
@Override
172-
@SuppressWarnings("deprecation")
173234
public void createCollection(final String collectionName, final CreateCollectionOptions createCollectionOptions) {
235+
executeCreateCollection(null, collectionName, createCollectionOptions);
236+
}
237+
238+
@Override
239+
public void createCollection(final ClientSession clientSession, final String collectionName) {
240+
createCollection(clientSession, collectionName, new CreateCollectionOptions());
241+
}
242+
243+
@Override
244+
public void createCollection(final ClientSession clientSession, final String collectionName,
245+
final CreateCollectionOptions createCollectionOptions) {
246+
notNull("clientSession", clientSession);
247+
executeCreateCollection(clientSession, collectionName, createCollectionOptions);
248+
}
249+
250+
@SuppressWarnings("deprecation")
251+
private void executeCreateCollection(final ClientSession clientSession, final String collectionName,
252+
final CreateCollectionOptions createCollectionOptions) {
174253
CreateCollectionOperation operation = new CreateCollectionOperation(name, collectionName, writeConcern)
175254
.collation(createCollectionOptions.getCollation())
176255
.capped(createCollectionOptions.isCapped())
@@ -194,7 +273,7 @@ public void createCollection(final String collectionName, final CreateCollection
194273
if (validationOptions.getValidationAction() != null) {
195274
operation.validationAction(validationOptions.getValidationAction());
196275
}
197-
executor.execute(operation);
276+
executor.execute(operation, clientSession);
198277
}
199278

200279
@Override
@@ -205,9 +284,28 @@ public void createView(final String viewName, final String viewOn, final List<?
205284
@Override
206285
public void createView(final String viewName, final String viewOn, final List<? extends Bson> pipeline,
207286
final CreateViewOptions createViewOptions) {
287+
executeCreateView(null, viewName, viewOn, pipeline, createViewOptions);
288+
}
289+
290+
@Override
291+
public void createView(final ClientSession clientSession, final String viewName, final String viewOn,
292+
final List<? extends Bson> pipeline) {
293+
createView(clientSession, viewName, viewOn, pipeline, new CreateViewOptions());
294+
}
295+
296+
@Override
297+
public void createView(final ClientSession clientSession, final String viewName, final String viewOn,
298+
final List<? extends Bson> pipeline, final CreateViewOptions createViewOptions) {
299+
executeCreateView(clientSession, viewName, viewOn, pipeline, createViewOptions);
300+
}
301+
302+
private void executeCreateView(final ClientSession clientSession, final String viewName, final String viewOn,
303+
final List<? extends Bson> pipeline, final CreateViewOptions createViewOptions) {
304+
notNull("clientSession", clientSession);
208305
notNull("createViewOptions", createViewOptions);
209306
executor.execute(new CreateViewOperation(name, viewName, viewOn, createBsonDocumentList(pipeline), writeConcern)
210-
.collation(createViewOptions.getCollation()));
307+
.collation(createViewOptions.getCollation()),
308+
clientSession);
211309
}
212310

213311
private List<BsonDocument> createBsonDocumentList(final List<? extends Bson> pipeline) {

driver/src/main/com/mongodb/MongoIterableImpl.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,6 @@ abstract class MongoIterableImpl<TResult> implements MongoIterable<TResult> {
3232
private ReadPreference readPreference;
3333
private Integer batchSize;
3434

35-
MongoIterableImpl(final OperationExecutor executor, final ReadConcern readConcern,
36-
final ReadPreference readPreference) {
37-
this(null, executor, readConcern, readPreference);
38-
}
39-
4035
MongoIterableImpl(final ClientSession clientSession, final OperationExecutor executor, final ReadConcern readConcern,
4136
final ReadPreference readPreference) {
4237
this.clientSession = clientSession;

0 commit comments

Comments
 (0)