/src/main/java/ua/in/link/db/DBHelper.java

https://github.com/ValeryLitvin/linkshorter · Java · 127 lines · 98 code · 23 blank · 6 comment · 15 complexity · 2adf58a607c60f3ade1f479b2df65d32 MD5 · raw file

  1. package ua.in.link.db;
  2. import com.google.gson.Gson;
  3. import com.mongodb.*;
  4. import ua.in.link.utils.RandomString;
  5. import java.net.UnknownHostException;
  6. import java.util.*;
  7. /**
  8. * The DB helper.
  9. * User: b0noI
  10. * Date: 06.04.13
  11. * Time: 23:18
  12. */
  13. public class DBHelper {
  14. private static final int RANDOM_STRING_LENGTH = 5;
  15. private static final RandomString RANDOM_STRING = new RandomString(RANDOM_STRING_LENGTH);
  16. private static final Gson GSON = new Gson();
  17. private final DBCollection urls;
  18. private final MongoClient mongo;
  19. private DBHelper() {
  20. try {
  21. mongo = new MongoClient(IDBSettings.DB_URL, IDBSettings.DB_PORT);
  22. DB db = mongo.getDB(IDBSettings.DB_NAME);
  23. db.authenticate(IDBSettings.DB_LOGIN, IDBSettings.DB_PASSWORD);
  24. urls = db.getCollection(IDBSettings.COLLECTION_NAME);
  25. } catch (UnknownHostException e) {
  26. e.printStackTrace();
  27. throw new RuntimeException(e);
  28. }
  29. }
  30. public static DBHelper getInstance() {
  31. return InstanceHolder.getInstance();
  32. }
  33. public URL getShortUrl(String fullUrl) {
  34. URL urlFromDB = checkFullUrl(fullUrl);
  35. if (urlFromDB != null)
  36. return urlFromDB;
  37. URL url = new URL(fullUrl, generateNewShort(), new Date(), new ArrayList<URL.DataStat>());
  38. BasicDBObject urlDBObject = new BasicDBObject(IDBSettings.URL_FILED_NAME, url.getOriginalUrl()).
  39. append(IDBSettings.SHORT_CODE_FILED_NAME, url.getShortUrl()).
  40. append(IDBSettings.CREATION_TIME_FILED_NAME, url.getCreationTime().getTime()).
  41. append(IDBSettings.STATISTIC_FILED_NAME, GSON.toJson(url.getStatistic()));
  42. urls.insert(urlDBObject);
  43. return url;
  44. }
  45. public URL getFullUrl(String shortUrl) {
  46. try(DBCursor c = urls.find(new BasicDBObject(IDBSettings.SHORT_CODE_FILED_NAME, shortUrl))){
  47. if (!c.hasNext())
  48. return null;
  49. DBObject object = c.next();
  50. String statJson = (String)object.get(IDBSettings.STATISTIC_FILED_NAME);
  51. List<URL.DataStat> stat = new ArrayList<>();
  52. if (statJson != null)
  53. stat = GSON.fromJson(statJson, List.class);
  54. Long creationTimeLong = (Long)object.get(IDBSettings.CREATION_TIME_FILED_NAME);
  55. if (creationTimeLong == null)
  56. creationTimeLong = new Date().getTime();
  57. return new URL((String)object.get(IDBSettings.URL_FILED_NAME), shortUrl,
  58. new Date(creationTimeLong),
  59. stat);
  60. }
  61. }
  62. public void incrementStatForURL(URL url, String OS) {
  63. DBObject c = urls.findOne(new BasicDBObject(IDBSettings.SHORT_CODE_FILED_NAME, url.getShortUrl()));
  64. List<URL.DataStat> stats = (List<URL.DataStat>)GSON.fromJson((String) c.get(IDBSettings.STATISTIC_FILED_NAME), List.class);
  65. if (stats == null)
  66. stats = new ArrayList<>();
  67. URL.DataStat statData = new URL.DataStat(new Date(), OS);
  68. stats.add(statData);
  69. BasicDBObject newObject = new BasicDBObject(c.toMap()).append(IDBSettings.STATISTIC_FILED_NAME, GSON.toJson(stats));
  70. urls.update(c, newObject);
  71. }
  72. private URL checkFullUrl(String fullUrl) {
  73. try(DBCursor c = urls.find(new BasicDBObject(IDBSettings.URL_FILED_NAME, fullUrl))){
  74. if (!c.hasNext())
  75. return null;
  76. DBObject object = c.next();
  77. String statJson = (String)object.get(IDBSettings.STATISTIC_FILED_NAME);
  78. List<URL.DataStat> stat = new ArrayList<>();
  79. if (statJson != null)
  80. stat = GSON.fromJson(statJson, List.class);
  81. Long creationTimeLong = (Long)object.get(IDBSettings.CREATION_TIME_FILED_NAME);
  82. if (creationTimeLong == null)
  83. creationTimeLong = new Date().getTime();
  84. return new URL(fullUrl, (String)object.get(IDBSettings.SHORT_CODE_FILED_NAME),
  85. new Date(creationTimeLong),
  86. stat);
  87. }
  88. }
  89. private String generateNewShort() {
  90. do {
  91. String shortString = RANDOM_STRING.nextString();
  92. try(DBCursor c = urls.find(new BasicDBObject(IDBSettings.SHORT_CODE_FILED_NAME, shortString))){
  93. if (!c.hasNext())
  94. return shortString;
  95. }
  96. }while (true);
  97. }
  98. private static class InstanceHolder {
  99. private static DBHelper INSTANCE = new DBHelper();
  100. public static DBHelper getInstance() {
  101. return INSTANCE;
  102. }
  103. }
  104. }