forumserviceimpl.java

来自「社区文章采用的是平板、树形自由选择的两种展示方式」· Java 代码 · 共 328 行

JAVA
328
字号
/* 
 * Created on 2007-2-16
 * Last modified on 2008-1-1
 * Powered by YeQiangWei.com
 */
package com.yeqiangwei.club.service.forum;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.apache.log4j.Logger;

import com.yeqiangwei.cache.Cache;
import com.yeqiangwei.club.cache.CacheRegion;
import com.yeqiangwei.cache.singleton.CacheFactory;
import com.yeqiangwei.club.cache.CacheKeys;
import com.yeqiangwei.club.dao.DAOLocator;
import com.yeqiangwei.club.dao.DAOWrapper;
import com.yeqiangwei.club.dao.ForumDAO;
import com.yeqiangwei.club.model.Forum;
import com.yeqiangwei.club.exception.ClubException;
import com.yeqiangwei.club.param.CounterParameter;
import com.yeqiangwei.club.param.ForumParameter;
import com.yeqiangwei.club.service.ServiceLocator;
import com.yeqiangwei.club.service.ServiceWrapper;
import com.yeqiangwei.club.service.counter.CountService;
import com.yeqiangwei.club.model.Counters;
import com.yeqiangwei.club.model.ModelsOfForum;
import com.yeqiangwei.club.util.BeanUtils;
import com.yeqiangwei.club.util.MessageUtils;
import com.yeqiangwei.util.FormatDateTime;
import com.yeqiangwei.util.Validator;
import com.yeqiangwei.util.TypeChange;

public class ForumServiceImpl extends MessageUtils implements ForumService {
	
	private static final Logger logger = Logger.getLogger(ForumService.class);
	
	private static Cache<Long> CACHE_LONG = CacheFactory.<Long>creator(CacheRegion.LONG);
	
	private static Cache<Forum> CACHE_FORUM = CacheFactory.<Forum>creator(CacheRegion.FORUM);
	
	private static Cache<List<Forum>> CACHE_FORUM_LIST = CacheFactory.<List<Forum>>creator(CacheRegion.FORUM_LIST);
	
	private static Cache<ModelsOfForum> CACHE_MODELS_OF_FORUM = CacheFactory.<ModelsOfForum>creator(CacheRegion.MODELS_OF_FORUM);
	
	private static final String CACHE_TOPS = "TopForums";
	
	private static final String CACHE_TIME = "TopYmd";
	
	private static final int CACHE_TIMEOUT = 300; //缓存超时後更新到数据库(秒数)
	
	/* test */
	public static void main(String args[]){
		com.yeqiangwei.club.dao.hibernate.ConnectionManager.init();
		ForumParameter param = new ForumParameter();
		ForumServiceImpl f = new ForumServiceImpl();
		List<Forum> list = f.findByParameter(param);
		for(int i=0; i<list.size(); i++){
			Forum model = list.get(i);
			System.out.println(model.getForumName());
		}
	}
	
	public Forum findByForumName(String name){
		return this.getForumDAO().findByForumName(name);
	}
	
	public List<Forum> findTops(int rows) {
		List<Forum> forumList = null;
		long time = TypeChange.stringToLong(FormatDateTime.dateAdd(FormatDateTime.SECOND,CACHE_TIMEOUT,"yyyyMMddHHmmss"));
		Long cacheTime = CACHE_LONG.get(CACHE_TIME);
		Long nowTime = new Long(FormatDateTime.now());
		if(cacheTime!=null && cacheTime>nowTime){
			forumList = CACHE_FORUM_LIST.get(CACHE_TOPS);
			if(!Validator.isEmpty(forumList)){
				logger.debug("findTops from cache");
				return forumList;
			}
		}
		logger.debug("find all forums");
		ForumTemplate forumTemplate = new ForumResults();
		List<Forum> list = forumTemplate.findAll(); //查询出全部版面
		if(Validator.isEmpty(list))return null;
		int ymd = FormatDateTime.formatDateTimeToInt("yyyyMMdd");
		/**
		 * 遍历论坛查询每个版面的人气
		 */
		for(int i=0; i<list.size(); i++){
			Forum forum = list.get(i);
			if(forum.getForumIdd()==0){//如果是分类则跳出进行下一个查询
				continue;
			}
			CounterParameter cparam = new CounterParameter();
			cparam.setYmd(ymd);
			cparam.setForumId(forum.getForumId());
			Counters counters = this.getCountService().findOnlyByParameter(cparam);
			if(!Validator.isEmpty(counters)){
				forum.setSort(counters.getBoys()
						+counters.getGirls()
						+counters.getOthers()
						+counters.getHits());
			}else{
				forum.setSort(0);
			}
		}
		//创建一个新实例让排序结果不影响全部版面列表
		List<Forum> templist = new ArrayList<Forum>(); 
		for(Forum forum:list){
			templist.add(forum);
		}
		/**
		 * 为版面排序
		 */
		Collections.sort(templist, new ForumComparator());
		forumList = new ArrayList<Forum>();
		for(int i=0; i<templist.size(); i++){
			if(i>rows){
				break;
			}
			Forum forum = templist.get(i);
			if(forum.getForumIdd()==0){//如果是分类则跳出进行下一个查询
				continue;
			}
			forumList.add(forum);
		}
		CACHE_FORUM_LIST.put(CACHE_TOPS,forumList);
		CACHE_LONG.put(CACHE_TIME,new Long(time));
		return forumList;
	}

	public Forum findById(int id) {
		if(id>0){
			Forum model = CACHE_FORUM.get(CacheKeys.getForumKey(id));
			if(Validator.isEmpty(model)){
				model = this.getForumDAO().findById(id);
				if(!Validator.isEmpty(model)){
					CACHE_FORUM.put(CacheKeys.getKey(model),model);
				}
			}
			return model;
		}else{
			logger.debug("Forum findById id<=01");
			return null;
		}
	}

