Package com.jeecms.cms.action.directive.abs

Source Code of com.jeecms.cms.action.directive.abs.AbstractContentDirective

package com.jeecms.cms.action.directive.abs;

import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;

import com.jeecms.cms.entity.main.Channel;
import com.jeecms.cms.entity.main.CmsSite;
import com.jeecms.cms.entity.main.ContentTag;
import com.jeecms.cms.manager.main.ChannelMng;
import com.jeecms.cms.manager.main.CmsSiteMng;
import com.jeecms.cms.manager.main.ContentMng;
import com.jeecms.cms.manager.main.ContentTagMng;
import com.jeecms.cms.web.FrontUtils;
import com.jeecms.common.web.freemarker.DirectiveUtils;

import freemarker.core.Environment;
import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;

/**
* 内容标签基类
*
* @author liufang
*
*/
public abstract class AbstractContentDirective implements
    TemplateDirectiveModel {
  /**
   * 输入参数,TAG ID。允许多个TAG ID,用","分开。和tagNames之间二选一,ID优先级更高。
   */
  public static final String PARAM_TAG_ID = "tagId";
  /**
   * 输入参数,TAG NAME。允许多个TAG NAME,用","分开。
   */
  public static final String PARAM_TAG_NAME = "tagName";
  /**
   * 输入参数,专题ID。
   */
  public static final String PARAM_TOPIC_ID = "topicId";
  /**
   * 输入参数,栏目ID。允许多个栏目ID,用","分开。和channelPath之间二选一,ID优先级更高。
   */
  public static final String PARAM_CHANNEL_ID = "channelId";
  /**
   * 输入参数,栏目路径。允许多个栏目路径,用","分开。
   */
  public static final String PARAM_CHANNEL_PATH = "channelPath";
  /**
   * 输入参数,栏目选项。用于单栏目情况下。0:自身栏目;1:包含子栏目;2:包含副栏目。
   */
  public static final String PARAM_CHANNEL_OPTION = "channelOption";
  /**
   * 输入参数,站点ID。可选。允许多个站点ID,用","分开。
   */
  public static final String PARAM_SITE_ID = "siteId";
  /**
   * 输入参数,类型ID。可选。允许多个类型ID,用","分开。
   */
  public static final String PARAM_TYPE_ID = "typeId";
  /**
   * 输入参数,推荐。0:所有;1:推荐;2:不推荐。默认所有。
   */
  public static final String PARAM_RECOMMEND = "recommend";
  /**
   * 输入参数,标题。可以为null。
   */
  public static final String PARAM_TITLE = "title";
  /**
   * 输入参数,标题图片。0:所有;1:有;2:没有。默认所有。
   */
  public static final String PARAM_IMAGE = "image";
  /**
   * 输入参数,排序方式。
   * <ul>
   * <li>0:ID降序
   * <li>1:ID升序
   * <li>2:发布时间降序
   * <li>3:发布时间升序
   * <li>4:固定级别降序,发布时间降序
   * <li>5:固定级别降序,发布时间升序
   *
   * <li>6:日访问降序(推荐)
   * <li>7:周访问降序
   * <li>8:月访问降序
   * <li>9:总访问降序
   *
   * <li>10:日评论降序(推荐)
   * <li>11:周评论降序
   * <li>12:月评论降序
   * <li>13:总评论降序
   *
   * <li>14:日下载降序(推荐)
   * <li>15:周下载降序
   * <li>16:月下载降序
   * <li>17:总下载降序
   *
   * <li>18:周顶降序(推荐)
   * <li>19:周顶降序
   * <li>20:周顶降序
   * <li>21:周顶降序
   * </ul>
   */
  public static final String PARAM_ORDER_BY = "orderBy";
  /**
   * 输入参数,不包含的文章ID。用于按tag查询相关文章。
   */
  public static final String PARAM_EXCLUDE_ID = "excludeId";

  protected Integer[] getTagIds(Map<String, TemplateModel> params)
      throws TemplateException {
    Integer[] ids = DirectiveUtils.getIntArray(PARAM_TAG_ID, params);
    if (ids != null && ids.length > 0) {
      return ids;
    } else {
      String nameStr = DirectiveUtils.getString(PARAM_TAG_NAME, params);
      if (StringUtils.isBlank(nameStr)) {
        return null;
      }
      String[] names = StringUtils.split(nameStr, ',');
      Set<Integer> set = new HashSet<Integer>();
      ContentTag tag;
      for (String name : names) {
        tag = contentTagMng.findByNameForTag(name);
        if (tag != null) {
          set.add(tag.getId());
        }
      }
      if (set.size() > 0) {
        return set.toArray(new Integer[set.size()]);
      } else {
        return null;
      }
    }
  }

  protected Integer getTopicId(Map<String, TemplateModel> params)
      throws TemplateException {
    return DirectiveUtils.getInt(PARAM_TOPIC_ID, params);
  }

  protected Integer[] getChannelIds(Map<String, TemplateModel> params)
      throws TemplateException {
    Integer[] ids = DirectiveUtils.getIntArray(PARAM_CHANNEL_ID, params);
    if (ids != null && ids.length > 0) {
      return ids;
    } else {
      return null;
    }
  }

  protected String[] getChannelPaths(Map<String, TemplateModel> params)
      throws TemplateException {
    String nameStr = DirectiveUtils.getString(PARAM_CHANNEL_PATH, params);
    if (StringUtils.isBlank(nameStr)) {
      return null;
    }
    return StringUtils.split(nameStr, ',');
  }

  protected Integer[] getChannelIdsByPaths(String[] paths, Integer siteId) {
    Set<Integer> set = new HashSet<Integer>();
    Channel channel;
    for (String path : paths) {
      channel = channelMng.findByPathForTag(path, siteId);
      if (channel != null) {
        set.add(channel.getId());
      }
    }
    if (set.size() > 0) {
      return set.toArray(new Integer[set.size()]);
    } else {
      return null;
    }
  }

  /**
   * 获取ID数组,如果ID不存在则获取PATH数组。
   *
   * @param params
   *            标签参数
   * @param siteIds
   *            如果为null,则自动获取所有站点path
   * @return 如果不存在,则返回null。
   * @throws TemplateException
   */
  protected Integer[] getChannelIdsOrPaths(Map<String, TemplateModel> params,
      Integer[] siteIds) throws TemplateException {
    Integer[] ids = getChannelIds(params);
    if (ids != null) {
      return ids;
    }
    String[] paths = getChannelPaths(params);
    if (paths == null) {
      return null;
    }
    Set<Integer> set = new HashSet<Integer>();
    Channel channel;
    if (siteIds == null) {
      List<CmsSite> list = cmsSiteMng.getListFromCache();
      siteIds = new Integer[list.size()];
      int i = 0;
      for (CmsSite site : list) {
        siteIds[i++] = site.getId();
      }
    }
    for (Integer siteId : siteIds) {
      for (String path : paths) {
        channel = channelMng.findByPathForTag(path, siteId);
        if (channel != null) {
          set.add(channel.getId());
        }
      }
    }
    if (set.size() > 0) {
      return set.toArray(new Integer[set.size()]);
    } else {
      return null;
    }
  }

  protected int getChannelOption(Map<String, TemplateModel> params)
      throws TemplateException {
    Integer option = DirectiveUtils.getInt(PARAM_CHANNEL_OPTION, params);
    if (option == null || option < 0 || option > 2) {
      return 0;
    } else {
      return option;
    }
  }

  protected Integer[] getSiteIds(Map<String, TemplateModel> params)
      throws TemplateException {
    Integer[] siteIds = DirectiveUtils.getIntArray(PARAM_SITE_ID, params);
    return siteIds;
  }

  protected Integer[] getTypeIds(Map<String, TemplateModel> params)
      throws TemplateException {
    Integer[] typeIds = DirectiveUtils.getIntArray(PARAM_TYPE_ID, params);
    return typeIds;
  }

  protected Boolean getHasTitleImg(Map<String, TemplateModel> params)
      throws TemplateException {
    String titleImg = DirectiveUtils.getString(PARAM_IMAGE, params);
    if ("1".equals(titleImg)) {
      return true;
    } else if ("2".equals(titleImg)) {
      return false;
    } else {
      return null;
    }
  }

  protected Boolean getRecommend(Map<String, TemplateModel> params)
      throws TemplateException {
    String recommend = DirectiveUtils.getString(PARAM_RECOMMEND, params);
    if ("1".equals(recommend)) {
      return true;
    } else if ("2".equals(recommend)) {
      return false;
    } else {
      return null;
    }
  }

  protected String getTitle(Map<String, TemplateModel> params)
      throws TemplateException {
    return DirectiveUtils.getString(PARAM_TITLE, params);
  }

  protected int getOrderBy(Map<String, TemplateModel> params)
      throws TemplateException {
    Integer orderBy = DirectiveUtils.getInt(PARAM_ORDER_BY, params);
    if (orderBy == null) {
      return 0;
    } else {
      return orderBy;
    }
  }

  protected Object getData(Map<String, TemplateModel> params, Environment env)
      throws TemplateException {
    int orderBy = getOrderBy(params);
    Boolean titleImg = getHasTitleImg(params);
    Boolean recommend = getRecommend(params);
    Integer[] typeIds = getTypeIds(params);
    Integer[] siteIds = getSiteIds(params);
    String title = getTitle(params);
    int count = FrontUtils.getCount(params);

    Integer[] tagIds = getTagIds(params);
    if (tagIds != null) {
      Integer[] channelIds = getChannelIdsOrPaths(params, siteIds);
      Integer excludeId = DirectiveUtils.getInt(PARAM_EXCLUDE_ID, params);
      if (isPage()) {
        int pageNo = FrontUtils.getPageNo(env);
        return contentMng.getPageByTagIdsForTag(tagIds, siteIds,
            channelIds, typeIds, excludeId, titleImg, recommend,
            title, orderBy, pageNo, count);
      } else {
        int first = FrontUtils.getFirst(params);
        return contentMng.getListByTagIdsForTag(tagIds, siteIds,
            channelIds, typeIds, excludeId, titleImg, recommend,
            title, orderBy, first, count);
      }
    }
    Integer topicId = getTopicId(params);
    if (topicId != null) {
      Integer[] channelIds = getChannelIdsOrPaths(params, siteIds);
      if (isPage()) {
        int pageNo = FrontUtils.getPageNo(env);
        return contentMng.getPageByTopicIdForTag(topicId, siteIds,
            channelIds, typeIds, titleImg, recommend, title,
            orderBy, pageNo, count);
      } else {
        int first = FrontUtils.getFirst(params);
        return contentMng.getListByTopicIdForTag(topicId, siteIds,
            channelIds, typeIds, titleImg, recommend, title,
            orderBy, first, count);
      }
    }
    Integer[] channelIds = getChannelIds(params);
    if (channelIds != null) {
      int option = getChannelOption(params);
      if (isPage()) {
        int pageNo = FrontUtils.getPageNo(env);
        return contentMng.getPageByChannelIdsForTag(channelIds,
            typeIds, titleImg, recommend, title, orderBy, option,
            pageNo, count);
      } else {
        int first = FrontUtils.getFirst(params);
        return contentMng.getListByChannelIdsForTag(channelIds,
            typeIds, titleImg, recommend, title, orderBy, option,
            first, count);
      }
    }
    String[] channelPaths = getChannelPaths(params);
    if (channelPaths != null) {
      int option = getChannelOption(params);
      // 如果只有一个站点或只传入一个站点ID,则将栏目path转化为ID。
      boolean pathsToIds = false;
      Integer siteId = null;
      if (siteIds == null || siteIds.length == 0) {
        List<CmsSite> siteList = cmsSiteMng.getListFromCache();
        if (siteList.size() == 1) {
          pathsToIds = true;
          siteId = siteList.get(0).getId();
        }
      } else if (siteIds != null && siteIds.length == 1) {
        pathsToIds = true;
        siteId = siteIds[0];
      }
      if (pathsToIds) {
        channelIds = getChannelIdsByPaths(channelPaths, siteId);
        if (channelIds != null) {
          if (isPage()) {
            int pageNo = FrontUtils.getPageNo(env);
            return contentMng.getPageByChannelIdsForTag(channelIds,
                typeIds, titleImg, recommend, title, orderBy,
                option, pageNo, count);
          } else {
            int first = FrontUtils.getFirst(params);
            return contentMng.getListByChannelIdsForTag(channelIds,
                typeIds, titleImg, recommend, title, orderBy,
                option, first, count);
          }
        } else {
          // 如果将栏目path转换为ID后为空,则按path不存在处理,转到最后执行。
        }
      } else {
        if (isPage()) {
          int pageNo = FrontUtils.getPageNo(env);
          return contentMng.getPageByChannelPathsForTag(channelPaths,
              siteIds, typeIds, titleImg, recommend, title,
              orderBy, pageNo, count);
        } else {
          int first = FrontUtils.getFirst(params);
          return contentMng.getListByChannelPathsForTag(channelPaths,
              siteIds, typeIds, titleImg, recommend, title,
              orderBy, first, count);
        }
      }
    }
    // 主要条件为空,则执行此处代码。
    if (isPage()) {
      int pageNo = FrontUtils.getPageNo(env);
      return contentMng.getPageBySiteIdsForTag(siteIds, typeIds,
          titleImg, recommend, title, orderBy, pageNo, count);
    } else {
      int first = FrontUtils.getFirst(params);
      return contentMng.getListBySiteIdsForTag(siteIds, typeIds,
          titleImg, recommend, title, orderBy, first, count);
    }
  }

  abstract protected boolean isPage();

  @Autowired
  protected ContentTagMng contentTagMng;

  @Autowired
  protected ChannelMng channelMng;

  @Autowired
  protected CmsSiteMng cmsSiteMng;

  @Autowired
  protected ContentMng contentMng;
}
TOP

Related Classes of com.jeecms.cms.action.directive.abs.AbstractContentDirective

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.