001 package com.khubla.pragmatach.plugin.mongodb.db;
002
003 import javax.persistence.Entity;
004
005 import com.khubla.pragmatach.framework.api.PragmatachException;
006 import com.khubla.pragmatach.framework.application.Application;
007 import com.mongodb.DB;
008 import com.mongodb.DBCollection;
009 import com.mongodb.MongoClient;
010
011 /**
012 * @author tom
013 */
014 public class DBCollectionFactory {
015 /**
016 * singleton
017 */
018 private static DBCollectionFactory instance = null;
019
020 private static DB getDB() throws PragmatachException {
021 try {
022 /*
023 * params
024 */
025 final String hostname = Application.getConfiguration().getParameter("mongodb.Hostname");
026 final String database = Application.getConfiguration().getParameter("mongodb.Database");
027 final String username = Application.getConfiguration().getParameter("mongodb.Username");
028 final String password = Application.getConfiguration().getParameter("mongodb.Password");
029 /*
030 * client & db
031 */
032 final MongoClient mongoClient = new MongoClient(hostname);
033 final DB db = mongoClient.getDB(database);
034 if (null != username) {
035 final boolean auth = db.authenticate(username, password.toCharArray());
036 if (false == auth) {
037 throw new Exception("Unable to authenticate to db '" + database + "' with username '" + username + "'");
038 }
039 }
040 return db;
041 } catch (final Exception e) {
042 throw new PragmatachException("Exception in getDB", e);
043 }
044 }
045
046 public static DBCollectionFactory getInstance() {
047 if (null == instance) {
048 instance = new DBCollectionFactory();
049 }
050 return instance;
051 }
052
053 /**
054 * ctor
055 */
056 private DBCollectionFactory() {
057 }
058
059 /**
060 * drop the DB, for testing purposes
061 */
062 public void dropDB() throws PragmatachException {
063 try {
064 final String database = Application.getConfiguration().getParameter("mongodb.Database");
065 final String hostname = Application.getConfiguration().getParameter("mongodb.Hostname");
066 final MongoClient mongoClient = new MongoClient(hostname);
067 final DB db = mongoClient.getDB(database);
068 db.dropDatabase();
069 } catch (final Exception e) {
070 throw new PragmatachException("Exception in dropDB", e);
071 }
072 }
073
074 /**
075 * get the DBCollection
076 */
077 public <T> DBCollection getDBCollection(Class<T> clazz) {
078 try {
079 /*
080 * DB
081 */
082 final DB db = getDB();
083 /*
084 * collection name
085 */
086 final Entity entity = getEntity(clazz);
087 if (null == entity) {
088 throw new Exception("Type '" + clazz.getCanonicalName() + "' is not annotated as an @Entity");
089 }
090 /*
091 * collection
092 */
093 String collectionName = clazz.getSimpleName();
094 if (((null != entity.name()) && (entity.name().length() > 0))) {
095 collectionName = entity.name();
096 }
097 /*
098 * get collection
099 */
100 final DBCollection ret = db.getCollection(collectionName);
101 /*
102 * done
103 */
104 return ret;
105 } catch (final Exception e) {
106 throw new ExceptionInInitializerError(e);
107 }
108 }
109
110 /**
111 * get the entity
112 */
113 private <T> Entity getEntity(Class<T> clazz) {
114 return clazz.getAnnotation(Entity.class);
115 }
116 }