	public void createOrUpdate(Forum model) throws ClubException {
		if(model.getForumId()>0){
			this.update(model);
		}else{
			this.create(model);
		}
	}

	public void create(Forum model) throws ClubException {
		this.setForumLayer(model); //设置上层对象
		getForumDAO().create(model);
		CACHE_FORUM_LIST.remove(CacheKeys.ALL_FORUMS);
		CACHE_FORUM.put(CacheKeys.getKey(model),model);
		
	}

	public void update(Forum model) throws ClubException {
		this.setForumLayer(model); //设置上层对象
		Forum item = this.getForumDAO().findById(model.getForumId());
		if(Validator.isEmpty(item)){
			throw new ClubException(MessageUtils.getMessage("error_system"));
		}
		model.setForumId(item.getForumId());
		BeanUtils.copyProperties(item,model); //BO->PO
		this.getForumDAO().update(item);
		CACHE_FORUM_LIST.remove(CacheKeys.ALL_FORUMS);
		CACHE_FORUM.put(CacheKeys.getForumKey(model.getForumId()),model);
		CACHE_MODELS_OF_FORUM.remove("ModelsOfForum:forumId="+model.getForumId());
	}
	
	/**
	 * 删除版面同时删除帖子以及更新用户发贴数
	 * @param item
	 * @return
	 * @throws ClubException 
	 */
	public int delete(Forum model) throws ClubException {
		int c = 0;
		if(Validator.isEmpty(model)){
			throw new ClubException(MessageUtils.getMessage("error_system"));
		}
		else if(model.getForumId()<1){
			throw new ClubException(MessageUtils.getMessage("error_update_noid"));
		}
		else{
			c = getForumDAO().delete(model);
			CACHE_FORUM.remove(CacheKeys.getKey(model));
			CACHE_FORUM_LIST.remove(CacheKeys.ALL_FORUMS);
		}
		return c;
	}

	public int delete(String[] ids) throws ClubException {
		int c = 0;
		if(!Validator.isEmpty(ids)){
			for(int i=0; i<ids.length; i++){
				int id = TypeChange.stringToInt(ids[i]);
				Forum model = new Forum();
				model.setForumId(id);
				try {
					c+=this.delete(model);
				} catch (ClubException e) {
					logger.error(e.toString());
				}
			}
		}else{
			throw new ClubException(MessageUtils.getMessage("error_update_noid"));
		}
		return c;
	}


	public List<Forum> findByParameter(ForumParameter param) {
		return this.getForumDAO().findByParameter(param);
	}

	public long countByParameter(ForumParameter param) {
		return getForumDAO().countByParameter(param);
	}
	
	
	private Forum setForumLayer(Forum model){
		if(model.getForumIdd()>0){
			Forum forum = this.findById(model.getForumIdd());
			if(Validator.isEmpty(forum)){
				model.setLayer(0);
				logger.debug("找不到Forum上层对象,forumId:"+model.getForumId());
			}else{
				model.setLayer(forum.getLayer()+1);
			}
		}else{
			model.setLayer(0);
		}
		return model;
	}
	

	/**
	 * 根据版面ID获取版面以及上级分类信息
	 * 获取版面管理员信息
	 * 最后形成多个List集合
	 */
	public ModelsOfForum getModelsOfForum(int forumId) {
		ModelsOfForum models = CACHE_MODELS_OF_FORUM.get("ModelsOfForum:forumId="+forumId);
		if(models!=null){
			return models;
		}
		List<Forum> list = new ArrayList<Forum>();
		if(forumId>0){
			models = new ModelsOfForum();
			Forum forum = this.findById(forumId); //取当前Forum
			if(Validator.isEmpty(forum)){
				return null;
			}else{
				models.setForum(forum);
				models.setForumId(forumId);
				this.Forums(forum,list);
				Collections.sort(list, new ForumComparator()); //按版面分类层次从高到底排序
				list.add(forum);
				models.setForums(list);
			}
		}
		CACHE_MODELS_OF_FORUM.put("ModelsOfForum:forumId="+forumId,models);
		return models;
	}
	
	/**
	 * 辅助 getForum方法 获取版面上级分类信息形成List集合
	 * @param item
	 * @param list
	 */
	private void Forums(Forum model, List<Forum> list){
		if(model.getForumIdd()>0){
			Forum forum = this.findById(model.getForumIdd());
			if(!Validator.isEmpty(forum)){
				list.add(forum);
				if(forum.getForumIdd()>0){
					this.Forums(forum,list);
				}
			}
		}
	}

	public ForumDAO getForumDAO() {
		return DAOWrapper.getSingletonInstance(DAOLocator.FORUM);
	}

	private CountService getCountService() {
		return ServiceWrapper.<CountService>getSingletonInstance(ServiceLocator.COUNT);
	}

	public void cacheClear() {
		CACHE_LONG.clear();
		CACHE_FORUM.clear();
		CACHE_MODELS_OF_FORUM.clear();
		CACHE_FORUM_LIST.clear();
	}



	/* test 
	public static void main(String args[]){
		com.yeqiangwei.club.dao.hibernate.ConnectionManager.init();
		ForumServiceImpl f = new ForumServiceImpl();
		ModelsOfForum m;
		m = f.getModelsOfForum(7);
		if(m!=null){
			//System.out.print(m.getForum().getForumName());
		}
		List<Forum> list = m.getForums();
		for(int i=0; i<list.size(); i++){
			Forum ff = list.get(i);
			System.out.print(ff.getForumName());
			System.out.print(" ");
		}
		System.out.println();
	}
	*/
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?