DATADOC-88 introducing a MongoDbFactory interface and MongoTemplate constructors that take this as an argument

This commit is contained in:
Thomas Risberg
2011-05-16 18:07:56 -04:00
parent 21cd013cf1
commit 86960006cb
3 changed files with 68 additions and 50 deletions

View File

@@ -0,0 +1,11 @@
package org.springframework.data.document.mongodb;
import org.springframework.dao.DataAccessException;
import com.mongodb.DB;
public interface MongoDbFactory {
DB getDb() throws DataAccessException;
}

View File

@@ -21,6 +21,7 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.util.Assert;
import com.mongodb.DB;
@@ -32,7 +33,7 @@ import com.mongodb.Mongo;
* @author Thomas Risberg
* @since 1.0
*/
public class MongoDbFactoryBean implements FactoryBean<DB>, InitializingBean {
public class MongoDbFactoryBean implements MongoDbFactory, FactoryBean<DB>, InitializingBean {
//ToDo: add PersistenceExceptionTranslator ???
/**
@@ -46,7 +47,29 @@ public class MongoDbFactoryBean implements FactoryBean<DB>, InitializingBean {
private String databaseName;
private String username;
private String password;
public MongoDbFactoryBean() {
}
public MongoDbFactoryBean(Mongo mongo, String databaseName) throws DataAccessException {
Assert.notNull(mongo, "Mongo must not be null");
Assert.hasText(databaseName, "Database name must not be empty");
this.mongo = mongo;
this.databaseName = databaseName;
try {
afterPropertiesSet();
} catch (Exception e) {
if (e instanceof RuntimeException) {
throw (RuntimeException)e;
}
else {
throw new DataAccessResourceFailureException("Error while initializing DB Factory", e);
}
}
}
public void setMongo(Mongo mongo) {
this.mongo = mongo;
}
@@ -93,10 +116,10 @@ public class MongoDbFactoryBean implements FactoryBean<DB>, InitializingBean {
// apply defaults - convenient when used to configure for tests
// in an application context
//ToDo: do we need a default or should we require database name?
if (databaseName == null) {
logger.warn("Property databaseName not specified. Using default name 'test'");
databaseName = "test";
}
// if (databaseName == null) {
// logger.warn("Property databaseName not specified. Using default name 'test'");
// databaseName = "test";
// }
if (mongo == null) {
logger.warn("Property mongo not specified. Using default configuration");
if (host == null) {

View File

@@ -95,13 +95,10 @@ public class MongoTemplate implements MongoOperations, ApplicationEventPublisher
private final MongoConverter mongoConverter;
private final MappingContext<? extends MongoPersistentEntity<?>, MongoPersistentProperty> mappingContext;
private final Mongo mongo;
private final MongoDbFactory mongoDbFactory;
private final MongoExceptionTranslator exceptionTranslator = new MongoExceptionTranslator();
private final QueryMapper mapper;
private String databaseName;
private String username;
private String password;
private ApplicationEventPublisher eventPublisher;
/**
@@ -111,7 +108,7 @@ public class MongoTemplate implements MongoOperations, ApplicationEventPublisher
* @param databaseName
*/
public MongoTemplate(Mongo mongo, String databaseName) {
this(mongo, databaseName, null, null, null);
this(mongo, databaseName, null);
}
/**
@@ -123,7 +120,26 @@ public class MongoTemplate implements MongoOperations, ApplicationEventPublisher
* @param mongoConverter
*/
public MongoTemplate(Mongo mongo, String databaseName, MongoConverter mongoConverter) {
this(mongo, databaseName, mongoConverter, null, null);
this(new MongoDbFactoryBean(mongo, databaseName), mongoConverter, null, null);
}
/**
* Constructor used for a basic template configuration
*
* @param mongoDbFactory
*/
public MongoTemplate(MongoDbFactory mongoDbFactory) {
this(mongoDbFactory, null);
}
/**
* Constructor used for a basic template configuration
*
* @param mongoDbFactory
* @param mongoConverter
*/
public MongoTemplate(MongoDbFactory mongoDbFactory, MongoConverter mongoConverter) {
this(mongoDbFactory, null, null, null);
}
/**
@@ -136,14 +152,12 @@ public class MongoTemplate implements MongoOperations, ApplicationEventPublisher
* @param writeConcern
* @param writeResultChecking
*/
MongoTemplate(Mongo mongo, String databaseName, MongoConverter mongoConverter, WriteConcern writeConcern,
MongoTemplate(MongoDbFactory mongoDbFactory, MongoConverter mongoConverter, WriteConcern writeConcern,
WriteResultChecking writeResultChecking) {
Assert.notNull(mongo);
Assert.notNull(databaseName);
Assert.notNull(mongoDbFactory);
this.mongo = mongo;
this.databaseName = databaseName;
this.mongoDbFactory = mongoDbFactory;
this.writeConcern = writeConcern;
this.mongoConverter = mongoConverter == null ? getDefaultMongoConverter() : mongoConverter;
@@ -170,37 +184,6 @@ public class MongoTemplate implements MongoOperations, ApplicationEventPublisher
this.eventPublisher = applicationEventPublisher;
}
/**
* Sets the username to use to connect to the Mongo database
*
* @param username
* The username to use
*/
public void setUsername(String username) {
this.username = username;
}
/**
* Sets the password to use to authenticate with the Mongo database.
*
* @param password
* The password to use
*/
public void setPassword(String password) {
this.password = password;
}
/**
* Sets the database name to be used.
*
* @param databaseName
*/
public void setDatabaseName(String databaseName) {
Assert.notNull(databaseName);
this.databaseName = databaseName;
}
/**
* Returns the default {@link org.springframework.data.document.mongodb.convert.MongoConverter}.
*
@@ -868,7 +851,7 @@ public class MongoTemplate implements MongoOperations, ApplicationEventPublisher
}
public DB getDb() {
return MongoDbUtils.getDB(mongo, databaseName, username, password == null ? null : password.toCharArray());
return mongoDbFactory.getDb();
}
protected <T> void maybeEmitEvent(MongoMappingEvent<T> event) {
@@ -1158,8 +1141,9 @@ public class MongoTemplate implements MongoOperations, ApplicationEventPublisher
}
private void initializeMappingMongoConverter(MappingMongoConverter converter) {
converter.setMongo(mongo);
converter.setDefaultDatabase(databaseName);
DB db = this.mongoDbFactory.getDb();
converter.setMongo(db.getMongo());
converter.setDefaultDatabase(db.getName());
}
/**