1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.mongodb4;
18
19 import org.apache.logging.log4j.Logger;
20 import org.apache.logging.log4j.core.Core;
21 import org.apache.logging.log4j.core.appender.nosql.NoSqlProvider;
22 import org.apache.logging.log4j.core.config.plugins.Plugin;
23 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
24 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
25 import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
26 import org.apache.logging.log4j.core.filter.AbstractFilterable;
27 import org.apache.logging.log4j.status.StatusLogger;
28 import org.bson.codecs.configuration.CodecRegistries;
29 import org.bson.codecs.configuration.CodecRegistry;
30
31 import com.mongodb.ConnectionString;
32 import com.mongodb.MongoClientSettings;
33 import com.mongodb.client.MongoClient;
34 import com.mongodb.client.MongoClients;
35 import com.mongodb.client.MongoDatabase;
36
37
38
39
40
41 @Plugin(name = "MongoDb4", category = Core.CATEGORY_NAME, printObject = true)
42 public final class MongoDb4Provider implements NoSqlProvider<MongoDb4Connection> {
43
44 public static class Builder<B extends Builder<B>> extends AbstractFilterable.Builder<B>
45 implements org.apache.logging.log4j.core.util.Builder<MongoDb4Provider> {
46
47 @PluginBuilderAttribute(value = "connection")
48 @Required(message = "No connection string provided")
49 private String connectionStringSource;
50
51 @PluginBuilderAttribute
52 private int collectionSize = DEFAULT_COLLECTION_SIZE;
53
54 @PluginBuilderAttribute("capped")
55 private boolean capped = false;
56
57 @Override
58 public MongoDb4Provider build() {
59 return new MongoDb4Provider(connectionStringSource, capped, collectionSize);
60 }
61
62 public B setCapped(final boolean isCapped) {
63 this.capped = isCapped;
64 return asBuilder();
65 }
66
67 public B setCollectionSize(final int collectionSize) {
68 this.collectionSize = collectionSize;
69 return asBuilder();
70 }
71 }
72
73 private static final Logger LOGGER = StatusLogger.getLogger();
74
75
76 private static final CodecRegistry CODEC_REGISTRIES = CodecRegistries.fromRegistries(
77 MongoClientSettings.getDefaultCodecRegistry(),
78 CodecRegistries.fromCodecs(MongoDb4LevelCodec.INSTANCE));
79
80
81
82 private static final int DEFAULT_COLLECTION_SIZE = 536_870_912;
83
84 @PluginBuilderFactory
85 public static <B extends Builder<B>> B newBuilder() {
86 return new Builder<B>().asBuilder();
87 }
88
89 private final Integer collectionSize;
90 private final boolean isCapped;
91 private final MongoClient mongoClient;
92 private final MongoDatabase mongoDatabase;
93 private final ConnectionString connectionString;
94
95 private MongoDb4Provider(final String connectionStringSource, final boolean isCapped,
96 final Integer collectionSize) {
97 LOGGER.debug("Creating ConnectionString {}...", connectionStringSource);
98 this.connectionString = new ConnectionString(connectionStringSource);
99 LOGGER.debug("Created ConnectionString {}", connectionString);
100 LOGGER.debug("Creating MongoClientSettings...");
101
102 final MongoClientSettings settings = MongoClientSettings.builder()
103 .applyConnectionString(this.connectionString)
104 .codecRegistry(CODEC_REGISTRIES)
105 .build();
106
107 LOGGER.debug("Created MongoClientSettings {}", settings);
108 LOGGER.debug("Creating MongoClient {}...", settings);
109 this.mongoClient = MongoClients.create(settings);
110 LOGGER.debug("Created MongoClient {}", mongoClient);
111 String databaseName = this.connectionString.getDatabase();
112 LOGGER.debug("Getting MongoDatabase {}...", databaseName);
113 this.mongoDatabase = this.mongoClient.getDatabase(databaseName);
114 LOGGER.debug("Got MongoDatabase {}", mongoDatabase);
115 this.isCapped = isCapped;
116 this.collectionSize = collectionSize;
117 }
118
119 @Override
120 public MongoDb4Connection getConnection() {
121 return new MongoDb4Connection(connectionString, mongoClient, mongoDatabase, isCapped, collectionSize);
122 }
123
124 @Override
125 public String toString() {
126 return String.format(
127 "%s [connectionString=%s, collectionSize=%s, isCapped=%s, mongoClient=%s, mongoDatabase=%s]",
128 MongoDb4Provider.class.getSimpleName(), connectionString, collectionSize, isCapped, mongoClient,
129 mongoDatabase);
130 }
131
132 }