Skip to content

Commit

Permalink
Merge pull request #13245 from evanchooly/mongoCodecs
Browse files Browse the repository at this point in the history
Reorder codec registry configuration so that custom codecs are registered first
  • Loading branch information
evanchooly authored Nov 12, 2020
2 parents 10effb0 + 566aae9 commit c7695bd
Showing 1 changed file with 35 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import static com.mongodb.AuthenticationMechanism.MONGODB_X509;
import static com.mongodb.AuthenticationMechanism.PLAIN;
import static com.mongodb.AuthenticationMechanism.SCRAM_SHA_1;
import static org.bson.codecs.configuration.CodecRegistries.fromProviders;
import static org.bson.codecs.configuration.CodecRegistries.fromRegistries;

import java.lang.reflect.Constructor;
import java.util.ArrayList;
Expand All @@ -21,7 +23,6 @@
import javax.inject.Singleton;

import org.bson.codecs.configuration.CodecProvider;
import org.bson.codecs.configuration.CodecRegistries;
import org.bson.codecs.configuration.CodecRegistry;
import org.bson.codecs.pojo.ClassModel;
import org.bson.codecs.pojo.Conventions;
Expand Down Expand Up @@ -226,35 +227,7 @@ private MongoClientSettings createMongoConfiguration(MongoClientConfig config) {
settings.applyConnectionString(connectionString);
}

List<CodecProvider> providers = new ArrayList<>();
if (!mongoClientSupport.getCodecProviders().isEmpty()) {
providers.addAll(getCodecProviders(mongoClientSupport.getCodecProviders()));
}
// add pojo codec provider with automatic capabilities
// it always needs to be the last codec provided
PojoCodecProvider.Builder pojoCodecProviderBuilder = PojoCodecProvider.builder()
.automatic(true)
.conventions(Conventions.DEFAULT_CONVENTIONS);
// register bson discriminators
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
for (String bsonDiscriminator : mongoClientSupport.getBsonDiscriminators()) {
try {
pojoCodecProviderBuilder
.register(ClassModel.builder(Class.forName(bsonDiscriminator, true, classLoader))
.enableDiscriminator(true).build());
} catch (ClassNotFoundException e) {
// Ignore
}
}
// register property codec provider
if (!mongoClientSupport.getPropertyCodecProviders().isEmpty()) {
pojoCodecProviderBuilder.register(getPropertyCodecProviders(mongoClientSupport.getPropertyCodecProviders())
.toArray(new PropertyCodecProvider[0]));
}
providers.add(pojoCodecProviderBuilder.build());
CodecRegistry registry = CodecRegistries.fromRegistries(defaultCodecRegistry,
CodecRegistries.fromProviders(providers));
settings.codecRegistry(registry);
configureCodecRegistry(defaultCodecRegistry, settings);

settings.commandListenerList(getCommandListeners(mongoClientSupport.getCommandListeners()));

Expand Down Expand Up @@ -299,6 +272,38 @@ private MongoClientSettings createMongoConfiguration(MongoClientConfig config) {
return settings.build();
}

private void configureCodecRegistry(CodecRegistry defaultCodecRegistry, MongoClientSettings.Builder settings) {
List<CodecProvider> providers = new ArrayList<>();
if (!mongoClientSupport.getCodecProviders().isEmpty()) {
providers.addAll(getCodecProviders(mongoClientSupport.getCodecProviders()));
}
// add pojo codec provider with automatic capabilities
// it always needs to be the last codec provided
PojoCodecProvider.Builder pojoCodecProviderBuilder = PojoCodecProvider.builder()
.automatic(true)
.conventions(Conventions.DEFAULT_CONVENTIONS);
// register bson discriminators
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
for (String bsonDiscriminator : mongoClientSupport.getBsonDiscriminators()) {
try {
pojoCodecProviderBuilder
.register(ClassModel.builder(Class.forName(bsonDiscriminator, true, classLoader))
.enableDiscriminator(true).build());
} catch (ClassNotFoundException e) {
// Ignore
}
}
// register property codec provider
if (!mongoClientSupport.getPropertyCodecProviders().isEmpty()) {
pojoCodecProviderBuilder.register(getPropertyCodecProviders(mongoClientSupport.getPropertyCodecProviders())
.toArray(new PropertyCodecProvider[0]));
}
CodecRegistry registry = !providers.isEmpty() ? fromRegistries(fromProviders(providers), defaultCodecRegistry,
fromProviders(pojoCodecProviderBuilder.build()))
: fromRegistries(defaultCodecRegistry, fromProviders(pojoCodecProviderBuilder.build()));
settings.codecRegistry(registry);
}

private static List<ServerAddress> parseHosts(List<String> addresses) {
if (addresses.isEmpty()) {
return Collections.singletonList(new ServerAddress(ServerAddress.defaultHost(), ServerAddress.defaultPort()));
Expand Down

0 comments on commit c7695bd

Please sign in to comment.