package de.otto.edison.mongo.configuration;
import static java.util.Collections.singletonList;
import static org.slf4j.LoggerFactory.getLogger;
import static com.mongodb.MongoCredential.createCredential;
import java.util.Collections;
import java.util.List;
import org.bson.codecs.configuration.CodecRegistry;
import org.slf4j.Logger;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.client.MongoDatabase;
@Configuration
@EnableConfigurationProperties(MongoProperties.class)
public class MongoConfiguration {
private static final Logger LOG = getLogger(MongoConfiguration.class);
private static List<MongoCredential> getMongoCredentials(final MongoProperties mongoProperties) {
if (useUnauthorizedConnection(mongoProperties)) {
return Collections.emptyList();
}
return singletonList(
createCredential(mongoProperties.getUser(), mongoProperties.getDb(), mongoProperties.getPassword().toCharArray()));
}
private static boolean useUnauthorizedConnection(final MongoProperties mongoProperties) {
return mongoProperties.getUser().isEmpty() || mongoProperties.getPassword().isEmpty();
}
@Bean
@ConditionalOnMissingBean(CodecRegistry.class)
public CodecRegistry codecRegistry() {
return MongoClient.getDefaultCodecRegistry();
}
@Bean
@ConditionalOnMissingBean(name = "mongoClient", value = MongoClient.class)
public MongoClient mongoClient(final MongoProperties mongoProperties) {
LOG.info("Creating MongoClient");
return new MongoClient(mongoProperties.getServers(), getMongoCredentials(mongoProperties),
mongoProperties.toMongoClientOptions(codecRegistry()));
}
@Bean
@ConditionalOnMissingBean(name = "mongoDatabase", value = MongoDatabase.class)
public MongoDatabase mongoDatabase(final MongoClient mongoClient, final MongoProperties mongoProperties) {
return mongoClient.getDatabase(mongoProperties.getDb());
}
}