Merge pull request #130 from dsyer/fix/gh-129

Use MongoOptions and MongoClientURI to build MongoClient
This commit is contained in:
Scott Frederick
2015-07-24 10:32:04 -05:00
2 changed files with 26 additions and 50 deletions

View File

@@ -4,28 +4,23 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoClientURI;
import com.mongodb.MongoClientOptions.Builder;
import com.mongodb.MongoCredential;
import com.mongodb.MongoException;
import com.mongodb.ServerAddress;
import com.mongodb.WriteConcern;
import org.springframework.cloud.service.AbstractServiceConnectorCreator;
import org.springframework.cloud.service.ServiceConnectorConfig;
import org.springframework.cloud.service.ServiceConnectorCreationException;
import org.springframework.cloud.service.common.MongoServiceInfo;
import org.springframework.data.authentication.UserCredentials;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.util.ClassUtils;
import org.springframework.util.ReflectionUtils;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoClientOptions.Builder;
import com.mongodb.MongoClientURI;
import com.mongodb.MongoException;
import com.mongodb.WriteConcern;
/**
* Simplified access to creating MongoDB service objects.
*
@@ -37,7 +32,7 @@ public class MongoDbFactoryCreator extends AbstractServiceConnectorCreator<Mongo
@Override
public MongoDbFactory create(MongoServiceInfo serviceInfo, ServiceConnectorConfig config) {
try {
MongoClientOptions mongoOptionsToUse = getMongoOptions((MongoDbFactoryConfig) config);
MongoClientOptions.Builder mongoOptionsToUse = getMongoOptions((MongoDbFactoryConfig) config);
SimpleMongoDbFactory mongoDbFactory = createMongoDbFactory(serviceInfo, mongoOptionsToUse);
@@ -49,33 +44,13 @@ public class MongoDbFactoryCreator extends AbstractServiceConnectorCreator<Mongo
}
}
private SimpleMongoDbFactory createMongoDbFactory(MongoServiceInfo serviceInfo, MongoClientOptions mongoOptionsToUse) throws UnknownHostException {
MongoClientURI mongoClientURI = new MongoClientURI(serviceInfo.getUri());
List<ServerAddress> serverAddressList = getServerAddresses(mongoClientURI);
MongoClient mongo = new MongoClient(serverAddressList, mongoOptionsToUse);
MongoCredential mongoCredential = mongoClientURI.getCredentials();
if (mongoCredential.getUserName() != null && mongoCredential.getPassword() != null) {
UserCredentials credentials = new UserCredentials(mongoCredential.getUserName(), new String(mongoCredential.getPassword()));
return new SimpleMongoDbFactory(mongo, mongoClientURI.getDatabase(), credentials, mongoCredential.getSource());
}
private SimpleMongoDbFactory createMongoDbFactory(MongoServiceInfo serviceInfo, MongoClientOptions.Builder mongoOptionsToUse) throws UnknownHostException {
MongoClientURI mongoClientURI = new MongoClientURI(serviceInfo.getUri(), mongoOptionsToUse);
MongoClient mongo = new MongoClient(mongoClientURI);
return new SimpleMongoDbFactory(mongo, mongoClientURI.getDatabase());
}
private List<ServerAddress> getServerAddresses(MongoClientURI mongoClientURI) throws UnknownHostException {
List<String> servers = mongoClientURI.getHosts();
List<ServerAddress> serverAddressList = new ArrayList<ServerAddress>();
for(String server : servers) {
serverAddressList.add(new ServerAddress(server));
}
return serverAddressList;
}
private MongoClientOptions getMongoOptions(MongoDbFactoryConfig config) {
private MongoClientOptions.Builder getMongoOptions(MongoDbFactoryConfig config) {
MongoClientOptions.Builder builder;
Method builderMethod = ClassUtils.getMethodIfAvailable(MongoClientOptions.class, "builder");
@@ -108,7 +83,7 @@ public class MongoDbFactoryCreator extends AbstractServiceConnectorCreator<Mongo
}
}
return builder.build();
return builder;
}
public SimpleMongoDbFactory configure(SimpleMongoDbFactory mongoDbFactory, MongoDbFactoryConfig config) {

View File

@@ -8,14 +8,14 @@ import java.util.List;
import org.junit.Test;
import org.springframework.cloud.service.common.MongoServiceInfo;
import org.springframework.cloud.service.document.MongoDbFactoryCreator;
import org.springframework.data.authentication.UserCredentials;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.test.util.ReflectionTestUtils;
import com.mongodb.Mongo;
import com.mongodb.ServerAddress;
import org.springframework.util.StringUtils;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
/**
* Test cases for Mongo service connector creators.
*
@@ -44,10 +44,11 @@ public class MongoServiceConnectorCreatorTest {
assertNotNull(mongoDbFactory);
Mongo mongo = (Mongo) ReflectionTestUtils.getField(mongoDbFactory, "mongo");
UserCredentials credentials = (UserCredentials) ReflectionTestUtils.getField(mongoDbFactory, "credentials");
MongoClient mongo = (MongoClient) ReflectionTestUtils.getField(mongoDbFactory, "mongo");
assertNotNull(mongo);
MongoCredential credentials = mongo.getCredentialsList().get(0);
List<ServerAddress> addresses = mongo.getAllAddress();
assertEquals(1, addresses.size());
@@ -55,8 +56,8 @@ public class MongoServiceConnectorCreatorTest {
assertEquals(serviceInfo.getHost(), address.getHost());
assertEquals(serviceInfo.getPort(), address.getPort());
assertEquals(serviceInfo.getUserName(), ReflectionTestUtils.getField(credentials, "username"));
assertEquals(serviceInfo.getPassword(), ReflectionTestUtils.getField(credentials, "password"));
assertEquals(serviceInfo.getUserName(), credentials.getUserName());
assertNotNull(credentials.getPassword());
// Don't do connector.getDatabase().getName() as that will try to initiate the connection
assertEquals(serviceInfo.getDatabase(), ReflectionTestUtils.getField(mongoDbFactory, "databaseName"));
@@ -73,15 +74,15 @@ public class MongoServiceConnectorCreatorTest {
assertNotNull(mongoDbFactory);
Mongo mongo = (Mongo) ReflectionTestUtils.getField(mongoDbFactory, "mongo");
UserCredentials credentials = (UserCredentials) ReflectionTestUtils.getField(mongoDbFactory, "credentials");
MongoClient mongo = (MongoClient) ReflectionTestUtils.getField(mongoDbFactory, "mongo");
assertNotNull(mongo);
List<ServerAddress> addresses = mongo.getAllAddress();
assertEquals(3, addresses.size());
assertEquals(TEST_USERNAME, ReflectionTestUtils.getField(credentials, "username"));
assertEquals(TEST_PASSWORD, ReflectionTestUtils.getField(credentials, "password"));
MongoCredential credentials = mongo.getCredentialsList().get(0);
assertEquals(TEST_USERNAME, credentials.getUserName());
assertNotNull(credentials.getPassword());
// Don't do connector.getDatabase().getName() as that will try to initiate the connection
assertEquals(TEST_DB, ReflectionTestUtils.getField(mongoDbFactory, "databaseName"));