/*
* 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.services.admin;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.cache.Cache;
import javax.cache.CacheException;
import javax.cache.CacheFactory;
import javax.cache.CacheManager;
import es.alvsanand.webpage.common.Globals;
import es.alvsanand.webpage.common.Logger;
import es.alvsanand.webpage.db.QueryBean;
import es.alvsanand.webpage.db.dao.DAOException;
import es.alvsanand.webpage.db.dao.cms.ArticleDAO;
import es.alvsanand.webpage.db.dao.cms.ArticleDAOImpl;
import es.alvsanand.webpage.db.dao.cms.TagDAO;
import es.alvsanand.webpage.db.dao.cms.TagDAOImpl;
import es.alvsanand.webpage.model.Article;
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.services.ServiceException;
/**
* This class implements the service Tag
*
* @author alvaro.santos
* @date 18/11/2009
*
*/
public class CmsAdminServiceImpl implements CmsAdminService{
private final static Logger logger = new Logger(CmsAdminServiceImpl.class);
private TagDAO tagDAO = new TagDAOImpl();
private ArticleDAO articleDAO = new ArticleDAOImpl();
/* (non-Javadoc)
* @see es.alvsanand.webpage.services.admin.CmsAdminService#saveOrUpdateTag(es.alvsanand.webpage.model.Tag)
*/
public void saveOrUpdateTag(Tag tag) throws ServiceException{
try {
logger.debug("Saving tag[" + ((tag!=null)?tag:"") + "]");
tagDAO.saveOrUpdateTagWithSameName(tag);
} catch (DAOException e) {
logger.error("Error saving tag",e);
throw new ServiceException(e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.services.admin.CmsAdminService#getTag(es.alvsanand.webpage.model.Tag)
*/
public Tag getTag(Tag tag) throws ServiceException{
try {
logger.debug("Getting tag[" + ((tag!=null)?tag:"") + "]");
return tagDAO.getTagWithSameName(tag);
} catch (DAOException e) {
logger.error("Error getting tag",e);
throw new ServiceException(e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.services.admin.CmsAdminService#getTagCount(java.lang.String)
*/
public int getTagCount(String name) throws ServiceException{
try {
logger.debug("Getting count of tag[" + ((name!=null)?name:"") + "]");
return tagDAO.getTagCountByName(name);
} catch (DAOException e) {
logger.error("Error count of tag",e);
throw new ServiceException(e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.services.admin.CmsAdminService#getTagCount()
*/
public int getTagCount() throws ServiceException{
try {
logger.debug("Getting count of tag");
return tagDAO.getTagCountWithSameName();
} catch (DAOException e) {
logger.error("Error count of tag",e);
throw new ServiceException(e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.services.admin.CmsAdminService#deleteTag(es.alvsanand.webpage.model.Tag)
*/
public void deleteTag(Tag tag) throws ServiceException{
try {
logger.debug("Deleting tag[" + ((tag!=null)?tag:"") + "]");
tagDAO.deleteTagWithSameName(tag);
removeActivatedArticlesFromCache();
} catch (DAOException e) {
logger.error("Error deleting tag",e);
throw new ServiceException(e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.services.admin.CmsAdminService#getTags(es.alvsanand.webpage.db.QueryBean)
*/
public List<Tag> getTags(QueryBean queryBean) throws ServiceException{
try {
logger.debug("Getting tags[" + ((queryBean!=null)?queryBean:"") + "]");
return tagDAO.getTagsWithSameName(queryBean);
} catch (DAOException e) {
logger.error("Error getting tags",e);
throw new ServiceException(e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.services.admin.CmsAdminService#saveOrUpdateArticle(es.alvsanand.webpage.model.Article)
*/
public void saveOrUpdateArticle(Article article) throws ServiceException{
try {
logger.debug("Saving article[" + ((article!=null)?article:"") + "]");
articleDAO.saveOrUpdateArticle(article);
removeActivatedArticlesFromCache();
} catch (DAOException e) {
logger.error("Error saving article",e);
throw new ServiceException(e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.services.admin.CmsAdminService#saveOrUpdateArticles(java.util.List)
*/
public void saveOrUpdateArticles(List<Article> articleList) throws ServiceException{
try {
logger.debug("Saving state articles[" + ((articleList!=null)?articleList:"") + "]");
articleDAO.saveOrUpdateArticles(articleList);
removeActivatedArticlesFromCache();
} catch (DAOException e) {
logger.error("Error saving state articles",e);
throw new ServiceException(e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.services.admin.CmsAdminService#getArticle(es.alvsanand.webpage.model.Article)
*/
public Article getArticle(Article article) throws ServiceException{
try {
logger.debug("Getting article[" + ((article!=null)?article:"") + "]");
return articleDAO.getArticle(article);
} catch (DAOException e) {
logger.error("Error getting article",e);
throw new ServiceException(e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.services.admin.CmsAdminService#getArticleVersion(es.alvsanand.webpage.model.ArticleVersion)
*/
public ArticleVersion getArticleVersion(ArticleVersion articleVersion) throws ServiceException{
try {
logger.debug("Getting articleVersion[" + ((articleVersion!=null)?articleVersion:"") + "]");
return articleDAO.getArticleVersion(articleVersion);
} catch (DAOException e) {
logger.error("Error getting articleVersion",e);
throw new ServiceException(e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.services.admin.CmsAdminService#getArticleCount(java.lang.String)
*/
public int getArticleCount(String name) throws ServiceException{
try {
logger.debug("Getting count of article[" + ((name!=null)?name:"") + "]");
return articleDAO.getArticleCountByName(name);
} catch (DAOException e) {
logger.error("Error count of article",e);
throw new ServiceException(e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.services.admin.CmsAdminService#getArticleCount()
*/
public int getArticleCount() throws ServiceException{
try {
logger.debug("Getting count of article");
return articleDAO.getArticleCount();
} catch (DAOException e) {
logger.error("Error count of article",e);
throw new ServiceException(e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.services.admin.CmsAdminService#deleteArticle(es.alvsanand.webpage.model.Article)
*/
public void deleteArticle(Article article) throws ServiceException{
try {
logger.debug("Deleting article[" + ((article!=null)?article:"") + "]");
articleDAO.deleteArticle(article);
removeActivatedArticlesFromCache();
} catch (DAOException e) {
logger.error("Error deleting article",e);
throw new ServiceException(e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.services.admin.CmsAdminService#getArticles(es.alvsanand.webpage.db.QueryBean)
*/
public List<Article> getArticles(QueryBean queryBean) throws ServiceException{
try {
logger.debug("Getting articles[" + ((queryBean!=null)?queryBean:"") + "]");
return articleDAO.getArticles(queryBean);
} catch (DAOException e) {
logger.error("Error getting articles",e);
throw new ServiceException(e);
}
}
private void removeActivatedArticleFromCache(Article article){
Cache cache;
try {
logger.debug("Removing activated article from cache.");
CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory();
cache = cacheFactory.createCache(Collections.emptyMap());
{
Map<Integer,List<Article>> articlesMap = (Map<Integer,List<Article>>)cache.get(Globals.ACTIVATED_ARTICLES_CACHE_NAME);
if(articlesMap!=null){
List<Integer> offsetToDelete = new ArrayList<Integer>();
for(Integer offset: articlesMap.keySet()){
List<Article> articles = articlesMap.get(offset);
if(articles!=null){
for(Article _article: articles){
if(article.getIdArticle().equals(_article.getIdArticle())){
offsetToDelete.add(offset);
break;
}
}
}
}
for(Integer offset: offsetToDelete){
articlesMap.remove(offset);
}
cache.put(Globals.ACTIVATED_ARTICLES_CACHE_NAME, articlesMap);
}
}
{
Map<String,List<Article>> articlesMap = (Map<String,List<Article>>)cache.get(Globals.ACTIVATED_ARTICLES_BY_TAG_CACHE_NAME);
if(articlesMap!=null){
List<String> tagNamesToDelete = new ArrayList<String>();
for(String tagName: articlesMap.keySet()){
List<Article> articles = articlesMap.get(tagName);
if(articles!=null){
for(Article _article: articles){
if(article.getIdArticle().equals(_article.getIdArticle())){
tagNamesToDelete.add(tagName);
break;
}
}
}
}
for(String tagName: tagNamesToDelete){
articlesMap.remove(tagName);
}
cache.put(Globals.ACTIVATED_ARTICLES_BY_TAG_CACHE_NAME, articlesMap);
}
}
{
Map<String, Article> articlesMap = (Map<String, Article>)cache.get(Globals.ACTIVATED_ARTICLES_BY_ID_CACHE_NAME);
if(articlesMap!=null){
articlesMap = new HashMap<String, Article>();
articlesMap.remove(article.getIdArticle());
cache.put(Globals.ACTIVATED_ARTICLES_BY_ID_CACHE_NAME, articlesMap);
}
}
} catch (CacheException cacheException) {
logger.error("Error removing activated articles from cache.",cacheException);
}
}
private void removeActivatedArticlesFromCache(){
Cache cache;
try {
logger.debug("Removing activated articles from cache.");
CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory();
cache = cacheFactory.createCache(Collections.emptyMap());
for (String cacheName : Globals.ARTICLE_CAHE_NAMES) {
cache.remove(cacheName);
}
} catch (CacheException cacheException) {
logger.error("Error removing activated articles from cache.",cacheException);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.services.admin.CmsAdminService#saveOrUpdateComment(es.alvsanand.webpage.model.Comment)
*/
public void saveOrUpdateComment(Comment comment) throws ServiceException{
try {
logger.debug("Saving comment[" + ((comment!=null)?comment:"") + "]");
articleDAO.saveOrUpdateComment(comment);
removeActivatedArticleFromCache(comment.getArticle());
} catch (DAOException e) {
logger.error("Error saving comment",e);
throw new ServiceException(e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.services.admin.CmsAdminService#deleteComment(es.alvsanand.webpage.model.Comment)
*/
public void deleteComment(Comment comment) throws ServiceException{
try {
logger.debug("Deleting comment[" + ((comment!=null)?comment:"") + "]");
articleDAO.deleteComment(comment);
removeActivatedArticleFromCache(comment.getArticle());
} catch (DAOException e) {
logger.error("Error deleting comment",e);
throw new ServiceException(e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.services.admin.CmsAdminService#saveOrUpdateRating(es.alvsanand.webpage.model.Rating)
*/
public void saveOrUpdateRating(Rating rating) throws ServiceException{
try {
logger.debug("Saving rating[" + ((rating!=null)?rating:"") + "]");
articleDAO.saveOrUpdateRating(rating);
removeActivatedArticleFromCache(rating.getArticle());
} catch (DAOException e) {
logger.error("Error saving rating",e);
throw new ServiceException(e);
}
}
}