PageRenderTime 182ms CodeModel.GetById 40ms RepoModel.GetById 7ms app.codeStats 0ms

/src/main/java/ru/papyrus/collector/dao/ArticleDAOImpl.java

https://bitbucket.org/s_leroux/newscollector
Java | 308 lines | 226 code | 33 blank | 49 comment | 47 complexity | fba3f4c4b439d90e7f0d96d8c1301a35 MD5 | raw file
  1. package ru.papyrus.collector.dao;
  2. import java.util.*;
  3. import java.util.stream.Collectors;
  4. import org.hibernate.Criteria;
  5. import org.hibernate.HibernateException;
  6. import org.hibernate.Query;
  7. import org.hibernate.Session;
  8. import org.hibernate.criterion.*;
  9. import org.json.JSONArray;
  10. import org.json.JSONObject;
  11. import org.slf4j.LoggerFactory;
  12. import org.slf4j.Logger;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import ru.papyrus.collector.entity.Article;
  15. import ru.papyrus.collector.entity.Source;
  16. import ru.papyrus.collector.entity.UserSession;
  17. import ru.papyrus.collector.main.HibernateUtil;
  18. import javax.servlet.http.HttpSession;
  19. /**
  20. *
  21. * @author roux
  22. */
  23. public class ArticleDAOImpl implements ArticleDAO{
  24. private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
  25. // @Autowired
  26. // private DBLogger DB_LOGGER;
  27. @Autowired
  28. private SessionDAO sessionDAO;
  29. @Autowired
  30. private SourceDAO sourceDAO;
  31. @Override
  32. public Collection<Article> getAllArticles() {
  33. // DB_LOGGER.debug("Это getAllArticles");
  34. List<Article> r = new ArrayList<>();
  35. Session session = null;
  36. try {
  37. session = HibernateUtil.getSessionFactory().openSession();
  38. Criteria criteria = session.createCriteria(Article.class);
  39. r = (List<Article>)criteria.list();
  40. session.close();
  41. } catch (Exception e) {
  42. LOGGER.error("Ошибка при получении всех статей. " + e.getClass().getSimpleName() + ": " + e.getMessage());
  43. for (int i = 0; i < e.getStackTrace().length; i++) {
  44. LOGGER.error(""+e.getStackTrace()[i]);
  45. }
  46. } finally {
  47. if (session != null && session.isOpen()) {
  48. session.close();
  49. }
  50. }
  51. return r;
  52. }
  53. @Override
  54. public Collection<Article> getArticleByLink(String link) {
  55. // DB_LOGGER.debug("Это getArticleByLink, link: " + link);
  56. List<Article> r = new ArrayList<>();
  57. Session session = null;
  58. try {
  59. session = HibernateUtil.getSessionFactory().openSession();
  60. Criteria criteria = session.createCriteria(Article.class);
  61. criteria.add(Restrictions.eq("newsLink", link));
  62. r = (List<Article>)criteria.list();
  63. } catch (HibernateException e) {
  64. LOGGER.error("Ошибка при получении статей по ссылке. " + e.getClass().getSimpleName() + ": " + e.getMessage());
  65. for (int i = 0; i < e.getStackTrace().length; i++) {
  66. LOGGER.error(""+e.getStackTrace()[i]);
  67. }
  68. } finally {
  69. if (session != null && session.isOpen()) {
  70. session.close();
  71. }
  72. }
  73. return r;
  74. }
  75. @Override
  76. public boolean addArticle(Article article) {
  77. // DB_LOGGER.debug("Это addArticle: " + article.getNewsTitle());
  78. Session session = null;
  79. boolean success = false;
  80. try {
  81. session = HibernateUtil.getSessionFactory().openSession();
  82. session.beginTransaction();
  83. session.save(article);
  84. session.getTransaction().commit();
  85. success = true;
  86. } catch (Exception e) {
  87. LOGGER.error("Ошибка при добавлении статьи. " + e.getClass().getSimpleName() + ": " + e.getMessage());
  88. for (int i = 0; i < e.getStackTrace().length; i++) {
  89. LOGGER.error(""+e.getStackTrace()[i]);
  90. }
  91. } finally {
  92. if (session != null && session.isOpen()) {
  93. session.close();
  94. }
  95. }
  96. return success;
  97. }
  98. /**
  99. * Получаем количество статей, лежащих по заданному линку.
  100. * @param link
  101. * @return
  102. */
  103. @Override
  104. public Long getArticlesCountByLink(String link) {
  105. Session session = null;
  106. Long r = 0l;
  107. try {
  108. session = HibernateUtil.getSessionFactory().openSession();
  109. Criteria criteria = session.createCriteria(Article.class);
  110. criteria.add(Restrictions.eq("newsLink", link));
  111. criteria.setProjection(Projections.rowCount());
  112. r = (Long)criteria.uniqueResult();
  113. session.close();
  114. } catch (HibernateException e) {
  115. LOGGER.error("Ошибка при получении статей по ссылке. " + e.getClass().getSimpleName() + ": " + e.getMessage());
  116. for (int i = 0; i < e.getStackTrace().length; i++) {
  117. LOGGER.error(""+e.getStackTrace()[i]);
  118. }
  119. } finally {
  120. if (session != null && session.isOpen()) {
  121. session.close();
  122. }
  123. }
  124. return r;
  125. }
  126. /**
  127. * Получаем список уже существующих в БД ссылок по заданному имени источника.
  128. * Это нужно для решения вопроса, скачивать или нет очередную статью.
  129. * @param sourceName
  130. * @return
  131. */
  132. @Override
  133. public List<String> getLinksBySourceName(String sourceName) {
  134. // LOGGER.debug("Это getLinksBySourceName, sourceName: " + sourceName);
  135. List<String> r = new ArrayList<>();
  136. Session session = null;
  137. try {
  138. session = HibernateUtil.getSessionFactory().openSession();
  139. Query q = session.createQuery("select newsLink from Article a where a.source.name = :name ");
  140. q.setParameter("name", sourceName);
  141. r = (List<String>)q.list();
  142. session.close();
  143. } catch (HibernateException e) {
  144. LOGGER.error("Ошибка при получении ссылок по имени источника. " + e.getClass().getSimpleName() + ": " + e.getMessage());
  145. for (int i = 0; i < e.getStackTrace().length; i++) {
  146. LOGGER.error(""+e.getStackTrace()[i]);
  147. }
  148. } finally {
  149. if (session != null && session.isOpen()) {
  150. session.close();
  151. }
  152. }
  153. return r;
  154. }
  155. /**
  156. * Получаем из БД статьи по заданными параметрам
  157. * @param parameterMap
  158. */
  159. @Override
  160. public JSONObject retrieveArticles(Map<String, String[]> parameterMap, HttpSession httpSession) {
  161. // LOGGER.debug("Это retrieveArticles");
  162. JSONObject ret = new JSONObject();
  163. JSONArray articlesJSON = new JSONArray();
  164. Integer articlesCount = null;
  165. try {
  166. articlesCount = Integer.parseInt(parameterMap.get("articlesCount")[0]);
  167. } catch (Exception e) {
  168. }
  169. Session session = null;
  170. UserSession userSession = sessionDAO.getSessionById(httpSession.getId());
  171. // LOGGER.debug("userSession: " + userSession);
  172. try {
  173. session = HibernateUtil.getSessionFactory().openSession();
  174. Criteria criteria = session.createCriteria(Article.class);
  175. if(articlesCount != null) {
  176. /* Это вытаскивание N последних статей */
  177. // LOGGER.debug("Это вытаскивание N последних статей");
  178. // LOGGER.debug("articlesCount: " + articlesCount);
  179. criteria.setMaxResults(articlesCount);
  180. ret.put("count", articlesCount);
  181. List<String> commonSourceNames = sourceDAO.getCommonSources().stream().map(Source::getName).collect(Collectors.toList());
  182. // LOGGER.debug("commonSourceNames: " + commonSourceNames.size());
  183. if (userSession == null) {
  184. /* Если нет сессии, то статьи только из общедоступных источников */
  185. // LOGGER.debug("Если нет сессии, то статьи только из общедоступных источников");
  186. // criteria.createAlias("source", "s").add(Restrictions.eq("s.common", true));
  187. criteria.add(Restrictions.in("sourceName", commonSourceNames));
  188. } else {
  189. /* Если сессия есть, то статьи только из источников по подписке */
  190. // LOGGER.debug("Если сессия есть, то статьи только из источников по подписке");
  191. List<String> subscriptionSourceNames = userSession.getUser().getAccessSources(true).stream().map(Source::getName).collect(Collectors.toList());
  192. // LOGGER.debug("subscriptionSourceNames: " + subscriptionSourceNames);
  193. if (subscriptionSourceNames.isEmpty()) {
  194. criteria = null;
  195. } else {
  196. criteria.add(Restrictions.in("sourceName", subscriptionSourceNames));
  197. }
  198. }
  199. } else {
  200. /* А это вытаскивание статей по параметрам поиска */
  201. // LOGGER.debug("А это вытаскивание статей по параметрам поиска");
  202. /* По источникам */
  203. String[] sourceNames = parameterMap.get("sources[]");
  204. if (sourceNames != null && sourceNames.length > 0) {
  205. criteria.add(Restrictions.in("sourceName", sourceNames));
  206. }
  207. /* По дате начала */
  208. try {
  209. Date dateFrom = new Date(Long.parseLong(parameterMap.get("dateFrom")[0]));
  210. criteria.add(Restrictions.ge("articleDate", dateFrom));
  211. } catch (Exception e) {
  212. /* Не добавляем никакого ограничения */
  213. }
  214. /* По дате окончания */
  215. try {
  216. Date dateTo = new Date(Long.parseLong(parameterMap.get("dateTo")[0]));
  217. criteria.add(Restrictions.le("articleDate", dateTo));
  218. } catch (Exception e) {
  219. /* Не добавляем никакого ограничения */
  220. }
  221. /* По контексту заголовка */
  222. String titleContext = parameterMap.get("titleContext")[0];
  223. if (titleContext != null && !titleContext.trim().isEmpty()) {
  224. criteria.add(Restrictions.ilike("newsTitle", titleContext, MatchMode.ANYWHERE));
  225. }
  226. /* По контексту тела статьи */
  227. String bodyContext = parameterMap.get("bodyContext")[0];
  228. if (bodyContext != null && !bodyContext.trim().isEmpty()) {
  229. criteria.add(Restrictions.ilike("content", bodyContext, MatchMode.ANYWHERE));
  230. }
  231. criteria.setProjection(Projections.rowCount());
  232. ret.put("count", criteria.uniqueResult());
  233. criteria.setProjection(null);
  234. /* Не более 1000 результатов */
  235. criteria.setMaxResults(1000);
  236. }
  237. List<Article> articles = null;
  238. if (criteria != null) {
  239. criteria.addOrder(Order.desc("articleDate"));
  240. try {
  241. articles = criteria.list();
  242. } catch (Exception e) {
  243. LOGGER.error("Exception при получении списка статей " + e.getClass().getSimpleName() + ": " + e.getMessage());
  244. }
  245. }
  246. // LOGGER.debug("articles: " + articles);
  247. // LOGGER.debug("Получено статей из базы: " + articles.size());
  248. if (articles != null) {
  249. try {
  250. for (Article article : articles) {
  251. articlesJSON.put(article.toJSON());
  252. }
  253. } catch (Exception e) {
  254. LOGGER.error("Exception при итерации статей: " + e.getClass().getSimpleName() + ": " + e.getMessage());
  255. for (int i = 0; i < e.getStackTrace().length; i++) {
  256. LOGGER.error(""+e.getStackTrace()[i]);
  257. }
  258. }
  259. }
  260. ret.put("articles", articlesJSON);
  261. return ret;
  262. } catch (Exception e) {
  263. LOGGER.error("Ошибка при получении статей из БД " + e.getClass().getSimpleName() + ": " + e.getMessage());
  264. for (int i = 0; i < e.getStackTrace().length; i++) {
  265. LOGGER.error(""+e.getStackTrace()[i]);
  266. }
  267. return null;
  268. } finally {
  269. if(session != null && session.isOpen()) {
  270. session.disconnect();
  271. session.close();
  272. }
  273. }
  274. }
  275. }