Java tutorial
/* * BBSTopicDAO.java * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Author: Winter Lau (javayou@gmail.com) * http://dlog4j.sourceforge.net */ package com.liusoft.dlog4j.dao; import java.io.IOException; import java.sql.SQLException; import java.sql.Timestamp; import java.util.Calendar; import java.util.Date; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import com.liusoft.dlog4j.base._BeanBase; import com.liusoft.dlog4j.beans.BookmarkBean; import com.liusoft.dlog4j.beans.DiaryBean; import com.liusoft.dlog4j.beans.ForumBean; import com.liusoft.dlog4j.beans.SiteBean; import com.liusoft.dlog4j.beans.TagBean; import com.liusoft.dlog4j.beans.TopicBean; import com.liusoft.dlog4j.beans.TopicOutlineBean; import com.liusoft.dlog4j.beans.TopicReplyBean; import com.liusoft.dlog4j.db.HibernateUtils; import dlog.common.search.SearchDataProvider; import dlog.common.search.SearchEnabled; /** * * * @author Winter Lau */ public class BBSTopicDAO extends DAO implements SearchDataProvider { /** * * @param site * @param fbean * @return */ public static int getEliteCount(SiteBean site, ForumBean fbean) { StringBuffer hql = new StringBuffer("SELECT COUNT(*) FROM TopicBean AS t WHERE t.status=:status"); if (site != null) hql.append(" AND t.site.id=:site"); if (fbean != null) hql.append(" AND t.forum.id=:forum"); hql.append(" AND (t.type=:elite OR t.type=:top_elite)"); Session ssn = getSession(); Query q = ssn.createQuery(hql.toString()); q.setInteger("status", TopicBean.STATUS_NORMAL); q.setInteger("elite", TopicBean.INFO_TYPE_ELITE); q.setInteger("top_elite", TopicBean.INFO_TYPE_TOP_ELITE); if (site != null) q.setInteger("site", site.getId()); if (fbean != null) q.setInteger("forum", fbean.getId()); return ((Number) q.uniqueResult()).intValue(); } /** * * @param site * @param fbean * @param fromIdx * @param count * @return */ public static List listEliteTopics(SiteBean site, ForumBean fbean, int fromIdx, int count) { StringBuffer hql = new StringBuffer("FROM TopicOutlineBean AS t WHERE t.status=:status"); if (site != null) hql.append(" AND t.site.id=:site"); if (fbean != null) hql.append(" AND t.forum.id=:forum"); hql.append(" AND (t.type=:elite OR t.type=:top_elite) ORDER BY ROUND(t.type / 16, 0) DESC, t.id DESC"); Session ssn = getSession(); Query q = ssn.createQuery(hql.toString()); q.setInteger("status", TopicBean.STATUS_NORMAL); q.setInteger("elite", TopicBean.INFO_TYPE_ELITE); q.setInteger("top_elite", TopicBean.INFO_TYPE_TOP_ELITE); if (site != null) q.setInteger("site", site.getId()); if (fbean != null) q.setInteger("forum", fbean.getId()); if (fromIdx > 0) q.setFirstResult(fromIdx); if (count > 0) q.setMaxResults(count); return q.list(); } /** * * @param forum_id * @param current_topic_id * @param forward * @return */ public static TopicOutlineBean getNextTopic(int forum_id, int current_topic_id, boolean forward) { return (TopicOutlineBean) namedUniqueResult(forward ? "NEXT_TOPIC" : "LAST_TOPIC", forum_id, current_topic_id, TopicOutlineBean.STATUS_NORMAL); } /** * * * @param forum_id * @param fromIdx * @param count * @return */ public static List listHotTopics(int fromIdx, int count, int days) { Calendar cur_time = Calendar.getInstance(); cur_time.add(Calendar.DATE, -days); return executeNamedQueryCacheable("query.hot_topics", "HOT_TOPICS", fromIdx, count, TopicOutlineBean.STATUS_NORMAL, cur_time.getTime()); } /** * * * @param forum_id * @param fromIdx * @param count * @return */ public static List listHotTopics(SiteBean site, ForumBean forum, int fromIdx, int count, int days) { StringBuffer hql = new StringBuffer( "FROM TopicOutlineBean AS t WHERE t.site.id=? AND t.status=? AND t.createTime >= ? AND t.replyCount > 0"); if (forum != null) hql.append(" AND t.forum.id=?"); hql.append(" ORDER BY ROUND(t.type / 16, 0) DESC, t.replyCount DESC, t.id DESC"); Session ssn = getSession(); try { Query q = ssn.createQuery(hql.toString()); q.setInteger(0, site.getId()); q.setInteger(1, TopicOutlineBean.STATUS_NORMAL); Calendar cur_time = Calendar.getInstance(); cur_time.add(Calendar.DATE, -days); q.setTimestamp(2, new Timestamp(cur_time.getTime().getTime())); if (forum != null) q.setInteger(3, forum.getId()); if (fromIdx > 0) q.setFirstResult(fromIdx); q.setMaxResults(count); return q.list(); } finally { hql = null; } } /** * * @param site * @return */ public static int getTopicCount(int site) { return executeNamedStatAsInt("TOPIC_COUNT_OF_SITE", TopicBean.STATUS_NORMAL, site); } /** * * // * @param forum_id * @param fromIdx * @param count * @return */ public static List listTopics(int forum_id, int fromIdx, int count) { return executeNamedQuery("LIST_TOPICS", fromIdx, count, forum_id, TopicOutlineBean.STATUS_NORMAL); } /** * * @param site_id * @param fromIdx * @param count * @return */ public static List listAllTopics(int site_id, int fromIdx, int count) { return executeNamedQuery("LIST_ALL_TOPICS", fromIdx, count, site_id, TopicOutlineBean.STATUS_NORMAL); } /** * * @param site_id * @param fromIdx * @param count * @return */ public static List listAllTopics(int fromIdx, int count) { return executeNamedQuery("LIST_ALL_TOPICS2", fromIdx, count, TopicOutlineBean.STATUS_NORMAL); } /** * * * @param topic_id * @return */ public static TopicBean getTopicByID(int topic_id) { if (topic_id <= 0) return null; return (TopicBean) getBean(TopicBean.class, topic_id); } /** * * * @param topic_id * @return */ public static TopicOutlineBean getTopicOutlineByID(int topic_id) { if (topic_id <= 0) return null; return (TopicOutlineBean) getBean(TopicOutlineBean.class, topic_id); } /** * * * @param topic * @param add_bookmark */ public static void create(TopicBean topic, boolean add_bookmark) { try { if (topic.getCreateTime() == null) topic.setCreateTime(new Date()); Session ssn = getSession(); beginTransaction(); topic.getUser().getCount().incTopicCount(1); topic.getForum().incTopicCount(1); topic.getForum().setLastPostTime(new Date()); topic.getForum().setLastUser(topic.getUser()); topic.getForum().setLastUsername(topic.getUsername()); topic.getForum().setLastTopic(topic); ssn.save(topic); List tags = topic.getKeywords(); if (tags != null && tags.size() > 0) { int tag_count = 0; for (int i = 0; i < tags.size(); i++) { if (tag_count >= MAX_TAG_COUNT) break; String tag_name = (String) tags.get(i); if (tag_name.getBytes().length > MAX_TAG_LENGTH) continue; TagBean tag = new TagBean(); tag.setSite(topic.getSite()); tag.setRefId(topic.getId()); tag.setRefType(DiaryBean.TYPE_BBS); tag.setName(tag_name); ssn.save(tag); tag_count++; } } if (add_bookmark) { BookmarkBean bmb = new BookmarkBean(); bmb.setOwner(topic.getUser()); bmb.setSite(topic.getSite()); bmb.setCreateTime(new Date()); bmb.setParentId(topic.getId()); bmb.setParentType(_BeanBase.TYPE_BBS); bmb.setTitle(topic.getTitle()); ssn.save(bmb); } commit(); } catch (HibernateException e) { rollback(); throw e; } } /** * * @param topic */ public static void update(TopicBean topic, boolean updateTags) { try { beginTransaction(); if (updateTags) { TagDAO.deleteTagByRefId(topic.getId(), DiaryBean.TYPE_BBS); List tags = topic.getKeywords(); if (tags != null && tags.size() > 0) { int tag_count = 0; for (int i = 0; i < tags.size(); i++) { if (tag_count >= MAX_TAG_COUNT) break; String tag_name = (String) tags.get(i); if (tag_name.getBytes().length > MAX_TAG_LENGTH) continue; TagBean tag = new TagBean(); tag.setSite(topic.getSite()); tag.setRefId(topic.getId()); tag.setRefType(DiaryBean.TYPE_BBS); tag.setName((String) tags.get(i)); topic.getTags().add(tag); tag_count++; } } } commit(); } catch (HibernateException e) { rollback(); throw e; } } /** * * * @param topic * @throws SQLException * @throws IOException */ public static void delete(TopicOutlineBean topic) throws Exception { if (topic == null) return; Session ssn = getSession(); try { beginTransaction(); // topic.getForum().incTopicCount(-1); // if (topic.getForum().getLastTopic() != null && topic.getForum().getLastTopic().getId() == topic.getId()) { topic.getForum().setLastTopic(null); topic.getForum().setLastPostTime(null); topic.getForum().setLastUsername(null); topic.getForum().setLastUser(null); } topic.getUser().getCount().incTopicCount(-1); List rpls = topic.getReplies(); for (int i = rpls.size() - 1; i >= 0; i--) { TopicReplyBean rbean = (TopicReplyBean) rpls.get(i); if (rbean.getUser() != null) rbean.getUser().getCount().incTopicReplyCount(-1); } ssn.delete(topic); // TagDAO.deleteTagByRefId(topic.getId(), TagBean.TYPE_BBS); // FCKUploadFileDAO.deleteFilesByRef(ssn, topic.getSite().getId(), topic.getId(), DiaryBean.TYPE_BBS); commit(); } catch (HibernateException e) { rollback(); throw e; } } /** * * @param log_id * @param incCount * @return */ public static void incViewCount(int topic_id, int incCount) { executeNamedUpdate("INC_TOPIC_VIEW_COUNT", incCount, topic_id); } /** * @see com.liusoft.dlog4j.search.SearchDataProvider#fetchAfter(Date) */ @SuppressWarnings("unchecked") public List<SearchEnabled> fetchAfter(Date date) throws Exception { return findNamedAll("LIST_TOPICS_AFTER_SQL", date, TopicBean.STATUS_NORMAL); } public void finish() { HibernateUtils.closeSession(); } }