package com.sample.utils;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
/**
* A collection of utility function to create, insert, bulk insert documents
* into mongo
*
* @author saifasif
*/
public class MongoDbUtils {
private static final Logger log = Logger.getLogger(MongoDbUtils.class);
private static String URI = "mongodb://%s:%s@%s:%s/%s";
private String userName;
private String passWord;
private String host;
private String port;
private String dbName;
private MongoClientURI mongoClientURI;
private MongoClient mongoClient;
private Properties properties = new Properties();
public MongoDbUtils(String dbName) {
_loadPropertiesFile();
this.dbName = dbName;
_initConnection(dbName);
}
public MongoDbUtils(String dbName, MongoClient mongoClient) {
this.dbName = dbName;
this.mongoClient = mongoClient;
}
/**
* Load the properties file
*/
private void _loadPropertiesFile() {
try {
properties.load(new FileReader("./src/main/resources/connection.properties"));
} catch (IOException e) {
log.error(e.getMessage(), e);
}
this.userName = properties.getProperty("mongo.db.username", "admin");
this.passWord = properties.getProperty("mongo.db.password", "admin");
this.host = properties.getProperty("mongo.db.host");
this.port = properties.getProperty("mongo.db.port");
log.debug("Properties loaded");
}
/**
* Initialize the connection to the DB
*
* @param dbName
*/
private void _initConnection(String dbName) {
String connectionString = String.format(URI, userName, passWord, host, port, this.dbName);
log.debug("Attempting connection:::" + connectionString);
this.mongoClientURI = new MongoClientURI(connectionString);
this.mongoClient = new MongoClient(this.mongoClientURI);
log.debug("Connected to mongo");
}
/**
* Get the current DB connection
*
* @return {@link MongoDatabase} connection
*/
private MongoDatabase _getCurrentDB() {
return this.mongoClient.getDatabase(this.dbName);
}
/**
* Inserts documents into the collection
*
* @param collectionName
* @param documents
*/
private void _insertDocuments(String collectionName, List<Document> documents) {
getCollectionConn(collectionName).insertMany(documents);
}
/**
* To insert a single document into the mongo collection
*
* @param collectionName
* @param document
*/
public void insertDocument(String collectionName, Document document) {
log.debug("Inserting document:" + document.toJson().toString());
ArrayList<Document> docList = new ArrayList<>();
docList.add(document);
_insertDocuments(collectionName, docList);
log.debug("Document inserted:" + document.toJson().toString());
}
/**
* Create a collection
*
* @param collectionName
*/
public void createCollection(String collectionName) {
_getCurrentDB().createCollection(collectionName);
}
/**
* Get the connection to the collection with respect to the current database
*
* @param collectionName
* @return
*/
public MongoCollection<Document> getCollectionConn(String collectionName) {
return _getCurrentDB().getCollection(collectionName);
}
}