Skip to content

Commit bbe77de

Browse files
author
QuadStingray
committed
feat: Added MongoDb Listeners to MongoConfig (Command and Connection Pool)
1 parent e8e3531 commit bbe77de

File tree

5 files changed

+95
-67
lines changed

5 files changed

+95
-67
lines changed

.scalafmt.conf

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
1-
version = 2.7.5
1+
version = "3.0.0-RC5"
22

3-
style = defaultWithAlign
3+
preset = defaultWithAlign
44
project.git = true
5-
maxColumn = 120
5+
maxColumn = 160
66
unindentTopLevelOperators = true
7-
danglingParentheses = true
7+
danglingParentheses.preset = true
8+
spaces.inImportCurlyBraces = true
89
newlines.alwaysBeforeElseAfterCurlyIf = true
910

10-
rewrite.rules = [RedundantBraces, SortImports, PreferCurlyFors]
11+
rewrite.rules = [AvoidInfix, PreferCurlyFors, SortImports, SortModifiers, RedundantBraces]
12+
13+
rewrite.redundantBraces.methodBodies = false
14+
rewrite.redundantBraces.includeUnitMethods = true
15+
rewrite.redundantBraces.parensForOneLineApply = true
16+
rewrite.redundantBraces.maxLines = 1
17+
rewrite.redundantBraces.ifElseExpressions = false
18+
rewrite.redundantBraces.methodBodies = false
19+
rewrite.redundantBraces.includeUnitMethods = false

src/main/scala/dev/mongocamp/driver/mongodb/database/DatabaseProvider.scala

Lines changed: 39 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package dev.mongocamp.driver.mongodb.database
22

33
import dev.mongocamp.driver.mongodb._
44
import dev.mongocamp.driver.mongodb.bson.codecs.CustomCodecProvider
5-
import org.bson.codecs.configuration.CodecRegistries.{fromProviders, fromRegistries}
5+
import org.bson.codecs.configuration.CodecRegistries.{ fromProviders, fromRegistries }
66
import org.bson.codecs.configuration.CodecRegistry
77
import org.mongodb.scala.MongoClient.DEFAULT_CODEC_REGISTRY
88
import org.mongodb.scala._
@@ -34,8 +34,7 @@ class DatabaseProvider(val config: MongoConfig, val registry: CodecRegistry) ext
3434
cachedClient = None
3535
}
3636

37-
def databases: ListDatabasesObservable[Document] =
38-
client.listDatabases()
37+
def databases: ListDatabasesObservable[Document] = client.listDatabases()
3938

4039
def databaseInfos: List[DatabaseInfo] = databases.resultList().map(doc => DatabaseInfo(doc)).sortBy(_.name)
4140

@@ -44,30 +43,32 @@ class DatabaseProvider(val config: MongoConfig, val registry: CodecRegistry) ext
4443
def dropDatabase(databaseName: String = DefaultDatabaseName): SingleObservable[Void] = database(databaseName).drop()
4544

4645
def database(databaseName: String = DefaultDatabaseName): MongoDatabase = {
47-
if (!cachedDatabaseMap.contains(databaseName))
46+
if (!cachedDatabaseMap.contains(databaseName)) {
4847
cachedDatabaseMap.put(databaseName, client.getDatabase(databaseName).withCodecRegistry(registry))
48+
}
4949
cachedDatabaseMap(databaseName)
5050
}
5151

