/* * Copyright 2008-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package es.alvsanand.webpage.db.dao.cms; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.NoResultException; import javax.persistence.Query; import org.compass.core.CompassHits; import org.compass.core.CompassSearchSession; import org.datanucleus.store.query.AbstractQueryResult; import es.alvsanand.webpage.db.QueryBean; import es.alvsanand.webpage.db.dao.DAOException; import es.alvsanand.webpage.db.dao.DAOHelper; import es.alvsanand.webpage.model.Article; import es.alvsanand.webpage.model.ArticleState; import es.alvsanand.webpage.model.ArticleVersion; import es.alvsanand.webpage.model.Comment; import es.alvsanand.webpage.model.Rating; import es.alvsanand.webpage.model.Tag; import es.alvsanand.webpage.model.User; /** * Implementation of the <code>es.alvsanand.webpage.db.dao.cms.ArticleDAO</code> * * @author alvaro.santos * @date 28/07/2010 * */ public class ArticleDAOImpl extends DAOHelper implements ArticleDAO{ /** * Name of the query for delete an article */ private final static String DELETE_ARTICLE_NQ = "DELETE from Article article WHERE article.idArticle = :idArticle"; /** * Name of the query for delete an article */ private final static String DELETE_ARTICLEVERSIONS_ARTICLE_NQ = "DELETE from ArticleVersion articleVersion WHERE articleVersion.idArticle = :idArticle"; /** * Name of the query for delete an article */ private final static String DELETE_TAGS_ARTICLE_NQ = "DELETE from Tag tag WHERE tag.idArticle = :idArticle"; /** * Name of the query for delete a comment of an article */ private final static String DELETE_COMMENTS_ARTICLE_NQ = "DELETE from Comment comment WHERE comment.idArticle = :idArticle"; /** * Name of the query for delete a comment */ private final static String DELETE_COMMENT_NQ = "DELETE from Comment comment WHERE comment.idComment = :idComment"; /** * Name of the query for delete an rating of an article */ private final static String DELETE_RATING_ARTICLE_NQ = "DELETE from Rating rating WHERE rating.idArticle = :idArticle"; /** * Name of the query for obtaining an article by idArticle */ private final static String FIND_ARTICLE_NQ = "SELECT article FROM Article article WHERE article.idArticle = :idArticle"; /** * Name of the query for obtaining an articleVersion by idArticleVersion */ private final static String FIND_ARTICLE_VERSION_NQ = "SELECT articleVersion FROM ArticleVersion articleVersion WHERE articleVersion.idArticleVersion = :idArticleVersion"; /** * Name of the query for selecting all articles */ private final static String FIND_ALL_ARTICLE_NQ = "SELECT article FROM Article article"; /** * Name of the query for selecting all articles by Tag */ private final static String FIND_ALL_ARTICLE_BY_TAG_NQ = "SELECT tag.idArticle FROM Tag tag WHERE tag.name = :name and tag.asociated = true"; /** * Name of the query for selecting all articles by dates */ private final static String FIND_ALL_ACTIVATED_ARTICLE_BY_DATES_NQ = "SELECT article FROM Article article WHERE article.date > :beginDate and article.date < :endDate and article.state = 1 ORDER BY date DESC"; /** * Name of the query for selecting all articles */ private final static String FIND_ALL_ACTIVATED_ARTICLE_NQ = "SELECT article FROM Article article WHERE article.state = 1"; /** * Name of the query for selecting all articles */ private final static String FIND_ALL_BASIC_ACTIVATED_ARTICLE_NQ = "SELECT article.idArticle, article.name, article.date FROM Article article WHERE article.state = 1"; /** * Name of the query for selecting all articles */ private final static String FIND_ACTIVATED_ARTICLE_IN_LIST_NQ = "SELECT article FROM Article article WHERE article.state = 1 and article.idArticle in {0}"; /** * Name of the query for selecting all articles by the name */ private final static String FIND_ALL_BYNAME_ARTICLE_NQ = "SELECT article FROM Article article WHERE article.name = :name"; /** * Name of the query for obtaining the articleVersions of an article */ private final static String FIND_ARTICLE_VERSIONS_ARTICLE_NQ = "SELECT articleVersion FROM ArticleVersion articleVersion WHERE articleVersion.idArticle = :idArticle ORDER BY date DESC"; /** * Name of the query for obtaining the user of an article */ private final static String FIND_USER_ARTICLE_NQ = "SELECT user FROM User user WHERE user.idUser = :idUser"; /** * Name of the query for obtaining the comments of an article */ private final static String FIND_COMMENTS_ARTICLE_NQ = "SELECT comment FROM Comment comment WHERE comment.idArticle = :idArticle ORDER BY date ASC"; /** * Name of the query for obtaining the Tag of an article */ private final static String FIND_TAGS_ARTICLE_NQ = "SELECT tag FROM Tag tag WHERE tag.idArticle = :idArticle ORDER BY idTag DESC"; /** * Name of the query for obtaining the count of articles */ private final static String COUNT_ARTICLE_NQ = "SELECT count(article) FROM Article article"; /** * Name of the query for obtaining the count of articles */ private final static String COUNT_ACTIVATED_ARTICLE_NQ = "SELECT count(article) FROM Article article WHERE article.state = 1"; /** * Name of the query for obtaining the count of articles */ private final static String COUNT_ARTICLE_BYNAME_NQ = "SELECT count(article) FROM Article article WHERE article.name = :name"; /** * Name of the query for obtaining the Rating of an article */ private final static String FIND_RATINGS_ARTICLE_NQ = "SELECT rating FROM Rating rating WHERE rating.idArticle = :idArticle"; /** * Name of the query for obtaining the count of comments of an article */ private final static String COUNT_ARTICLE_COMMENTS_NQ = "SELECT count(comment) FROM Comment comment WHERE comment.idArticle = :idArticle"; /* (non-Javadoc) * @see es.alvsanand.webpage.db.dao.cms.ArticleDAO#getArticles(es.alvsanand.webpage.db.QueryBean) */ public List<Article> getArticles(QueryBean queryBean) throws DAOException{ try{ EntityManager entityManager = getEntityManager(); Query q = getQuery(entityManager, FIND_ALL_ARTICLE_NQ, queryBean); Object resultObj = q.getResultList(); List<Article> result = new java.util.ArrayList<Article>((List<Article>)resultObj); entityManager.close(); return result; } catch(NoResultException noResultException){ return null; } catch(Throwable e){ throw new DAOException("Error getting Article beans: " + e.getMessage(), e); } } /* (non-Javadoc) * @see es.alvsanand.webpage.db.dao.cms.ArticleDAO#getActivatedArticles(es.alvsanand.webpage.db.QueryBean) */ public List<Article> getActivatedArticles(QueryBean queryBean) throws DAOException{ try{ EntityManager entityManager = getEntityManager(); Query q = getQuery(entityManager, FIND_ALL_ACTIVATED_ARTICLE_NQ, queryBean); Object resultObj = q.getResultList(); List<Article> result = new java.util.ArrayList<Article>((List<Article>)resultObj); for(Article article: result){ article.setTags(getTags(article, entityManager)); article.setUser(getUser(article, entityManager)); article.setCommentCount(getArticleCommentsCount(article)); } entityManager.close(); return result; } catch(NoResultException noResultException){ return null; } catch(Throwable e){ throw new DAOException("Error getting Article beans: " + e.getMessage(), e); } } /* (non-Javadoc) * @see es.alvsanand.webpage.db.dao.cms.ArticleDAO#getBasicActivatedArticles(es.alvsanand.webpage.db.QueryBean) */ public List<Article> getBasicActivatedArticles(QueryBean queryBean) throws DAOException{ try{ EntityManager entityManager = getEntityManager(); Query q = getQuery(entityManager, FIND_ALL_BASIC_ACTIVATED_ARTICLE_NQ, queryBean); Object resultObj = q.getResultList(); List<Article> result = new java.util.ArrayList<Article>(); Iterator<Object[]> iterator = ((AbstractQueryResult)resultObj).iterator(); while(iterator.hasNext()) { Object[] entries = iterator.next(); Article article = new Article(); article.setIdArticle((String)entries[0]); article.setName((String)entries[1]); article.setDate((Date)entries[2]); result.add(article); } entityManager.close(); return result; } catch(NoResultException noResultException){ return null; } catch(Throwable e){ throw new DAOException("Error getting Article beans: " + e.getMessage(), e); } } /* (non-Javadoc) * @see es.alvsanand.webpage.db.dao.cms.ArticleDAO#getActivatedArticlesByCalendar(java.util.Calendar, int, es.alvsanand.webpage.db.QueryBean) */ public List<Article> getActivatedArticlesByDates(Date beginDate, Date endDate, QueryBean queryBean) throws DAOException{ try{ if(beginDate==null || endDate==null){ throw new IllegalArgumentException(); } EntityManager entityManager = getEntityManager(); Query q = getQuery(entityManager, FIND_ALL_ACTIVATED_ARTICLE_BY_DATES_NQ, queryBean); q.setParameter("beginDate", beginDate); q.setParameter("endDate", endDate); Object resultObj = q.getResultList(); List<Article> result = new java.util.ArrayList<Article>((List<Article>)resultObj); for(Article article: result){ article.setTags(getTags(article, entityManager)); article.setUser(getUser(article, entityManager)); article.setCommentCount(getArticleCommentsCount(article)); } entityManager.close(); return result; } catch(NoResultException noResultException){ return null; } catch(Throwable e){ throw new DAOException("Error getting Article beans: " + e.getMessage(), e); } } /* (non-Javadoc) * @see es.alvsanand.webpage.db.dao.cms.ArticleDAO#getActivatedArticlesByTag(es.alvsanand.webpage.model.Tag, es.alvsanand.webpage.db.QueryBean) */ public List<Article> getActivatedArticlesByTag(Tag tag, QueryBean queryBean) throws DAOException{ try{ if(tag==null || tag.getName()==null){ throw new IllegalArgumentException(); } EntityManager entityManager = getEntityManager(); Query q = getQuery(entityManager, FIND_ALL_ARTICLE_BY_TAG_NQ, null); q.setParameter("name", tag.getName()); Object resultObj = q.getResultList(); List<String> idArticles = new java.util.ArrayList<String>((List<String>)resultObj); if(idArticles==null || idArticles.size()==0){ return null; } StringBuffer sB = new StringBuffer(); sB.append("( "); for(int i=0; i<idArticles.size() && i<20; i++){ sB.append("'" + idArticles.get(i) + "'"); if(i+1<idArticles.size()){ sB.append(" ,"); } } sB.append(" )"); q = getQuery(entityManager, MessageFormat.format(FIND_ACTIVATED_ARTICLE_IN_LIST_NQ, new String[]{sB.toString()}), queryBean); resultObj = q.getResultList(); List<Article> result = new java.util.ArrayList<Article>((List<Article>)resultObj); for(Article article: result){ article.setTags(getTags(article, entityManager)); article.setUser(getUser(article, entityManager)); article.setCommentCount(getArticleCommentsCount(article)); } entityManager.close(); return result; } catch(NoResultException noResultException){ return null; } catch(Throwable e){ throw new DAOException("Error getting Article beans: " + e.getMessage(), e); } } public List<Article> searchArticles(String query) throws DAOException{ try{ if(query==null){ throw new IllegalArgumentException(); } List<Article> articles = new ArrayList<Article>(); CompassSearchSession compassSearchSession = DAOHelper.getCompass().openSearchSession(); CompassHits compassHits = compassSearchSession.find(query); for(int i=0; i<compassHits.length(); i++){ if(compassHits.data(i) instanceof Article && ((Article)compassHits.data(i)).getState()==ArticleState.ENABLED.ordinal()){ articles.add((Article)compassHits.data(i)); } } compassSearchSession.close(); EntityManager entityManager = getEntityManager(); for(Article article: articles){ article.setTags(getTags(article, entityManager)); article.setUser(getUser(article, entityManager)); article.setCommentCount(getArticleCommentsCount(article)); } entityManager.close(); return articles; } catch(NoResultException noResultException){ return null; } catch(Throwable e){ throw new DAOException("Error search Article beans: " + e.getMessage(), e); } } /* (non-Javadoc) * @see es.alvsanand.webpage.db.dao.cms.ArticleDAO#getArticle(es.alvsanand.webpage.model.Article) */ public Article getArticle(Article article) throws DAOException{ try{ if(article==null || article.getIdArticle()==null){ throw new IllegalArgumentException(); } EntityManager entityManager = getEntityManager(); Query q = getQuery(entityManager, FIND_ARTICLE_NQ, null); q.setParameter("idArticle", article.getIdArticle()); Object resultObj = q.getSingleResult(); Article articleDest = (Article)resultObj; if(articleDest!=null){ articleDest.setArticleVersions(getArticleVersions(articleDest, entityManager)); articleDest.setTags(getTags(articleDest, entityManager)); articleDest.setUser(getUser(articleDest, entityManager)); articleDest.setComments(getComments(articleDest, entityManager)); articleDest.setRatings(getRatings(articleDest, entityManager)); } entityManager.close(); return articleDest; } catch(NoResultException noResultException){ return null; } catch(Throwable e){ throw new DAOException("Error getting Article bean by Key: " + e.getMessage(), e); } } private Article getArticleWithoutDependencies(Article article) throws DAOException{ try{ if(article==null || article.getIdArticle()==null){ throw new IllegalArgumentException(); } EntityManager entityManager = getEntityManager(); Query q = getQuery(entityManager, FIND_ARTICLE_NQ, null); q.setParameter("idArticle", article.getIdArticle()); Object resultObj = q.getSingleResult(); Article articleDest = (Article)resultObj; entityManager.close(); return articleDest; } catch(NoResultException noResultException){ return null; } catch(Throwable e){ throw new DAOException("Error getting Article bean by Key: " + e.getMessage(), e); } } public ArticleVersion getArticleVersion(ArticleVersion articleVersion) throws DAOException{ try{ if(articleVersion==null || articleVersion.getIdArticleVersion()==null){ throw new IllegalArgumentException(); } EntityManager entityManager = getEntityManager(); Query q = getQuery(entityManager, FIND_ARTICLE_VERSION_NQ, null); q.setParameter("idArticleVersion", articleVersion.getIdArticleVersion()); Object resultObj = q.getSingleResult(); ArticleVersion articleVersionDest = (ArticleVersion)resultObj; entityManager.close(); return articleVersionDest; } catch(NoResultException noResultException){ return null; } catch(Throwable e){ throw new DAOException("Error getting Article bean by Key: " + e.getMessage(), e); } } public Article getArticleWithLastArticleVersion(Article article) throws DAOException{ try{ if(article==null || article.getIdArticle()==null){ throw new IllegalArgumentException(); } EntityManager entityManager = getEntityManager(); Query q = getQuery(entityManager, FIND_ARTICLE_NQ, null); q.setParameter("idArticle", article.getIdArticle()); Object resultObj = q.getSingleResult(); Article articleDest = (Article)resultObj; if(articleDest!=null){ articleDest.setArticleVersions(getLastArticleVersion(articleDest, entityManager)); } entityManager.close(); return articleDest; } catch(NoResultException noResultException){ return null; } catch(Throwable e){ throw new DAOException("Error getting Article bean by Key: " + e.getMessage(), e); } } private List<ArticleVersion> getLastArticleVersion(Article article, EntityManager entityManager) throws DAOException{ try{ if(article==null || article.getIdArticle()==null){ throw new IllegalArgumentException(); } Query q = getQuery(entityManager, FIND_ARTICLE_VERSIONS_ARTICLE_NQ, null); q.setParameter("idArticle", article.getIdArticle()); q.setMaxResults(1); q.setFirstResult(0); Object resultObj = q.getResultList(); List<ArticleVersion> result = new java.util.ArrayList<ArticleVersion>((List<ArticleVersion>)resultObj); return result; } catch(NoResultException noResultException){ return null; } catch(Throwable e){ throw new DAOException("Error getting User bean by Key: " + e.getMessage(), e); } } private List<ArticleVersion> getArticleVersions(Article article, EntityManager entityManager) throws DAOException{ try{ if(article==null || article.getIdArticle()==null){ throw new IllegalArgumentException(); } Query q = getQuery(entityManager, FIND_ARTICLE_VERSIONS_ARTICLE_NQ, null); q.setParameter("idArticle", article.getIdArticle()); Object resultObj = q.getResultList(); List<ArticleVersion> result = new java.util.ArrayList<ArticleVersion>((List<ArticleVersion>)resultObj); return result; } catch(NoResultException noResultException){ return null; } catch(Throwable e){ throw new DAOException("Error getting User bean by Key: " + e.getMessage(), e); } } private List<Tag> getTags(Article article, EntityManager entityManager) throws DAOException{ try{ if(article==null || article.getIdArticle()==null){ throw new IllegalArgumentException(); } Query q = getQuery(entityManager, FIND_TAGS_ARTICLE_NQ, null); q.setParameter("idArticle", article.getIdArticle()); Object resultObj = q.getResultList(); List<Tag> result = new java.util.ArrayList<Tag>((List<Tag>)resultObj); return result; } catch(NoResultException noResultException){ return null; } catch(Throwable e){ throw new DAOException("Error getting User bean by Key: " + e.getMessage(), e); } } private List<Comment> getComments(Article article, EntityManager entityManager) throws DAOException{ try{ if(article==null || article.getIdArticle()==null){ throw new IllegalArgumentException(); } Query q = getQuery(entityManager, FIND_COMMENTS_ARTICLE_NQ, null); q.setParameter("idArticle", article.getIdArticle()); Object resultObj = q.getResultList(); List<Comment> result = new java.util.ArrayList<Comment>((List<Comment>)resultObj); for(Comment comment: result){ comment.setUser(getUser(comment, entityManager)); } return result; } catch(NoResultException noResultException){ return null; } catch(Throwable e){ throw new DAOException("Error getting User bean by Key: " + e.getMessage(), e); } } private List<Rating> getRatings(Article article, EntityManager entityManager) throws DAOException{ try{ if(article==null || article.getIdArticle()==null){ throw new IllegalArgumentException(); } Query q = getQuery(entityManager, FIND_RATINGS_ARTICLE_NQ, null); q.setParameter("idArticle", article.getIdArticle()); Object resultObj = q.getResultList(); List<Rating> result = new java.util.ArrayList<Rating>((List<Rating>)resultObj); return result; } catch(NoResultException noResultException){ return null; } catch(Throwable e){ throw new DAOException("Error getting User bean by Key: " + e.getMessage(), e); } } private List<Comment> getLastComment(Article article, EntityManager entityManager) throws DAOException{ try{ if(article==null || article.getIdArticle()==null){ throw new IllegalArgumentException(); } Query q = getQuery(entityManager, FIND_COMMENTS_ARTICLE_NQ, null); q.setParameter("idArticle", article.getIdArticle()); q.setMaxResults(1); q.setFirstResult(0); Object resultObj = q.getResultList(); List<Comment> result = new java.util.ArrayList<Comment>((List<Comment>)resultObj); return result; } catch(NoResultException noResultException){ return null; } catch(Throwable e){ throw new DAOException("Error getting User bean by Key: " + e.getMessage(), e); } } private User getUser(Article article, EntityManager entityManager) throws DAOException{ try{ if(article==null){ throw new IllegalArgumentException(); } if(article.getUser()==null || article.getUser().getIdUser()==null){ return null; } Query q = getQuery(entityManager, FIND_USER_ARTICLE_NQ, null); q.setParameter("idUser", article.getUser().getIdUser()); Object resultObj = q.getSingleResult(); return (User)resultObj; } catch(NoResultException noResultException){ return null; } catch(Throwable e){ throw new DAOException("Error getting User bean by Key: " + e.getMessage(), e); } } private User getUser(Comment comment, EntityManager entityManager) throws DAOException{ try{ if(comment==null || comment.getUser()==null || comment.getUser().getIdUser()==null){ throw new IllegalArgumentException(); } Query q = getQuery(entityManager, FIND_USER_ARTICLE_NQ, null); q.setParameter("idUser", comment.getUser().getIdUser()); Object resultObj = q.getSingleResult(); return (User)resultObj; } catch(NoResultException noResultException){ return null; } catch(Throwable e){ throw new DAOException("Error getting User bean by Key: " + e.getMessage(), e); } } /* (non-Javadoc) * @see es.alvsanand.webpage.db.dao.cms.ArticleDAO#getArticleCount() */ public int getArticleCount() throws DAOException{ try{ EntityManager entityManager = getEntityManager(); Query q = getQuery(entityManager, COUNT_ARTICLE_NQ, null); Object resultObj = q.getSingleResult(); entityManager.close(); return ((Integer)resultObj).intValue(); } catch(NoResultException noResultException){ return 0; } catch(Throwable e){ throw new DAOException("Error getting count of Article beans: " + e.getMessage(), e); } } public int getActivatedArticleCount() throws DAOException{ try{ EntityManager entityManager = getEntityManager(); Query q = getQuery(entityManager, COUNT_ACTIVATED_ARTICLE_NQ, null); Object resultObj = q.getSingleResult(); entityManager.close(); return ((Integer)resultObj).intValue(); } catch(NoResultException noResultException){ return 0; } catch(Throwable e){ throw new DAOException("Error getting count of activated Article beans: " + e.getMessage(), e); } } /* (non-Javadoc) * @see es.alvsanand.webpage.db.dao.cms.ArticleDAO#getArticleCountByName(java.lang.String) */ public int getArticleCountByName(String name) throws DAOException{ try{ if(name==null){ throw new IllegalArgumentException(); } EntityManager entityManager = getEntityManager(); Query q = getQuery(entityManager, COUNT_ARTICLE_BYNAME_NQ, null); q.setParameter("name", name); Object resultObj = q.getSingleResult(); entityManager.close(); return ((Integer)resultObj).intValue(); } catch(NoResultException noResultException){ return 0; } catch(Throwable e){ throw new DAOException("Error getting count of Article beans by name: " + e.getMessage(), e); } } private int getArticleCommentsCount(Article article) throws DAOException{ try{ if(article==null || article.getIdArticle()==null){ throw new IllegalArgumentException(); } EntityManager entityManager = getEntityManager(); Query q = getQuery(entityManager, COUNT_ARTICLE_COMMENTS_NQ, null); q.setParameter("idArticle", article.getIdArticle()); Object resultObj = q.getSingleResult(); entityManager.close(); return ((Integer)resultObj).intValue(); } catch(NoResultException noResultException){ return 0; } catch(Throwable e){ throw new DAOException("Error getting count of Article comments beans by idArticle: " + e.getMessage(), e); } } /* (non-Javadoc) * @see es.alvsanand.webpage.db.dao.cms.ArticleDAO#getArticlesByName(java.lang.String) */ public List<Article> getArticlesByName(String name) throws DAOException{ try{ if(name==null){ throw new IllegalArgumentException(); } EntityManager entityManager = getEntityManager(); Query q = getQuery(entityManager, FIND_ALL_BYNAME_ARTICLE_NQ, null); q.setParameter("name", name); Object resultObj = q.getResultList(); List<Article> result = new java.util.ArrayList<Article>((List<Article>)resultObj); entityManager.close(); return result; } catch(NoResultException noResultException){ return null; } catch(Throwable e){ throw new DAOException("Error getting Article bean by name: " + e.getMessage(), e); } } /* (non-Javadoc) * @see es.alvsanand.webpage.db.dao.cms.ArticleDAO#getArticleByName(es.alvsanand.webpage.model.Article) */ public Article getArticleByName(Article article) throws DAOException{ try{ if(article==null || article.getName()==null){ throw new IllegalArgumentException(); } EntityManager entityManager = getEntityManager(); Query q = getQuery(entityManager, FIND_ALL_BYNAME_ARTICLE_NQ, null); q.setParameter("name", article.getName()); Object resultObj = q.getSingleResult(); Article articleDest = (Article)resultObj; if(articleDest!=null){ articleDest.setArticleVersions(getArticleVersions(articleDest, entityManager)); articleDest.setTags(getTags(articleDest, entityManager)); articleDest.setUser(getUser(articleDest, entityManager)); articleDest.setComments(getComments(articleDest, entityManager)); articleDest.setRatings(getRatings(articleDest, entityManager)); } entityManager.close(); return articleDest; } catch(NoResultException noResultException){ return null; } catch(Throwable e){ throw new DAOException("Error getting Article bean by name: " + e.getMessage(), e); } } /* (non-Javadoc) * @see es.alvsanand.webpage.db.dao.cms.ArticleDAO#deleteArticle(es.alvsanand.webpage.model.Article) */ public void deleteArticle(Article article) throws DAOException { if(article!=null && article.getIdArticle()!=null){ EntityManager entityManager = getEntityManager(); try{ //Deleting dependencies Query q = getQuery(entityManager, DELETE_ARTICLEVERSIONS_ARTICLE_NQ, null); q.setParameter("idArticle", article.getIdArticle()); q.executeUpdate(); q = getQuery(entityManager, DELETE_TAGS_ARTICLE_NQ, null); q.setParameter("idArticle", article.getIdArticle()); q.executeUpdate(); q = getQuery(entityManager, DELETE_COMMENTS_ARTICLE_NQ, null); q.setParameter("idArticle", article.getIdArticle()); q.executeUpdate(); q = getQuery(entityManager, DELETE_RATING_ARTICLE_NQ, null); q.setParameter("idArticle", article.getIdArticle()); q.executeUpdate(); //Deleting Article q = getQuery(entityManager, DELETE_ARTICLE_NQ, null); q.setParameter("idArticle", article.getIdArticle()); q.executeUpdate(); } catch(Throwable e){ throw new DAOException("Error deleting Article bean: " + e.getMessage(), e); } finally{ entityManager.close(); } } else{ throw new DAOException("Error deleting Article bean: the article is null or empty"); } } /* (non-Javadoc) * @see es.alvsanand.webpage.db.dao.cms.ArticleDAO#saveOrUpdateArticle(es.alvsanand.webpage.model.Article) */ public void saveOrUpdateArticle(Article article) throws DAOException { if(article!=null){ EntityManager entityManager = getEntityManager(); boolean articleSaved = false; try{ article = entityManager.merge(article); entityManager.persist(article); articleSaved = true; //Saving or updating dependencies if(article.getArticleVersions()!=null){ List<ArticleVersion> articleVersions = getLastArticleVersion(article, entityManager); int lastNumberversion = 0; if(articleVersions!=null && articleVersions.size()>0){ lastNumberversion = articleVersions.get(0).getNumberversion(); } int numberversion = lastNumberversion + 1; for(ArticleVersion articleVersion: article.getArticleVersions()){ articleVersion.setArticle(article); articleVersion.setNumberversion(numberversion); articleVersion = entityManager.merge(articleVersion); entityManager.persist(articleVersion); numberversion++; } } if(article.getTags()!=null){ Query q = getQuery(entityManager, DELETE_TAGS_ARTICLE_NQ, null); q.setParameter("idArticle", article.getIdArticle()); q.executeUpdate(); for(Tag tag: article.getTags()){ tag.setArticle(article); tag = entityManager.merge(tag); entityManager.persist(tag); } } if(article.getComments()!=null){ Query q = getQuery(entityManager, DELETE_COMMENTS_ARTICLE_NQ, null); q.setParameter("idArticle", article.getIdArticle()); q.executeUpdate(); for(Comment comment: article.getComments()){ comment.setArticle(article); comment = entityManager.merge(comment); entityManager.persist(comment); } } if(article.getRatings()!=null){ Query q = getQuery(entityManager, DELETE_RATING_ARTICLE_NQ, null); q.setParameter("idArticle", article.getIdArticle()); q.executeUpdate(); for(Rating rating: article.getRatings()){ rating.setArticle(article); rating = entityManager.merge(rating); entityManager.persist(rating); } } } catch(Throwable e){ if(articleSaved){ deleteArticle(article); } throw new DAOException("Error saving or updating Article bean: " + e.getMessage(), e); } finally{ entityManager.close(); } } else{ throw new DAOException("Error saving or updating Article bean: the article is null or empty"); } } /* (non-Javadoc) * @see es.alvsanand.webpage.db.dao.cms.ArticleDAO#saveOrUpdateArticles(java.util.List) */ public void saveOrUpdateArticles(List<Article> articleList) throws DAOException { //Transactions are not permitted for multiple saves if(articleList!=null){ for(Article article: articleList){ saveOrUpdateArticle(article); } } else{ throw new DAOException("Error saving or updating Article bean: the article is null or empty"); } } /* (non-Javadoc) * @see es.alvsanand.webpage.db.dao.cms.ArticleDAO#deleteArticle(es.alvsanand.webpage.model.Article) */ public void deleteComment(Comment comment) throws DAOException { if(comment!=null && comment.getIdComment()!=null){ EntityManager entityManager = getEntityManager(); try{ Query q = getQuery(entityManager, DELETE_COMMENT_NQ, null); q.setParameter("idComment", comment.getIdComment()); q.executeUpdate(); } catch(Throwable e){ throw new DAOException("Error deleting Comment bean: " + e.getMessage(), e); } finally{ entityManager.close(); } } else{ throw new DAOException("Error deleting Comment bean: the comment is null or empty"); } } /* (non-Javadoc) * @see es.alvsanand.webpage.db.dao.cms.ArticleDAO#saveOrUpdateComment(es.alvsanand.webpage.model.Comment) */ public void saveOrUpdateComment(Comment comment) throws DAOException { if(comment!=null && comment.getIdUser()!=null && comment.getIdArticle()!=null){ EntityManager entityManager = getEntityManager(); boolean commentSaved = false; try{ List<Comment> comments = getLastComment(new Article(comment.getIdArticle()), entityManager); int lastCommentNumber = 0; if(comments!=null && comments.size()>0){ lastCommentNumber = comments.get(0).getCommentNumber(); } int commentNumber = lastCommentNumber + 1; comment.setCommentNumber(commentNumber); comment = entityManager.merge(comment); entityManager.persist(comment); } catch(Throwable e){ if(commentSaved){ deleteComment(comment); } throw new DAOException("Error saving or updating Comment bean: " + e.getMessage(), e); } finally{ entityManager.close(); } } else{ throw new DAOException("Error saving or updating Comment bean: the comment is null or empty"); } } /* (non-Javadoc) * @see es.alvsanand.webpage.db.dao.cms.ArticleDAO#saveOrUpdateRating(es.alvsanand.webpage.model.Rating) */ public void saveOrUpdateRating(Rating rating) throws DAOException { if(rating!=null && rating.getIdUser()!=null && rating.getIdArticle()!=null){ EntityManager entityManager = getEntityManager(); try{ rating = entityManager.merge(rating); entityManager.persist(rating); } catch(Throwable e){ throw new DAOException("Error saving or updating Rating bean: " + e.getMessage(), e); } finally{ entityManager.close(); } } else{ throw new DAOException("Error saving or updating Rating bean: the rating is null or empty"); } } }