diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoDbFactory.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoDbFactory.java new file mode 100644 index 000000000..9dcc371f6 --- /dev/null +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoDbFactory.java @@ -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; + +} diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoDbFactoryBean.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoDbFactoryBean.java index 760f4060b..27637c09e 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoDbFactoryBean.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoDbFactoryBean.java @@ -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, InitializingBean { +public class MongoDbFactoryBean implements MongoDbFactory, FactoryBean, InitializingBean { //ToDo: add PersistenceExceptionTranslator ??? /** @@ -46,7 +47,29 @@ public class MongoDbFactoryBean implements FactoryBean, 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, 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) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoTemplate.java index 249a6602b..c88e03bab 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoTemplate.java @@ -95,13 +95,10 @@ public class MongoTemplate implements MongoOperations, ApplicationEventPublisher private final MongoConverter mongoConverter; private final MappingContext, 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 void maybeEmitEvent(MongoMappingEvent 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()); } /**