52-
def addChangeObserver(
53-
observer: ChangeObserver[Document],
54-
databaseName: String = DefaultDatabaseName
55-
): ChangeObserver[Document] = {
52+
def addChangeObserver(observer: ChangeObserver[Document], databaseName: String = DefaultDatabaseName): ChangeObserver[Document] = {
5653
database(databaseName).watch().subscribe(observer)
5754
observer
5855
}
5956

60-
def collections(databaseName: String = DefaultDatabaseName): ListCollectionsObservable[Document] =
57+
def collections(databaseName: String = DefaultDatabaseName): ListCollectionsObservable[Document] = {
6158
database(databaseName).listCollections()
59+
}
6260

63-
def collectionInfos(databaseName: String = DefaultDatabaseName): List[CollectionInfo] =
61+
def collectionInfos(databaseName: String = DefaultDatabaseName): List[CollectionInfo] = {
6462
collections(databaseName).resultList().map(doc => CollectionInfo(doc)).sortBy(_.name)
63+
}
6564

66-
def collectionNames(databaseName: String = DefaultDatabaseName): List[String] =
65+
def collectionNames(databaseName: String = DefaultDatabaseName): List[String] = {
6766
collectionInfos(databaseName).map(info => info.name)
67+
}
6868

69-
def runCommand(document: Document, databaseName: String = DefaultDatabaseName): SingleObservable[Document] =
69+
def runCommand(document: Document, databaseName: String = DefaultDatabaseName): SingleObservable[Document] = {
7070
database(databaseName).runCommand(document)
71+
}
7172

7273
def collectionStatus(
7374
collectionName: String,
@@ -81,42 +82,51 @@ class DatabaseProvider(val config: MongoConfig, val registry: CodecRegistry) ext
8182
val newCollectionName: String = guessName(collectionName)
8283
database(newDatabaseName).getCollection[A](newCollectionName)
8384
}
84-
else
85+
else {
8586
database().getCollection[A](collectionName)
87+
}
8688

87-
def guessDatabaseName(maybeSeparatedName: String): String =
88-
if (maybeSeparatedName.contains(DatabaseProvider.CollectionSeparator))
89+
def guessDatabaseName(maybeSeparatedName: String): String = {
90+
if (maybeSeparatedName.contains(DatabaseProvider.CollectionSeparator)) {
8991
maybeSeparatedName.substring(0, maybeSeparatedName.indexOf(DatabaseProvider.CollectionSeparator))
90-
else
92+
}
93+
else {
9194
DefaultDatabaseName
95+
}
96+
}
9297

93-
def guessName(maybeSeparatedName: String): String =
94-
if (maybeSeparatedName.contains(DatabaseProvider.CollectionSeparator))
98+
def guessName(maybeSeparatedName: String): String = {
99+
if (maybeSeparatedName.contains(DatabaseProvider.CollectionSeparator)) {
95100
maybeSeparatedName.substring(maybeSeparatedName.indexOf(DatabaseProvider.CollectionSeparator) + 1)
96-
else
101+
}
102+
else {
97103
maybeSeparatedName
104+
}
105+
}
98106

99-
def bucket(bucketName: String): GridFSBucket =
107+
def bucket(bucketName: String): GridFSBucket = {
100108
if (bucketName.contains(DatabaseProvider.CollectionSeparator)) {
101109
val newDatabaseName = guessDatabaseName(bucketName)
102110
val newBucketName = guessName(bucketName)
103111
GridFSBucket(database(newDatabaseName), newBucketName)
104112
}
105-
else
113+
else {
106114
GridFSBucket(database(), bucketName)
115+
}
116+
}
107117

108118
def dao(collectionName: String): MongoDAO[Document] = {
109-
if (!cachedMongoDAOMap.contains(collectionName))
119+
if (!cachedMongoDAOMap.contains(collectionName)) {
110120
cachedMongoDAOMap.put(collectionName, DocumentDao(this, collectionName))
121+
}
111122
cachedMongoDAOMap(collectionName)
112123
}
113124

114125
def cachedDatabaseNames(): List[String] = cachedDatabaseMap.keys.toList
115126

116127
def cachedCollectionNames(): List[String] = cachedMongoDAOMap.keys.toList
117128

118-
case class DocumentDao(provider: DatabaseProvider, collectionName: String)
119-
extends MongoDAO[Document](this, collectionName)
129+
case class DocumentDao(provider: DatabaseProvider, collectionName: String) extends MongoDAO[Document](this, collectionName)
120130

121131
}
122132

