package org.apereo.cas.config;
import com.google.common.base.Throwables;
import com.mongodb.Mongo;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoClientURI;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import org.apereo.cas.MongoDbPropertySource;
import org.apereo.cas.MongoDbPropertySourceLocator;
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.data.mongodb.config.AbstractMongoConfiguration;
import org.springframework.data.mongodb.core.MongoClientOptionsFactoryBean;
import java.util.Collections;
/**
* This is {@link MongoDbCloudConfigBootstrapConfiguration}.
*
* @author Misagh Moayyed
* @since 5.0.0
*/
@Configuration("mongoDbCloudConfigBootstrapConfiguration")
@ConditionalOnProperty(name = "cas.spring.cloud.mongo.uri")
public class MongoDbCloudConfigBootstrapConfiguration extends AbstractMongoConfiguration {
private static final int TIMEOUT = 5000;
private static final int DEFAULT_PORT = 27017;
@Autowired
private ConfigurableEnvironment environment;
@Bean
public MongoDbPropertySourceLocator consulPropertySourceLocator() {
try {
if (!mongoTemplate().collectionExists(MongoDbPropertySource.class.getSimpleName())) {
mongoTemplate().createCollection(MongoDbPropertySource.class.getSimpleName());
}
return new MongoDbPropertySourceLocator(mongoTemplate());
} catch (final Exception e) {
throw Throwables.propagate(e);
}
}
@Override
protected String getDatabaseName() {
return mongoClientUri().getDatabase();
}
@Override
public Mongo mongo() throws Exception {
final MongoCredential credential = MongoCredential.createCredential(
mongoClientUri().getUsername(),
getDatabaseName(),
mongoClientUri().getPassword());
final String hostUri = mongoClientUri().getHosts().get(0);
final String[] host = hostUri.split(":");
return new MongoClient(new ServerAddress(
host[0], host.length > 1 ? Integer.parseInt(host[1]) : DEFAULT_PORT),
Collections.singletonList(credential),
mongoClientOptions());
}
@Bean
public MongoClientOptions mongoClientOptions() {
try {
final MongoClientOptionsFactoryBean bean = new MongoClientOptionsFactoryBean();
bean.setSocketTimeout(TIMEOUT);
bean.setConnectTimeout(TIMEOUT);
bean.afterPropertiesSet();
return bean.getObject();
} catch (final Exception e) {
throw new BeanCreationException(e.getMessage(), e);
}
}
@Bean
public MongoClientURI mongoClientUri() {
return new MongoClientURI(environment.getProperty("cas.spring.cloud.mongo.uri"));
}
}