/* * 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.cms; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; import javax.cache.Cache; import javax.cache.CacheException; import javax.cache.CacheFactory; import javax.cache.CacheManager; import org.apache.commons.lang.StringUtils; import es.alvsanand.webpage.common.Globals; import es.alvsanand.webpage.common.Logger; import es.alvsanand.webpage.common.photo.Album; import es.alvsanand.webpage.common.photo.Photo; import es.alvsanand.webpage.db.QueryBean; import es.alvsanand.webpage.db.QueryBean.OrderBean; import es.alvsanand.webpage.db.dao.DAOException; import es.alvsanand.webpage.db.dao.admin.AvatarDAO; import es.alvsanand.webpage.db.dao.admin.AvatarDAOImpl; 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.Avatar; import es.alvsanand.webpage.model.Tag; import es.alvsanand.webpage.model.User; import es.alvsanand.webpage.services.ServiceException; import es.alvsanand.webpage.services.admin.ImageAdminService; import es.alvsanand.webpage.services.admin.ImageAdminServiceImpl; import es.alvsanand.webpage.web.beans.cms.HomeBean; /** * This class implements the service Tag * * @author alvaro.santos * @date 18/11/2009 * */ public class CmsServiceImpl implements CmsService{ private final static Logger logger = new Logger(CmsServiceImpl.class); private ArticleDAO articleDAO = new ArticleDAOImpl(); private TagDAO tagDAO = new TagDAOImpl(); private AvatarDAO avatarDAO = new AvatarDAOImpl(); private ImageAdminService imageAdminService = new ImageAdminServiceImpl(); /* (non-Javadoc) * @see es.alvsanand.webpage.services.cms.CmsService#getArticles(int) */ public List<Article> getArticles(int offset) throws ServiceException{ try { logger.debug("Getting activated articles[offset=" + offset +"]"); List<Article> articles = getActivatedArticlesFromCache(offset); if(articles==null){ QueryBean queryBean = new QueryBean(); queryBean.setLimit(HomeBean.ARTICLE_PER_PAGE); queryBean.setOffset(offset); List<OrderBean> orderBeans = new java.util.ArrayList<OrderBean>(); for(String order: HomeBean.DEFAULT_SORT_FIELDS){ OrderBean orderBean = new OrderBean(false, order); orderBeans.add(orderBean); } queryBean.setOrderBeans(orderBeans); articles = articleDAO.getActivatedArticles(queryBean); putActivatedArticlesFromCache(articles, offset); } return articles; } catch (DAOException e) { logger.error("Error getting activated articles",e); throw new ServiceException(e); } } /* (non-Javadoc) * @see es.alvsanand.webpage.services.cms.CmsService#getArticle(es.alvsanand.webpage.model.Article) */ public Article getArticle(Article _article) throws ServiceException{ try { logger.debug("Getting activated article[" + _article.getName() +"]"); Article article = getActivatedArticleFromCache(_article); if(article==null){ if(_article!=null && StringUtils.isNotEmpty(_article.getIdArticle())){ article = articleDAO.getArticle(_article); } else{ article = articleDAO.getArticleByName(_article); } putActivatedArticleFromCache(article); } return article; } catch (DAOException e) { logger.error("Error getting activated article",e); throw new ServiceException(e); } } /* (non-Javadoc) * @see es.alvsanand.webpage.services.cms.CmsService#getArticlesCount() */ public int getArticlesCount() throws ServiceException{ try { // logger.debug("Getting activated articles count."); int count = getActivatedArticlesCountFromCache(); if(count==-1){ count = articleDAO.getActivatedArticleCount(); putActivatedArticlesCountFromCache(count); } return count; } catch (DAOException e) { logger.error("Error getting articles count",e); throw new ServiceException(e); } } /* (non-Javadoc) * @see es.alvsanand.webpage.services.cms.CmsService#existsArticleTree() */ public boolean existsArticleTree() throws ServiceException{ logger.debug("Checking if activated articles tree exists"); Map<Date, Map<Date, Map<Date, List<Article>>>> articleTree = getActivatedArticlesTreeFromCache(); if(articleTree==null){ return false; } else{ return true; } } /* (non-Javadoc) * @see es.alvsanand.webpage.services.cms.CmsService#getArticleTree() */ public Map<Date, Map<Date, Map<Date, List<Article>>>> getArticleTree() throws ServiceException{ try { logger.debug("Getting activated articles tree"); Map<Date, Map<Date, Map<Date, List<Article>>>> articleTree = getActivatedArticlesTreeFromCache(); if(articleTree==null){ QueryBean queryBean = new QueryBean(); List<OrderBean> orderBeans = new java.util.ArrayList<OrderBean>(); for(String order: HomeBean.DEFAULT_SORT_FIELDS){ OrderBean orderBean = new OrderBean(true, order); orderBeans.add(orderBean); } queryBean.setOrderBeans(orderBeans); List<Article> articles = articleDAO.getBasicActivatedArticles(queryBean); articleTree = convertListToDateTree(articles); putActivatedArticlesTreeFromCache(articleTree); } return articleTree; } catch (DAOException e) { logger.error("Error getting activated articles tree",e); throw new ServiceException(e); } } private Map<Date, Map<Date, Map<Date, List<Article>>>> convertListToDateTree(List<Article> articles){ Map<Date, Map<Date, Map<Date, List<Article>>>> articleTree = new TreeMap<Date, Map<Date, Map<Date, List<Article>>>>(); if(articles!=null && articles.size()>0){ for(Article article: articles){ Calendar calendar = GregorianCalendar.getInstance(); calendar.setTime(article.getDate()); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 1); Date dayDate = new Date(calendar.getTimeInMillis()); calendar.set(Calendar.DAY_OF_MONTH, 1); Date monthDate = new Date(calendar.getTimeInMillis()); calendar.set(Calendar.DAY_OF_YEAR, 1); Date yearDate = new Date(calendar.getTimeInMillis()); Map<Date, Map<Date, List<Article>>> yearMap = articleTree.get(yearDate); if(yearMap==null){ yearMap = new TreeMap<Date, Map<Date, List<Article>>>(); articleTree.put(yearDate, yearMap); } Map<Date, List<Article>> monthMap = yearMap.get(monthDate); if(monthMap==null){ monthMap = new TreeMap<Date, List<Article>>(); yearMap.put(monthDate, monthMap); } List<Article> dayList = monthMap.get(dayDate); if(dayList==null){ dayList = new ArrayList<Article>(); monthMap.put(dayDate, dayList); } dayList.add(article); } } return articleTree; } /* (non-Javadoc) * @see es.alvsanand.webpage.services.cms.CmsService#getTagMap() */ public Map<Tag, Integer> getTagMap() throws ServiceException{ try { logger.debug("Getting activated tag map"); Map<Tag, Integer> tagMap = getActivatedTagMapFromCache(); if(tagMap==null){ tagMap = tagDAO.getTagCountSortedByName(); putActivatedTagMapFromCache(tagMap); } return tagMap; } catch (DAOException e) { logger.error("Error getting activated articles tree",e); throw new ServiceException(e); } } /* (non-Javadoc) * @see es.alvsanand.webpage.services.cms.CmsService#getAlbums() */ public List<Album> getAlbums() throws ServiceException{ try { logger.debug("Getting gallery albums"); List<Album> galleryAlbums = getAlbumsFromCache(); if(galleryAlbums==null){ List<Album> albumEntriesTmp = imageAdminService.getAlbums(); galleryAlbums= new ArrayList<Album>(); if(albumEntriesTmp!=null){ for(Album album: albumEntriesTmp){ if(album.getDescription()!=null && album.getDescription().indexOf(Globals.GALLERY_ALBUM_MEDIA_KEYWORD)==0){ Album galleryAlbum = new Album(); galleryAlbum.setId(album.getId()); galleryAlbum.setDescription(album.getDescription().substring(Globals.GALLERY_ALBUM_MEDIA_KEYWORD.length())); galleryAlbum.setTitle(album.getTitle()); galleryAlbum.setDate(album.getDate()); List<Photo> photoEntries = imageAdminService.getPhotos(album); List<Photo> galleryPhotos = new ArrayList<Photo>(); for(Photo photo: photoEntries){ Photo galleryPhoto = new Photo(); galleryPhoto.setId(photo.getId()); galleryPhoto.setDescription(photo.getDescription()); galleryPhoto.setTitle(photo.getTitle()); galleryPhoto.setThumbnailUrl(photo.getThumbnailUrl()); galleryPhoto.setUrl(photo.getUrl()); galleryPhoto.setDate(photo.getDate()); galleryPhotos.add(galleryPhoto); } Collections.sort(galleryPhotos); Collections.reverse(galleryPhotos); galleryAlbum.setPhotos(galleryPhotos); galleryAlbums.add(galleryAlbum); } } Collections.sort(galleryAlbums); Collections.reverse(galleryAlbums); } putAlbumsFromCache(galleryAlbums); } return galleryAlbums; } catch (ServiceException e) { logger.error("Error getting gallery albums",e); throw new ServiceException(e); } } public Avatar getAvatar(User user) throws ServiceException{ try { logger.debug("Getting avatar of user[" + user +"]"); Avatar avatar = getAvatarFromCache(user); if(avatar==null){ avatar = avatarDAO.getAvatarByUser(user); if(avatar!=null){ putActivatedAvatarFromCache(avatar); } } return avatar; } catch (DAOException e) { logger.error("Error getting activated avatar",e); throw new ServiceException(e); } } private List<Article> getActivatedArticlesFromCache(int offset){ Cache cache = null; try { 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){ return null; } else{ logger.debug("Found activated articles From Cache"); } return articlesMap.get(new Integer(offset)); } catch (CacheException cacheException) { logger.error("Error in getting activated Articles List from cache.",cacheException); return null; } catch(Exception exception){ logger.error("Error in getting activated Articles List from cache.",exception); if(cache!=null){ cache.remove(Globals.ACTIVATED_ARTICLES_CACHE_NAME); } return null; } } private void putActivatedArticlesFromCache(List<Article> articles, int offset){ Cache cache = null; if(articles==null){ return; } try { 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){ articlesMap = new HashMap<Integer,List<Article>>(); } articlesMap.put(new Integer(offset), articles); cache.put(Globals.ACTIVATED_ARTICLES_CACHE_NAME, articlesMap); logger.debug("Saved activated articles list to cache"); } catch (CacheException cacheException) { logger.error("Error in putting activated articles list to cache.",cacheException); } catch(Exception exception){ logger.error("Error in putting activated articles list to cache.",exception); if(cache!=null){ cache.remove(Globals.ACTIVATED_ARTICLES_CACHE_NAME); } } } private int getActivatedArticlesCountFromCache(){ Cache cache = null; try { CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory(); cache = cacheFactory.createCache(Collections.emptyMap()); Integer count = (Integer)cache.get(Globals.ACTIVATED_ARTICLES_COUNT_CACHE_NAME); if(count==null){ return -1; } else{ // logger.debug("Found activated articles count From Cache"); return count.intValue(); } } catch (CacheException cacheException) { logger.error("Error in getting activated Articles count from cache.",cacheException); return -1; } catch(Exception exception){ logger.error("Error in getting activated Articles count from cache.",exception); if(cache!=null){ cache.remove(Globals.ACTIVATED_ARTICLES_COUNT_CACHE_NAME); } return -1; } } private void putActivatedArticlesCountFromCache(int count){ Cache cache; try { CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory(); cache = cacheFactory.createCache(Collections.emptyMap()); cache.put(Globals.ACTIVATED_ARTICLES_COUNT_CACHE_NAME, new Integer(count)); } catch (CacheException cacheException) { logger.error("Error in putting activated Articles count to cache.",cacheException); } } private Map<Date, Map<Date, Map<Date, List<Article>>>> getActivatedArticlesTreeFromCache(){ Cache cache = null; try { CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory(); cache = cacheFactory.createCache(Collections.emptyMap()); Map<Date, Map<Date, Map<Date, List<Article>>>> articlesMap = (Map<Date, Map<Date, Map<Date, List<Article>>>>)cache.get(Globals.ACTIVATED_ARTICLES_TREE_CACHE_NAME); return articlesMap; } catch (CacheException cacheException) { logger.error("Error in getting activated Articles Tree from cache.",cacheException); return null; } catch(Exception exception){ logger.error("Error in getting activated Articles Tree from cache.",exception); if(cache!=null){ cache.remove(Globals.ACTIVATED_ARTICLES_TREE_CACHE_NAME); } return null; } } private void putActivatedArticlesTreeFromCache(Map<Date, Map<Date, Map<Date, List<Article>>>> articles){ Cache cache = null; if(articles==null){ return; } try { CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory(); cache = cacheFactory.createCache(Collections.emptyMap()); cache.put(Globals.ACTIVATED_ARTICLES_TREE_CACHE_NAME, articles); logger.debug("Saved activated articles Tree to cache"); } catch (CacheException cacheException) { logger.error("Error in putting activated articles Tree to cache.",cacheException); } catch(Exception exception){ logger.error("Error in putting activated articles Tree to cache.",exception); if(cache!=null){ cache.remove(Globals.ACTIVATED_ARTICLES_TREE_CACHE_NAME); } } } private Map<Tag, Integer> getActivatedTagMapFromCache(){ Cache cache = null; try { CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory(); cache = cacheFactory.createCache(Collections.emptyMap()); Map<Tag, Integer> tagMap = (Map<Tag, Integer>)cache.get(Globals.ACTIVATED_TAG_MAP_CACHE_NAME); return tagMap; } catch (CacheException cacheException) { logger.error("Error in getting activated tags Tree from cache.",cacheException); return null; } catch(Exception exception){ logger.error("Error in getting activated tags from cache.",exception); if(cache!=null){ cache.remove(Globals.ACTIVATED_TAG_MAP_CACHE_NAME); } return null; } } private void putActivatedTagMapFromCache(Map<Tag, Integer> tags){ Cache cache = null; if(tags==null){ return; } try { CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory(); cache = cacheFactory.createCache(Collections.emptyMap()); cache.put(Globals.ACTIVATED_TAG_MAP_CACHE_NAME, tags); logger.debug("Saved activated tags to cache"); } catch (CacheException cacheException) { logger.error("Error in putting activated tags to cache.",cacheException); } catch(Exception exception){ logger.error("Error in putting activated tags to cache.",exception); if(cache!=null){ cache.remove(Globals.ACTIVATED_TAG_MAP_CACHE_NAME); } } } private Article getActivatedArticleFromCache(Article article){ Cache cache = null; try { CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory(); cache = cacheFactory.createCache(Collections.emptyMap()); Map<String, Article> articlesMap = (Map<String, Article>)cache.get(Globals.ACTIVATED_ARTICLES_BY_ID_CACHE_NAME); if(articlesMap==null){ return null; } else{ logger.debug("Found activated Articles by id From Cache"); } return articlesMap.get(article.getName()); } catch (CacheException cacheException) { logger.error("Error in getting activated Articles by id from cache.",cacheException); return null; } catch(Exception exception){ logger.error("Error in getting activated Articles by id from cache.",exception); if(cache!=null){ cache.remove(Globals.ACTIVATED_ARTICLES_BY_ID_CACHE_NAME); } return null; } } private void putActivatedArticleFromCache(Article article){ Cache cache = null; if(article==null){ return; } try { CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory(); cache = cacheFactory.createCache(Collections.emptyMap()); 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.put(article.getName(), article); cache.put(Globals.ACTIVATED_ARTICLES_BY_ID_CACHE_NAME, articlesMap); logger.debug("Saved activated activated Articles by id to cache"); } catch (CacheException cacheException) { logger.error("Error in putting activated Articles by id to cache.",cacheException); } catch(Exception exception){ logger.error("Error in putting activated Articles by id to cache.",exception); if(cache!=null){ cache.remove(Globals.ACTIVATED_ARTICLES_BY_ID_CACHE_NAME); } } } private List<Album> getAlbumsFromCache(){ Cache cache = null; try { CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory(); cache = cacheFactory.createCache(Collections.emptyMap()); List<Album> galleryAlbums = (List<Album>)cache.get(Globals.GALLERY_ALBUMS_CACHE_NAME); return galleryAlbums; } catch (CacheException cacheException) { logger.error("Error in getting gallery Albums from cache.",cacheException); return null; } catch(Exception exception){ logger.error("Error in getting gallery Albums from cache.",exception); if(cache!=null){ cache.remove(Globals.GALLERY_ALBUMS_CACHE_NAME); } return null; } } private void putAlbumsFromCache(List<Album> albumEntries){ Cache cache = null; if(albumEntries==null){ return; } try { CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory(); cache = cacheFactory.createCache(Collections.emptyMap()); cache.put(Globals.GALLERY_ALBUMS_CACHE_NAME, albumEntries); logger.debug("Saved gallery Albums to cache"); } catch (CacheException cacheException) { logger.error("Error in putting gallery Albums to cache.",cacheException); } catch(Exception exception){ logger.error("Error in putting gallery Albums to cache.",exception); if(cache!=null){ cache.remove(Globals.GALLERY_ALBUMS_CACHE_NAME); } } } private Avatar getAvatarFromCache(User user){ Cache cache = null; try { CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory(); cache = cacheFactory.createCache(Collections.emptyMap()); Map<String, Avatar> avatarsMap = (Map<String, Avatar>)cache.get(Globals.AVATAR_BY_ID_USER_CACHE_NAME); if(avatarsMap==null){ return null; } else{ logger.debug("Found Avatar by user From Cache"); } return avatarsMap.get(user.getIdUser()); } catch (CacheException cacheException) { logger.error("Error in getting Avatar by user from cache.",cacheException); return null; } catch(Exception exception){ logger.error("Error in getting Avatar by user from cache.",exception); if(cache!=null){ cache.remove(Globals.ACTIVATED_ARTICLES_BY_ID_CACHE_NAME); } return null; } } private void putActivatedAvatarFromCache(Avatar avatar){ Cache cache = null; if(avatar==null){ return; } try { CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory(); cache = cacheFactory.createCache(Collections.emptyMap()); Map<String, Avatar> avatarsMap = (Map<String, Avatar>)cache.get(Globals.AVATAR_BY_ID_USER_CACHE_NAME); if(avatarsMap==null){ avatarsMap = new HashMap<String, Avatar>(); } avatarsMap.put(avatar.getIdUser(), avatar); cache.put(Globals.AVATAR_BY_ID_USER_CACHE_NAME, avatarsMap); logger.debug("Saved activated Avatar by user to cache"); } catch (CacheException cacheException) { logger.error("Error in putting Avatar by user to cache.",cacheException); } catch(Exception exception){ logger.error("Error in putting Avatar by user to cache.",exception); if(cache!=null){ cache.remove(Globals.AVATAR_BY_ID_USER_CACHE_NAME); } } } }