@@ -126,16 +136,14 @@ object DatabaseProvider {
126136

127137
private val CustomRegistry = fromProviders(CustomCodecProvider())
128138

129-
private val codecRegistry: CodecRegistry =
130-
fromRegistries(CustomRegistry, DEFAULT_CODEC_REGISTRY)
139+
private val codecRegistry: CodecRegistry = fromRegistries(CustomRegistry, DEFAULT_CODEC_REGISTRY)
131140

132-
def apply(config: MongoConfig, registry: CodecRegistry = codecRegistry): DatabaseProvider =
141+
def apply(config: MongoConfig, registry: CodecRegistry = codecRegistry): DatabaseProvider = {
133142
new DatabaseProvider(config, fromRegistries(registry, CustomRegistry, DEFAULT_CODEC_REGISTRY))
143+
}
134144

135-
def fromPath(
136-
configPath: String = MongoConfig.DefaultConfigPathPrefix,
137-
registry: CodecRegistry = codecRegistry
138-
): DatabaseProvider =
145+
def fromPath(configPath: String = MongoConfig.DefaultConfigPathPrefix, registry: CodecRegistry = codecRegistry): DatabaseProvider = {
139146
apply(MongoConfig.fromPath(configPath), fromRegistries(registry, CustomRegistry, DEFAULT_CODEC_REGISTRY))
147+
}
140148

141149
}

src/main/scala/dev/mongocamp/driver/mongodb/database/MongoConfig.scala

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package dev.mongocamp.driver.mongodb.database
22

33
import java.util.concurrent.TimeUnit
4-
54
import com.mongodb.MongoCompressor
65
import com.mongodb.MongoCredential.createCredential
6+
import com.mongodb.event.{ CommandListener, ConnectionPoolListener }
77
import dev.mongocamp.driver.mongodb.database.MongoConfig._
8-
import com.typesafe.config.{Config, ConfigFactory}
8+
import com.typesafe.config.{ Config, ConfigFactory }
99
import org.mongodb.scala.connection._
10-
import org.mongodb.scala.{MongoClientSettings, MongoCredential, ServerAddress}
10+
import org.mongodb.scala.{ MongoClientSettings, MongoCredential, ServerAddress }
1111

1212
import scala.jdk.CollectionConverters._
1313
import scala.collection.mutable.ArrayBuffer
@@ -22,50 +22,58 @@ case class MongoConfig(
2222
authDatabase: String = DefaultAuthenticationDatabaseName,
2323
poolOptions: MongoPoolOptions = MongoPoolOptions(),
2424
compressors: List[String] = List(),
25+
connectionPoolListener: List[ConnectionPoolListener] = List(),
26+
commandListener: List[CommandListener] = List(),
2527
customClientSettings: Option[MongoClientSettings] = None
2628
) {
2729

2830
val clientSettings: MongoClientSettings = {
29-
if (customClientSettings.isDefined)
31+
if (customClientSettings.isDefined) {
3032
customClientSettings.get
33+
}
3134
else {
32-
val clusterSettings: ClusterSettings =
33-
ClusterSettings.builder().hosts(List(new ServerAddress(host, port)).asJava).build()
35+
val clusterSettings: ClusterSettings = ClusterSettings.builder().hosts(List(new ServerAddress(host, port)).asJava).build()
3436

35-
val connectionPoolSettings = ConnectionPoolSettings
37+
val connectionPoolSettingsBuilder = ConnectionPoolSettings
3638
.builder()
3739
.maxConnectionIdleTime(poolOptions.maxConnectionIdleTime, TimeUnit.SECONDS)
3840
.maxSize(poolOptions.maxSize)
3941
.minSize(poolOptions.minSize)
4042
.maintenanceInitialDelay(poolOptions.maintenanceInitialDelay, TimeUnit.SECONDS)
41-
.build()
43+
44+
connectionPoolListener.foreach(listener => connectionPoolSettingsBuilder.addConnectionPoolListener(listener))
45+
46+
val connectionPoolSettings = connectionPoolSettingsBuilder.build()
4247

4348
val compressorList = new ArrayBuffer[MongoCompressor]()
44-
compressors.foreach { compression =>
45-
if (ComressionSnappy.equalsIgnoreCase(compression))
49+
compressors.foreach(compression => {
50+
if (ComressionSnappy.equalsIgnoreCase(compression)) {
4651
compressorList.+=(MongoCompressor.createSnappyCompressor())
47-
else if (ComressionZlib.equalsIgnoreCase(compression))
52+
}
53+
else if (ComressionZlib.equalsIgnoreCase(compression)) {
4854
compressorList.+=(MongoCompressor.createZlibCompressor())
49-
else if (ComressionZstd.equalsIgnoreCase(compression))
55+
}
56+
else if (ComressionZstd.equalsIgnoreCase(compression)) {
5057
compressorList.+=(MongoCompressor.createZstdCompressor())
51-
}
58+
}
59+
})
5260

5361
val builder = MongoClientSettings
5462
.builder()
5563
.applicationName(applicationName)
56-
.applyToConnectionPoolSettings((b: com.mongodb.connection.ConnectionPoolSettings.Builder) =>
57-
b.applySettings(connectionPoolSettings)
58-
)
64+
.applyToConnectionPoolSettings((b: com.mongodb.connection.ConnectionPoolSettings.Builder) => b.applySettings(connectionPoolSettings))
5965
.applyToClusterSettings((b: com.mongodb.connection.ClusterSettings.Builder) => b.applySettings(clusterSettings))
6066
.compressorList(compressorList.asJava)
6167

68+
commandListener.foreach(listener => builder.addCommandListener(listener))
69+
6270
if (userName.isDefined && password.isDefined) {
6371
val credential: MongoCredential = createCredential(userName.get, authDatabase, password.get.toCharArray)
64-
6572
builder.credential(credential).build()
6673
}
67-
else
74+
else {
6875
builder.build()
76+
}
6977
}
7078
}
7179
}

