/* * Copyright (c) 2011-2014 Jeppetto and Jonathan Thompson * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.iternine.jeppetto.testsupport; import org.iternine.jeppetto.testsupport.db.Database; import org.iternine.jeppetto.testsupport.db.MongoDatabase; import org.springframework.context.ApplicationContext; import java.io.Closeable; import java.io.IOException; import java.util.Properties; import java.util.UUID; public class MongoDatabaseProvider implements DatabaseProvider, Closeable { //------------------------------------------------------------- // Constants //------------------------------------------------------------- private static final String MONGODB_PORT_PROPERTY = "mongodb.left.port"; private static final String BACKUP_MONGODB_PORT_PROPERTY = "mongodb.port"; private static final String MONGODB_NAME_PROPERTY = "mongodb.dbname"; //------------------------------------------------------------- // Variables - Private //------------------------------------------------------------- private MongoDatabase db; private String mongoPortProperty; private String mongoDbNameProperty; private boolean uniquifyName; //------------------------------------------------------------- // Constructors //------------------------------------------------------------- /** * Construct a default MongoDatabaseProvider that will uniquify mongodb database names. */ public MongoDatabaseProvider() { this(true); } /** * Uses the default mongodb port properties (either "mongodb.left.port" or "mongodb.port"). * Uses the default mongodb name property ("mongodb.dbname") * * @param uniquifyName true if the mongodb database name should be modified to avoid collisions with concurrent tests */ public MongoDatabaseProvider(boolean uniquifyName) { this(MONGODB_PORT_PROPERTY, MONGODB_NAME_PROPERTY, uniquifyName); } /** * @param mongoPortProperty name of the property that specifies the mongodb port * @param mongoDbNameProperty name of the property that specifies the mongodb database name * @param uniquifyName true if the mongodb database name should be modified to avoid collisions with concurrent tests */ public MongoDatabaseProvider(String mongoPortProperty, String mongoDbNameProperty, boolean uniquifyName) { this.mongoPortProperty = mongoPortProperty; this.mongoDbNameProperty = mongoDbNameProperty; this.uniquifyName = uniquifyName; } //------------------------------------------------------------- // Implementation - DatabaseProvider //------------------------------------------------------------- @Override public Properties modifyProperties(Properties properties) { int mongoDbPort; String mongoDbName; try { mongoDbPort = Integer.parseInt(properties.getProperty(mongoPortProperty)); } catch (NumberFormatException nfe) { mongoDbPort = Integer.parseInt(properties.getProperty(BACKUP_MONGODB_PORT_PROPERTY)); } if (uniquifyName) { String baseName = properties.getProperty(mongoDbNameProperty); mongoDbName = String.format("%s_%s", baseName, UUID.randomUUID().toString().substring(0, 3)); properties.setProperty(mongoDbNameProperty, mongoDbName); } else { mongoDbName = properties.getProperty(mongoDbNameProperty); } // eager-initialization of db ahead of rest of spring config db = MongoDatabase.forPlatform(mongoDbPort); db.setMongoDbName(mongoDbName); return properties; } @Override public Database getDatabase(Properties properties, ApplicationContext applicationContext) { return db; } //------------------------------------------------------------- // Implementation - Closeable //------------------------------------------------------------- @Override public void close() throws IOException { if (db != null) { db.close(); } } }