es.alvsanand.webpage.services.cms.CmsServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for es.alvsanand.webpage.services.cms.CmsServiceImpl.java

Source

/*
 * 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);
            }
        }
    }
}