/* ==================================================================
* Created [2009-4-27 下午11:32:55] by Jon.King
* ==================================================================
* TSS
* ==================================================================
* mailTo:jinpujun@hotmail.com
* Copyright (c) Jon.King, 2009-2012
* ==================================================================
*/
package com.jinhe.tss.cms.dao.impl;
import java.io.File;
import java.util.Arrays;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import com.jinhe.tss.cms.CMSConstants;
import com.jinhe.tss.cms.dao.IArticleDao;
import com.jinhe.tss.cms.entity.Article;
import com.jinhe.tss.cms.entity.Attachment;
import com.jinhe.tss.cms.entity.ChannelArticle;
import com.jinhe.tss.cms.entity.ChannelArticleId;
import com.jinhe.tss.cms.helper.ArticleHelper;
import com.jinhe.tss.cms.helper.ArticleQueryCondition;
import com.jinhe.tss.component.support.persistence.pagequery.PageInfo;
import com.jinhe.tss.component.support.persistence.pagequery.PaginationQueryByHQL;
import com.jinhe.tss.core.exception.BusinessException;
import com.jinhe.tss.core.persistence.BaseDao;
import com.jinhe.tss.core.sso.Environment;
import com.jinhe.tss.core.util.EasyUtils;
/**
* Article的Dao层,负责处理Article相关的数据库操作
*/
public class ArticleDao extends BaseDao<Article> implements IArticleDao {
public ArticleDao() {
super(Article.class);
}
public Article fetchArticleById(Long id) {
Article article = getEntity( id );
if(article == null){
throw new BusinessException("文章不存在,可能已经被删除");
}
return article;
}
public Article saveArticle(Article article) {
return create(article);
}
public Article renewArticle(Article article) {
return create(article);
}
public void deleteArticle(Article article) {
Long articleId = article.getId();
// 相关文章处理,注意查询条件为 或(or)
String hql = "from ArticleLation o where o.id.articleId = ? or o.id.articleId = ?";
deleteAll(getEntities(hql, articleId, articleId));
//文章栏目关系删除
deleteAll(getEntities("from ChannelArticle o where o.id.articleId = ?", articleId));
//删除附件
Map<String, Attachment> attachments = getArticleAttachments(articleId); // 后台查找的新建文章时上传的附件列表
for ( Attachment attachment : attachments.values() ) {
// 删除附件 TODO 如果是缩略图则还需删除原图片
new File( ArticleHelper.getAttachUploadPath(article.getSite(), attachment)[0] ).delete();
//删除老的附件信息
super.delete(attachment);
}
// 删除文章生成的xml文件 (如果有的话)
String pubUrl = article.getPubUrl();
if ( !EasyUtils.isNullOrEmpty(pubUrl) ) {
new File(pubUrl).delete();
}
super.delete(article);
}
public Integer getArticleLationNextOrder(Long articleId) {
String hql = "select nvl(max(al.seqNo), 0) + 1 from ArticleLation al where al.id.articleId = ?";
List<?> list = getEntities(hql, articleId);
return (Integer) list.get(0);
}
public Integer getChannelArticleNextOrder(Long channelId) {
String hql = "select nvl(max(ca.seqNo), 0) + 1 from ChannelArticle ca where ca.id.channelId = ?";
List<?> list = getEntities(hql, channelId);
return (Integer) list.get(0);
}
public Integer getAttachmentNextOrder(Long articleId) {
String hql = "select nvl(max(o.id.seqNo), 0) + 1 from Attachment o where o.id.articleId = ?";
List<?> list = getEntities(hql, articleId);
return (Integer) list.get(0);
}
public Map<String, Attachment> getArticleAttachments(Long articleId) {
List<?> list = getEntities("from Attachment a where a.id.articleId = ?", articleId);
Map<String, Attachment> map = new LinkedHashMap<String, Attachment>();
for ( Object temp : list ) {
Attachment attachment = (Attachment) temp;
attachment.setUploadName(attachment.getRelationDownloadUrl()); //设置附件的下载地址
map.put(attachment.getId().toString(), attachment);
}
return map;
}
public List<?> getPublishedArticleByChannel(Long channelId) {
String hql = "select a.id, a.pubUrl, a.issueDate " +
" from Article a, ChannelArticle ca, Channel c " +
" where (a.deleted <> 1 or a.deleted is null)" +
" and c.id = ca.id.channelId and ca.id.articleId = a.id" +
" and ca.articleOrigin <> ? and a.status = ? and c.id = ?";
return getEntities(hql, CMSConstants.ARTICLE_DISTRIBUTE, CMSConstants.XML_STATUS, channelId );
}
public ChannelArticle getChannelArticle(Long articleId, Long channelId) {
ChannelArticleId id = new ChannelArticleId(channelId, articleId);
return (ChannelArticle) getEntity(ChannelArticle.class, id);
}
public Long getChannelIdByArticleId(Long articleId) {
String hql = "select t.id from Channel t, ChannelArticle ca"
+ " where t.id = ca.id.channelId and ca.id.articleId = ? and ca.articleOrigin <> ?";
List<?> list = getEntities(hql, articleId, CMSConstants.ARTICLE_DISTRIBUTE );
Long channelId = list.size() > 0 ? (Long) list.get(0) : null;
if( channelId == null ) {
throw new BusinessException("找不到文章所在的栏目!");
}
return channelId;
}
public List<?> getDispathedToChannels(Long articleId) {
String hql = "select distinct t from Channel t, ChannelArticle ca"
+ " where t.id = ca.id.channelId "
+ " and ca.id.articleId = ? and ca.articleOrigin = ?";
return getEntities(hql, articleId, CMSConstants.ARTICLE_DISTRIBUTE );
}
public List<?> getArticleLationsById(Long articleId) {
String hql = "select a from ArticleLation lation, Article a "
+ " where lation.id.articleId = ? and lation.id.lationArticleId = a.id and (a.deleted <> 1 or a.deleted is null)";
return getEntities( hql, articleId );
}
public List<?> getLationsById(Long articleId) {
return getEntities("from ArticleLation where id.articleId = ?", articleId);
}
public List<?> getFFChannelArticleListByArticle(Long articleId) {
String hql = " from ChannelArticle ca where ca.id.articleId = ? and ca.articleOrigin = ?";
return getEntities(hql, articleId, CMSConstants.ARTICLE_DISTRIBUTE);
}
public List<?> getZZChannelArticleList(Long articleId, Long channelId) {
String hql = "from ChannelArticle ca where ca.sourceArticleId = ? and ca.sourceChannelId = ? and ca.articleOrigin = ?";
return getEntities( hql, articleId, channelId, CMSConstants.ARTICLE_RESHIP );
}
// 以下两方法为全文检索时用到
public boolean checkArticleWorkflowPermission(String operationId, Long resourceId) {
if(resourceId == null) {
resourceId = CMSConstants.DEFAULT_WORKFLOW_ID;
}
String hql = "select distinct v from RoleUserMapping r, WorkFlowPermissionsFull v " +
" where v.id.resourceId= ? and v.id.roleId = r.id.roleId and r.id.userId = ? and v.id.operationId = ?";
List<?> list = getEntities(hql, resourceId, Environment.getOperatorId(), operationId);
return list.size() > 0 ;
}
@SuppressWarnings("unchecked")
public List<Article> getExpireArticlePuburlList(Date now, Long channelId) {
String hql = "select a from Article a, ChannelArticle ca " +
" where a.id = ca.id.articleId and ca.id.channelId = ? and a.status = ? and a.overdueDate <= ? ";
// 需要过期的文章为”已发布“状态的文章。其他状态没必要设置为过期
return (List<Article>) getEntities(hql, channelId, CMSConstants.XML_STATUS, now);
}
//* ***************************************** for page search ********************************************
public PageInfo getPageList(Long channelId, Integer pageNum, String...orderBy) {
String hql = "select distinct a.id, a.title, a.author, a.articleTypeId, a.issueDate, a.wzrq, a.summary, "
+ " a.hitCount, a.creatorName, a.updatorName, a.createTime, a.updateTime,"
+ " a.status, ca.articleOrigin, ca.seqNo, c.id, ca.isTop, a.overdueDate, c.workflowId"
+ " from Article a, ChannelArticle ca, Channel c"
+ " where (a.deleted <> 1 or a.deleted is null)"
+ " and ca.id.articleId = a.id and c.id = ca.id.channelId and c.id = :channelId ";
ArticleQueryCondition condition = new ArticleQueryCondition();
condition.setChannelId(channelId);
condition.getPage().setPageNum(pageNum);
if(orderBy != null) {
condition.getOrderByFields().addAll( Arrays.asList(orderBy) );
} else {
condition.getOrderByFields().add(" ca.seqNo desc "); // 如果页面上不指定排序字段,默认按seqNo排序
}
PaginationQueryByHQL pageQuery = new PaginationQueryByHQL(em, hql, condition);
return pageQuery.getResultList();
}
public PageInfo getSearchArticlePageList(ArticleQueryCondition condition) {
String hql = "select distinct a.id, a.title, a.author, a.articleTypeId, a.issueDate, a.wzrq, a.summary,"
+ " a.hitCount, a.creatorName, a.updatorName, a.createTime, a.updateTime,"
+ " a.status, ca.articleOrigin, ca.seqNo, c.id, ca.isTop, a.overdueDate, c.workflowId "
+ " from Article a, ChannelArticle ca, Channel c, Temp t"
+ " where a.id = ca.id.articleId and ca.id.channelId = c.id and c.id = t.id "
+ " ${excludeDeleted} ${author} ${status} ${title} ${searchDate}" ;
String orderBy = condition.getOrderField() == null ? null : "a." + condition.getOrderField();
if( orderBy != null && CMSConstants.TRUE.equals(condition.getIsDesc()) ) {
orderBy += " desc ";
}
if(orderBy == null) {
orderBy = " a.createTime desc "; // 如果页面上不指定排序字段,默认按文章的创建时间排序
}
condition.getOrderByFields().add(orderBy);
PaginationQueryByHQL pageQuery = new PaginationQueryByHQL(em, hql, condition);
return pageQuery.getResultList();
}
//* ***************************************** for portlet ********************************************
public List<?> getRelationArticles(Long articleId) {
String hql = " select a from Article a, ArticleLation l "
+ " where a.id = l.id.lationArticleId and l.id.articleId = ? and (a.deleted <> 1 or a.deleted is null) and a.status = ? "
+ " order by a.createTime desc";
return getEntities(hql, articleId, CMSConstants.XML_STATUS );
}
public PageInfo getChannelPageArticleList(ArticleQueryCondition condition) {
String hql = "select distinct a.id, a.articleTypeId, a.title, a.author, a.summary, "
+ " a.issueDate, a.wzrq, a.createTime, a.hitCount, ca.isTop "
+ " from Article a, ChannelArticle ca, Channel c "
+ " where a.id = ca.id.articleId and ca.id.channelId = c.id "
+ " ${channelId} ${status} ${excludeDeleted} "
+ " order by ca.isTop desc, a.createTime desc";
PaginationQueryByHQL pageQuery = new PaginationQueryByHQL(em, hql, condition);
return pageQuery.getResultList();
}
public PageInfo getArticlesByChannelIds(ArticleQueryCondition condition) {
insertIds2TempTable(condition.getChannelIds());
condition.setChannelIds(null);
String hql = "select distinct a.id, a.title, a.author, a.createTime, a.wzrq, ca.isTop, a.summary, a.hitCount"
+ " from Article a, ChannelArticle ca, Temp t"
+ " where a.id = ca.id.articleId and ca.id.channelId = t.id"
+ " ${excludeDeleted} ${status} ${createTime} "
+ " order by ca.isTop desc, a.createTime desc";
PaginationQueryByHQL pageQuery = new PaginationQueryByHQL(em, hql, condition);
return pageQuery.getResultList();
}
}