src/main/scala/dev/mongocamp/driver/mongodb/server/LocalServer.scala

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,20 @@ case class LocalServer(serverConfig: ServerConfig = ServerConfig()) {
1212
private val server: MongoServer = {
1313
if (ServerBackend.H2 == serverConfig.backend)
1414
if (serverConfig.h2BackendConfig.isDefined && !serverConfig.h2BackendConfig.get.inMemory) {
15-
if (serverConfig.h2BackendConfig.get.path.isDefined)
15+
if (serverConfig.h2BackendConfig.get.path.isDefined) {
1616
h2Path = serverConfig.h2BackendConfig.get.path.get
17-
else
17+
}
18+
else {
1819
h2Path = File.temporaryFile().get().path.toString
20+
}
1921
createH2Server(h2Path)
2022
}
21-
else
23+
else {
2224
createH2InMemoryServer
23-
else
25+
}
26+
else {
2427
createInMemoryServer
28+
}
2529
}
2630

2731
server.bind(serverConfig.host, serverConfig.port)
@@ -32,19 +36,18 @@ case class LocalServer(serverConfig: ServerConfig = ServerConfig()) {
3236

3337
def shutdown(): Unit = server.shutdown()
3438

35-
private def createInMemoryServer: MongoServer =
36-
new MongoServer(new MemoryBackend())
39+
private def createInMemoryServer: MongoServer = new MongoServer(new MemoryBackend())
3740

38-
private def createH2InMemoryServer: MongoServer =
39-
new MongoServer(H2Backend.inMemory())
41+
private def createH2InMemoryServer: MongoServer = new MongoServer(H2Backend.inMemory())
4042

41-
private def createH2Server(path: String): MongoServer =
42-
new MongoServer(new H2Backend(path))
43+
private def createH2Server(path: String): MongoServer = new MongoServer(new H2Backend(path))
4344

4445
}
4546

4647
object LocalServer {
4748

48-
def fromPath(configPath: String = DefaultServerConfigPathPrefix): LocalServer =
49-
LocalServer(ServerConfig.fromPath(configPath))
49+
def fromPath(configPath: String = DefaultServerConfigPathPrefix): LocalServer = LocalServer(
50+
ServerConfig.fromPath(configPath)
51+
)
52+
5053
}

version.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
version in ThisBuild := "2.4.3-SNAPSHOT"
1+
ThisBuild / version := "2.4.3"

0 commit comments

Comments
 (0)