/*
* 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.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;
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.Tag;
/**
* Implementation of the <code>es.alvsanand.webpage.db.dao.cms.TagDAO</code>
*
* @author alvaro.santos
* @date 28/07/2010
*
*/
public class TagDAOImpl extends DAOHelper implements TagDAO{
/**
* Name of the query for delete an tag
*/
private final static String DELETE_TAG_NQ = "DELETE from Tag tag WHERE tag.idTag = :idTag";
/**
* Name of the query for delete an tag with the same name
*/
private final static String DELETE_TAG_WITH_SAME_NAME_NQ = "DELETE from Tag tag WHERE tag.name = :name";
/**
* Name of the query for obtaining an tag by idTag
*/
private final static String FIND_TAG_NQ = "SELECT tag FROM Tag tag WHERE tag.idTag = :idTag";
/**
* Name of the query for obtaining an tag with same name
*/
private final static String FIND_TAG_WITH_SAME_NAME_NQ = "SELECT tag.name, tag.description FROM Tag tag WHERE tag.name = :name and tag.asociated = false";
/**
* Name of the query for selecting all tags
*/
private final static String FIND_ALL_TAG_NQ = "SELECT tag FROM Tag tag";
/**
* Name of the query for selecting all tags with the same name
*/
private final static String FIND_ALL_TAG_WITH_SAME_NAME_NQ = "SELECT tag.name, tag.description FROM Tag tag WHERE tag.asociated = false";
/**
* Name of the query for selecting all tags by the name
*/
private final static String FIND_ALL_BYNAME_TAG_NQ = "SELECT tag FROM Tag tag WHERE tag.name = :name";
/**
* Name of the query for obtaining the count of tags
*/
private final static String COUNT_TAG_NQ = "SELECT count(tag) FROM Tag tag";
/**
* Name of the query for obtaining the count of tags with the same name
*/
private final static String COUNT_TAG_WITH_SAME_NAME_NQ = "SELECT count(tag) FROM Tag tag WHERE tag.asociated = false";
/**
* Name of the query for obtaining the count of tags by the name
*/
private final static String COUNT_TAG_BYNAME_NQ = "SELECT count(tag) FROM Tag tag WHERE tag.name = :name";
/**
* Name of the query for obtaining the count of tags sorted by name
*/
private final static String COUNT_TAG_SORTED_BYNAME_NQ = "SELECT tag.name, tag.description FROM Tag tag WHERE tag.asociated = true";
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.cms.TagDAO#getTags(es.alvsanand.webpage.db.QueryBean)
*/
public List<Tag> getTags(QueryBean queryBean) throws DAOException{
try{
EntityManager entityManager = getEntityManager();
Query q = getQuery(entityManager, FIND_ALL_TAG_NQ, queryBean);
Object resultObj = q.getResultList();
List<Tag> result = new java.util.ArrayList<Tag>((List<Tag>)resultObj);
entityManager.close();
return result;
}
catch(NoResultException noResultException){
return null;
}
catch(Throwable e){
throw new DAOException("Error getting Tag beans: " + e.getMessage(), e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.cms.TagDAO#getTagsWithSameName(es.alvsanand.webpage.db.QueryBean)
*/
public List<Tag> getTagsWithSameName(QueryBean queryBean) throws DAOException{
try{
EntityManager entityManager = getEntityManager();
Query q = getQuery(entityManager, FIND_ALL_TAG_WITH_SAME_NAME_NQ, queryBean);
List resultObj = q.getResultList();
List<Tag> result = new java.util.ArrayList<Tag>();
for (int i=0; resultObj!=null && i<resultObj.size(); i++) {
Object[] objectTag = (Object[])resultObj.get(i);
if(objectTag!=null && objectTag.length==2)
result.add(new Tag((String)objectTag[0], (String)objectTag[1]));
}
entityManager.close();
return result;
}
catch(NoResultException noResultException){
return null;
}
catch(Throwable e){
throw new DAOException("Error getting Tag beans with same name: " + e.getMessage(), e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.cms.TagDAO#getTag(es.alvsanand.webpage.model.Tag)
*/
public Tag getTag(Tag tag) throws DAOException{
try{
if(tag==null || tag.getIdTag()==null){
throw new IllegalArgumentException();
}
EntityManager entityManager = getEntityManager();
Query q = getQuery(entityManager, FIND_TAG_NQ, null);
q.setParameter("idTag", tag.getIdTag());
Object resultObj = q.getSingleResult();
entityManager.close();
return (resultObj!=null)?(Tag)resultObj:null;
}
catch(NoResultException noResultException){
return null;
}
catch(Throwable e){
throw new DAOException("Error getting Tag bean by Key: " + e.getMessage(), e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.cms.TagDAO#getTagWithSameName(es.alvsanand.webpage.model.Tag)
*/
public Tag getTagWithSameName(Tag tag) throws DAOException{
try{
if(tag==null || tag.getName()==null){
throw new IllegalArgumentException();
}
EntityManager entityManager = getEntityManager();
Query q = getQuery(entityManager, FIND_TAG_WITH_SAME_NAME_NQ, null);
q.setParameter("name", tag.getName());
Object[] resultObj = (Object[])q.getSingleResult();
entityManager.close();
return (resultObj!=null && resultObj.length==2)?(new Tag((String)resultObj[0], (String)resultObj[1])):null;
}
catch(NoResultException noResultException){
return null;
}
catch(Throwable e){
throw new DAOException("Error getting Tag bean with same name: " + e.getMessage(), e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.cms.TagDAO#getTagCount()
*/
public int getTagCount() throws DAOException{
try{
EntityManager entityManager = getEntityManager();
Query q = getQuery(entityManager, COUNT_TAG_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 Tag beans: " + e.getMessage(), e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.cms.TagDAO#getTagCountByName(java.lang.String)
*/
public int getTagCountByName(String name) throws DAOException{
try{
if(name==null){
throw new IllegalArgumentException();
}
EntityManager entityManager = getEntityManager();
Query q = getQuery(entityManager, COUNT_TAG_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 Tag beans by the name: " + e.getMessage(), e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.cms.TagDAO#getTagCountWithSameName()
*/
public int getTagCountWithSameName() throws DAOException{
try{
EntityManager entityManager = getEntityManager();
Query q = getQuery(entityManager, COUNT_TAG_WITH_SAME_NAME_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 Tag beans by the name: " + e.getMessage(), e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.cms.TagDAO#getTagCountSortedByName()
*/
public Map<Tag, Integer> getTagCountSortedByName() throws DAOException{
try{
EntityManager entityManager = getEntityManager();
Query q = getQuery(entityManager, COUNT_TAG_SORTED_BYNAME_NQ, null);
Object resultObj = q.getResultList();
Map<Tag, Integer> map = new HashMap<Tag, Integer>();
Iterator<Object[]> iterator = ((AbstractQueryResult)resultObj).iterator();
while(iterator.hasNext())
{
Object[] entries = iterator.next();
Tag tag = new Tag();
tag.setName((String)entries[0]);
tag.setDescription((String)entries[1]);
int counter = (map.get(tag)!=null)?map.get(tag).intValue():0;
map.put(tag, new Integer(counter+1));
}
entityManager.close();
return map;
}
catch(NoResultException noResultException){
return null;
}
catch(Throwable e){
throw new DAOException("Error getting count of Tag beans: " + e.getMessage(), e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.cms.TagDAO#getTagsByName(java.lang.String)
*/
public List<Tag> getTagsByName(String name) throws DAOException{
try{
if(name==null){
throw new IllegalArgumentException();
}
EntityManager entityManager = getEntityManager();
Query q = getQuery(entityManager, FIND_ALL_BYNAME_TAG_NQ, null);
q.setParameter("name", name);
Object resultObj = q.getResultList();
List<Tag> result = new java.util.ArrayList<Tag>((List<Tag>)resultObj);
entityManager.close();
return result;
}
catch(NoResultException noResultException){
return null;
}
catch(Throwable e){
throw new DAOException("Error getting Tag bean by name: " + e.getMessage(), e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.cms.TagDAO#deleteTag(es.alvsanand.webpage.model.Tag)
*/
public void deleteTag(Tag tag) throws DAOException {
if(tag!=null && tag.getIdTag()!=null){
EntityManager entityManager = getEntityManager();
try{
//Deleting Tag
Query q = getQuery(entityManager, DELETE_TAG_NQ, null);
q.setParameter("idTag", tag.getIdTag());
q.executeUpdate();
}
catch(Throwable e){
throw new DAOException("Error deleting Tag bean: " + e.getMessage(), e);
}
finally{
entityManager.close();
}
}
else{
throw new DAOException("Error deleting Tag bean: the tag is null or empty");
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.cms.TagDAO#deleteTagWithSameName(es.alvsanand.webpage.model.Tag)
*/
public void deleteTagWithSameName(Tag tag) throws DAOException {
if(tag!=null && tag.getName()!=null){
EntityManager entityManager = getEntityManager();
try{
//Deleting Tag
Query q = getQuery(entityManager, DELETE_TAG_WITH_SAME_NAME_NQ, null);
q.setParameter("name", tag.getName());
q.executeUpdate();
}
catch(Throwable e){
throw new DAOException("Error deleting Tag bean with same name: " + e.getMessage(), e);
}
finally{
entityManager.close();
}
}
else{
throw new DAOException("Error deleting Tag bean with same name: the tag is null or empty");
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.cms.TagDAO#saveOrUpdateTag(es.alvsanand.webpage.model.Tag)
*/
public void saveOrUpdateTag(Tag tag) throws DAOException {
if(tag!=null){
EntityManager entityManager = getEntityManager();
try{
tag = entityManager.merge(tag);
entityManager.persist(tag);
}
catch(Throwable e){
throw new DAOException("Error saving or updating Tag bean: " + e.getMessage(), e);
}
finally{
entityManager.close();
}
}
else{
throw new DAOException("Error saving or updating Tag bean: the tag is null or empty");
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.db.dao.cms.TagDAO#saveOrUpdateTagWithSameName(es.alvsanand.webpage.model.Tag)
*/
public void saveOrUpdateTagWithSameName(Tag tag) throws DAOException {
if(tag!=null && tag.getName()!=null){
EntityManager entityManager = getEntityManager();
try{
List<Tag> tagList = getTagsByName(tag.getName());
if(tagList==null || tagList.size()==0){
tag = entityManager.merge(tag);
entityManager.persist(tag);
}
else{
for (Tag tag2 : tagList) {
tag2 = entityManager.merge(tag2);
tag2.setDescription(tag.getDescription());
tag2 = entityManager.merge(tag2);
entityManager.persist(tag2);
}
}
}
catch(Throwable e){
throw new DAOException("Error saving or updating Tag bean with same name: " + e.getMessage(), e);
}
finally{
entityManager.close();
}
}
else{
throw new DAOException("Error saving or updating Tag bean with same name: the tag is null or empty");
}
}
}