/datastore-mongodb/src/main/java/com/dandanakka/datastore/mongodb/MongoDataStore.java

https://github.com/saravanak/Dandanakka · Java · 259 lines · 211 code · 44 blank · 4 comment · 29 complexity · aaaf11ce3cd3024e1336ac3059b63bbc MD5 · raw file

  1. package com.dandanakka.datastore.mongodb;
  2. import java.io.IOException;
  3. import java.net.UnknownHostException;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import java.util.Map;
  7. import org.bson.types.ObjectId;
  8. import org.omg.CORBA.SystemException;
  9. import com.dandanakka.core.util.ConfigUtil;
  10. import com.dandanakka.datastore.DataStore;
  11. import com.dandanakka.datastore.exception.DataStoreException;
  12. import com.dandanakka.datastore.model.Criteria;
  13. import com.dandanakka.datastore.model.PaginatedResult;
  14. import com.dandanakka.datastore.model.Query;
  15. import com.mongodb.BasicDBObject;
  16. import com.mongodb.CommandResult;
  17. import com.mongodb.DB;
  18. import com.mongodb.DBCursor;
  19. import com.mongodb.DBObject;
  20. import com.mongodb.Mongo;
  21. import com.mongodb.MongoException;
  22. import com.mongodb.QueryBuilder;
  23. import com.mongodb.WriteResult;
  24. public class MongoDataStore extends DataStore {
  25. private DB getMongoDB() throws DataStoreException {
  26. DB db = null;
  27. try {
  28. Mongo mongo = new Mongo(
  29. ConfigUtil.getCongiguration("mongodb.host"),
  30. ConfigUtil.getCongigurationAsInt("mongodb.port"));
  31. String dbName = "site" + getApplication().getName();
  32. if (getApplication().getName().equals("application") || mongo.getDatabaseNames().contains(dbName)) {
  33. db = mongo.getDB(dbName);
  34. } else {
  35. throw new DataStoreException("Application not found");
  36. }
  37. } catch (UnknownHostException e) {
  38. throw new DataStoreException("please check MongoDB instance", e);
  39. } catch (MongoException e) {
  40. throw new DataStoreException("please check MongoDB instance", e);
  41. } catch (SystemException e) {
  42. throw new DataStoreException("please check MongoDB instance", e);
  43. } catch (IOException e) {
  44. throw new DataStoreException("please check config file instance", e);
  45. }
  46. return db;
  47. }
  48. @Override
  49. public String createData(String schemaName, Map<String, Object> data)
  50. throws DataStoreException {
  51. DB db = getMongoDB();
  52. BasicDBObject dbObject = new BasicDBObject(data);
  53. WriteResult result = db.getCollection(schemaName).insert(dbObject);
  54. return dbObject.getString("_id");
  55. }
  56. @Override
  57. public int updateData(String schemaName, Map<String, Object> data)
  58. throws DataStoreException {
  59. DB db = getMongoDB();
  60. BasicDBObject queryObject = new BasicDBObject("_id", getIdValue(data
  61. .get(getIdColumnName()).toString()));
  62. DBObject dbObject = db.getCollection(schemaName).findOne(queryObject);
  63. if (dbObject == null) {
  64. dbObject = new BasicDBObject(data);
  65. } else {
  66. dbObject.putAll(data);
  67. }
  68. dbObject.put(getIdColumnName(),
  69. getIdValue(dbObject.get(getIdColumnName()).toString()));
  70. WriteResult result = db.getCollection(schemaName).update(queryObject,
  71. dbObject);
  72. return result.getN();
  73. }
  74. @Override
  75. public Map<String, Object> getDataMap(String schemaName, String id)
  76. throws DataStoreException {
  77. if (id == null) {
  78. return null;
  79. }
  80. DB db = getMongoDB();
  81. BasicDBObject queryObject = new BasicDBObject("_id", getIdValue(id));
  82. return (Map<String, Object>) db.getCollection(schemaName).findOne(
  83. queryObject);
  84. }
  85. @Override
  86. public PaginatedResult getDataList(String schemaName,
  87. Map<String, Object> data, Integer pageNumber, Integer pageSize)
  88. throws DataStoreException {
  89. PaginatedResult paginatedResult = null;
  90. List<Map<String, Object>> list = null;
  91. DB db = getMongoDB();
  92. BasicDBObject queryObject = new BasicDBObject(data);
  93. DBCursor dbCursor = db.getCollection(schemaName).find(queryObject);
  94. if (pageNumber != null) {
  95. dbCursor = dbCursor.batchSize(pageSize)
  96. .skip((pageNumber - 1) * pageSize).limit(pageSize);
  97. }
  98. list = new ArrayList<Map<String, Object>>();
  99. while (dbCursor.hasNext()) {
  100. list.add((Map<String, Object>) dbCursor.next());
  101. }
  102. if (list != null) {
  103. paginatedResult = new PaginatedResult();
  104. paginatedResult.setResults(list);
  105. paginatedResult.setNoOfRecords(dbCursor.count());
  106. }
  107. return paginatedResult;
  108. }
  109. @Override
  110. public PaginatedResult getDataList(String schemaName, Query query,
  111. Integer pageNumber, Integer pageSize) throws DataStoreException {
  112. PaginatedResult paginatedResult = null;
  113. List<Map<String, Object>> list = null;
  114. DB db = getMongoDB();
  115. DBCursor dbCursor = null;
  116. if (query != null) {
  117. BasicDBObject queryObject = new BasicDBObject();
  118. QueryBuilder qb = new QueryBuilder();
  119. List<Criteria> criterias = query.getCriterias();
  120. for (Criteria criteria : criterias) {
  121. switch (criteria.getOperator()) {
  122. case IS_NULL:
  123. qb.put(criteria.getColumnName()).is(null);
  124. break;
  125. case EQUALS:
  126. queryObject.put(criteria.getColumnName(),
  127. criteria.getValue());
  128. break;
  129. }
  130. }
  131. queryObject.putAll(qb.get());
  132. dbCursor = db.getCollection(schemaName).find(queryObject);
  133. } else {
  134. dbCursor = db.getCollection(schemaName).find();
  135. }
  136. if (pageNumber != null) {
  137. dbCursor = dbCursor.batchSize(pageSize)
  138. .skip((pageNumber - 1) * pageSize).limit(pageSize);
  139. }
  140. list = new ArrayList<Map<String, Object>>();
  141. while (dbCursor.hasNext()) {
  142. list.add((Map<String, Object>) dbCursor.next());
  143. }
  144. if (list != null) {
  145. paginatedResult = new PaginatedResult();
  146. paginatedResult.setResults(list);
  147. paginatedResult.setNoOfRecords(dbCursor.count());
  148. }
  149. return paginatedResult;
  150. }
  151. @Override
  152. public String getIdColumnName() {
  153. return "_id";
  154. }
  155. @Override
  156. public boolean deleteData(String schemaName, String id)
  157. throws DataStoreException {
  158. if (id == null) {
  159. return false;
  160. }
  161. DB db = getMongoDB();
  162. return db.getCollection(schemaName)
  163. .remove(new BasicDBObject("_id", getIdValue(id))).getError() == null;
  164. }
  165. private Object getIdValue(String id) {
  166. Object idValue = id;
  167. try {
  168. idValue = new ObjectId(id);
  169. } catch (Exception e) {
  170. // TODO: handle exception
  171. }
  172. return idValue;
  173. }
  174. @Override
  175. public void createClone(String applicationName) throws DataStoreException {
  176. try {
  177. DB db = getMongoDB();
  178. String dbName = "site" + applicationName;
  179. if (db.getMongo().getDatabaseNames().contains(dbName)) {
  180. throw new DataStoreException("Clone Already Exists");
  181. } else {
  182. DBObject dbObject = new BasicDBObject();
  183. dbObject.put("copydb", 1);
  184. dbObject.put("fromdb", db.getName());
  185. dbObject.put("todb", "site" + applicationName);
  186. CommandResult result = db.getMongo()
  187. .getDB(ConfigUtil.getCongiguration("mongodb.admindb"))
  188. .command(dbObject);
  189. }
  190. } catch (UnknownHostException e) {
  191. throw new DataStoreException(
  192. "can not create Clone. please check MongoDB instance", e);
  193. } catch (MongoException e) {
  194. // TODO Auto-generated catch block
  195. e.printStackTrace();
  196. } catch (IOException e) {
  197. // TODO Auto-generated catch block
  198. e.printStackTrace();
  199. }
  200. }
  201. @Override
  202. public void deleteDataStore(String applicationName)
  203. throws DataStoreException {
  204. try {
  205. DB db = getMongoDB();
  206. String dbName = "site" + applicationName;
  207. if (db.getMongo().getDatabaseNames().contains(dbName)) {
  208. db.getMongo().getDB("site" + applicationName).dropDatabase();
  209. }
  210. } catch (MongoException e) {
  211. // TODO Auto-generated catch block
  212. e.printStackTrace();
  213. }
  214. }
  215. }