/**
* Copyright (c)2010-2011 Enterprise Website Content Management System(EWCMS), All rights reserved.
* EWCMS PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
* http://www.ewcms.com
*/
package com.ewcms.content.document.service;
import static com.ewcms.common.lang.EmptyUtil.isNotNull;
import static com.ewcms.common.lang.EmptyUtil.isNull;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
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 org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import com.ewcms.common.io.HtmlStringUtil;
import com.ewcms.content.document.BaseException;
import com.ewcms.content.document.dao.ArticleMainDAO;
import com.ewcms.content.document.dao.ReviewProcessDAO;
import com.ewcms.content.document.model.Article;
import com.ewcms.content.document.model.ArticleMain;
import com.ewcms.content.document.model.OperateTrack;
import com.ewcms.content.document.model.Article.Status;
import com.ewcms.content.document.model.Article.Type;
import com.ewcms.content.document.model.Content;
import com.ewcms.content.document.model.ReviewGroup;
import com.ewcms.content.document.model.ReviewProcess;
import com.ewcms.content.document.model.ReviewUser;
import com.ewcms.content.document.util.search.ExtractKeywordAndSummary;
import com.ewcms.content.history.History;
import com.ewcms.core.site.dao.ChannelDAO;
import com.ewcms.core.site.dao.TemplateDAO;
import com.ewcms.core.site.model.Channel;
import com.ewcms.core.site.model.Site;
import com.ewcms.core.site.model.SiteServer;
import com.ewcms.core.site.model.Template;
import com.ewcms.publication.PublishException;
import com.ewcms.publication.WebPublishFacable;
import com.ewcms.publication.deploy.DeployOperatorable;
import com.ewcms.security.manage.service.GroupServiceable;
import com.ewcms.security.manage.service.UserServiceable;
import com.ewcms.web.util.EwcmsContextUtil;
/**
*
* @author 吴智俊
*/
@Service
public class ArticleMainService implements ArticleMainServiceable {
@Autowired
private ArticleMainDAO articleMainDAO;
@Autowired
private ReviewProcessDAO reviewProcessDAO;
@Autowired
private OperateTrackServiceable operateTrackService;
@Autowired
private WebPublishFacable webPublish;
@Autowired
private ChannelDAO channelDAO;
@Autowired
private TemplateDAO templateDAO;
@Autowired
private UserServiceable userService;
@Override
public ArticleMain findArticleMainByArticleMainAndChannel(Long articleMainId, Integer channelId) {
return articleMainDAO.findArticleMainByArticleMainAndChannel(articleMainId, channelId);
}
@Override
public void delArticleMain(Long articleMainId, Integer channelId) {
ArticleMain articleMain = articleMainDAO.findArticleMainByArticleMainAndChannel(articleMainId, channelId);
Assert.notNull(articleMain);
if (isNotNull(articleMain.getReference()) && articleMain.getReference()){
articleMain.setArticle(null);
}
articleMainDAO.remove(articleMain);
operateTrackService.delOperateTrack(articleMainId);
}
@Override
public void delArticleMainToRecycleBin(Long articleMainId, Integer channelId) {
ArticleMain articleMain = articleMainDAO.findArticleMainByArticleMainAndChannel(articleMainId, channelId);
Assert.notNull(articleMain);
Article article = articleMain.getArticle();
Assert.notNull(article);
Status oldStatus = article.getStatus();
if (isNotNull(articleMain.getReference()) && articleMain.getReference()){
articleMain.setArticle(null);
articleMainDAO.remove(articleMain);
}else{
if (isNotNull(articleMain.getShare()) && articleMain.getShare()){
List<ArticleMain> articleMains = articleMainDAO.findArticleMainByArticleIdAndReference(article.getId(), true);
if (articleMains != null && !articleMains.isEmpty()){
for (ArticleMain vo : articleMains){
if (isNotNull(vo.getReference()) && vo.getReference()){
vo.setArticle(null);
articleMainDAO.remove(vo);
}
}
}
}
operateTrackService.addOperateTrack(articleMainId, article.getStatusDescription(), "放入内容回收站。", "");
article.setStatus(Status.REEDIT);
article.setDelete(true);
articleMain.setArticle(article);
articleMainDAO.merge(articleMain);
}
if (oldStatus == Status.RELEASE && !articleMain.getReference()){
Site site = EwcmsContextUtil.getCurrentSite();
SiteServer siteServer = site.getSiteServer();
DeployOperatorable output = siteServer.getOutputType().deployOperator(siteServer);
try {
output.delete(article.getUrl());
} catch (PublishException e) {
}
try {
associateRelease(channelId);
} catch (PublishException e) {
}
}
}
@Override
public void restoreArticleMain(Long articleMainId, Integer channelId) {
ArticleMain articleMain = articleMainDAO.findArticleMainByArticleMainAndChannel(articleMainId, channelId);
Assert.notNull(articleMain);
Article article = articleMain.getArticle();
Assert.notNull(article);
article.setDelete(false);
articleMain.setArticle(article);
articleMainDAO.merge(articleMain);
operateTrackService.addOperateTrack(articleMainId, article.getStatusDescription(), "从内容回收站还原。", "");
}
@Override
public void submitReviewArticleMain(List<Long> articleMainIds, Integer channelId) throws BaseException {
for (Long articleMainId : articleMainIds){
ArticleMain articleMain = articleMainDAO.findArticleMainByArticleMainAndChannel(articleMainId, channelId);
Assert.notNull(articleMain);
Article article = articleMain.getArticle();
Assert.notNull(article);
if (article.getStatus() == Status.DRAFT || article.getStatus() == Status.REEDIT) {
ReviewProcess reviewProcess = reviewProcessDAO.findFirstReviewProcessByChannel(channelId);
if (reviewProcess == null ){
operateTrackService.addOperateTrack(articleMainId, article.getStatusDescription(), "发布版。", "");
article.setStatus(Status.PRERELEASE);
article.setReviewProcess(null);
}else{
UserDetails userDetails = EwcmsContextUtil.getUserDetails();
Collection<GrantedAuthority> authorities = userDetails.getAuthorities();
Boolean isAdmin = false;
for (GrantedAuthority ga : authorities){
if (ga.getAuthority().toUpperCase().equals("ROLE_ADMIN")){
operateTrackService.addOperateTrack(articleMainId, article.getStatusDescription(), "管理员直接跳过流程进入发布版。", "");
article.setStatus(Status.PRERELEASE);
article.setReviewProcess(null);
isAdmin = true;
}
}
if (!isAdmin){
operateTrackService.addOperateTrack(articleMainId, article.getStatusDescription(),"已提交到【" + reviewProcess.getName() + "】进行审核。", "");
article.setStatus(Status.REVIEW);
article.setReviewProcess(reviewProcess);
}
}
if (article.getPublished() == null) {
article.setPublished(new Date(Calendar.getInstance().getTime().getTime()));
}
articleMain.setArticle(article);
articleMainDAO.merge(articleMain);
// }else{
// throw new BaseException("","只有在初稿或重新编辑状态下才能提交审核");
}
}
}
@Override
public Boolean copyArticleMainToChannel(List<Long> articleMainIds, List<Integer> channelIds, Integer source_channelId) {
ArticleMain articleMain = null;
Article article = null;
Channel channel = channelDAO.get(source_channelId);
Assert.notNull(channel);
String source_channelName = channel.getName();
for (Integer target_channelId : channelIds) {
for (Long articleMainId : articleMainIds) {
articleMain = articleMainDAO.findArticleMainByArticleMainAndChannel(articleMainId, source_channelId);
if (isNull(articleMain)) continue;
if (isNotNull(articleMain.getReference()) && articleMain.getReference()) continue;
article = articleMain.getArticle();
if (isNull(article)) continue;
if (target_channelId != source_channelId) {
Article target_article = new Article();
target_article.setStatus(Status.DRAFT);
target_article.setPublished(null);
if (article.getType() == Type.TITLE){
target_article.setUrl(article.getUrl());
}else{
target_article.setUrl(null);
}
target_article.setDelete(article.getDelete());
List<Content> contents = article.getContents();
List<Content> contents_target = new ArrayList<Content>();
for (Content content : contents) {
Content content_target = new Content();
content_target.setDetail(content.getDetail());
content_target.setPage(content.getPage());
contents_target.add(content_target);
}
target_article.setContents(contents_target);
target_article.setTitle(article.getTitle());
target_article.setShortTitle(article.getShortTitle());
target_article.setSubTitle(article.getSubTitle());
target_article.setAuthor(article.getAuthor());
target_article.setOrigin(article.getOrigin());
target_article.setKeyword(article.getKeyword());
target_article.setTag(article.getTag());
target_article.setSummary(article.getSummary());
target_article.setImage(article.getImage());
target_article.setComment(article.getComment());
target_article.setType(article.getType());
target_article.setModified(article.getModified());
target_article.setPublished(article.getPublished());
target_article.setCreateTime(article.getCreateTime());
target_article.setInside(article.getInside());
target_article.setOwner(article.getOwner());
target_article.setContentTotal(article.getContentTotal());
ArticleMain articleMain_new = new ArticleMain();
articleMain_new.setArticle(target_article);
articleMain_new.setChannelId(target_channelId);
articleMainDAO.persist(articleMain_new);
articleMainDAO.flush(articleMain_new);
String target_channelName = channelDAO.get(target_channelId).getName();
operateTrackService.addOperateTrack(articleMainId, article.getStatusDescription(), "复制到『" + target_channelName + "』栏目。", "");
operateTrackService.addOperateTrack(articleMain_new.getId(), target_article.getStatusDescription(),"从『" + source_channelName + "』栏目复制。", "");
}
}
}
return true;
}
public void copyArticleMainFromShare(List<Long> articleMainIds, List<Integer> channelIds){
ArticleMain articleMain = null;
Article article = null;
for (Integer target_channelId : channelIds) {
for (Long articleMainId : articleMainIds) {
articleMain = articleMainDAO.get(articleMainId);
if (isNull(articleMain)) continue;
if (isNotNull(articleMain.getReference()) && articleMain.getReference()) continue;
article = articleMain.getArticle();
if (isNull(article)) continue;
if (articleMain.getChannelId() != null && target_channelId != articleMain.getChannelId()) {
Article target_article = new Article();
target_article.setStatus(Status.DRAFT);
target_article.setPublished(null);
if (article.getType() == Type.TITLE){
target_article.setUrl(article.getUrl());
}else{
target_article.setUrl(null);
}
target_article.setDelete(article.getDelete());
List<Content> contents = article.getContents();
List<Content> contents_target = new ArrayList<Content>();
for (Content content : contents) {
Content content_target = new Content();
content_target.setDetail(content.getDetail());
content_target.setPage(content.getPage());
contents_target.add(content_target);
}
target_article.setContents(contents_target);
target_article.setTitle(article.getTitle());
target_article.setShortTitle(article.getShortTitle());
target_article.setSubTitle(article.getSubTitle());
target_article.setAuthor(article.getAuthor());
target_article.setOrigin(article.getOrigin());
target_article.setKeyword(article.getKeyword());
target_article.setTag(article.getTag());
target_article.setSummary(article.getSummary());
target_article.setImage(article.getImage());
target_article.setComment(article.getComment());
target_article.setType(article.getType());
target_article.setModified(article.getModified());
target_article.setPublished(article.getPublished());
target_article.setCreateTime(article.getCreateTime());
target_article.setInside(article.getInside());
target_article.setOwner(EwcmsContextUtil.getUserName());
target_article.setContentTotal(article.getContentTotal());
ArticleMain articleMain_new = new ArticleMain();
articleMain_new.setArticle(target_article);
articleMain_new.setChannelId(target_channelId);
articleMainDAO.persist(articleMain_new);
articleMainDAO.flush(articleMain_new);
String target_channelName = channelDAO.get(target_channelId).getName();
operateTrackService.addOperateTrack(articleMainId, article.getStatusDescription(), "从共享库中复制到『" + target_channelName + "』栏目。", "");
operateTrackService.addOperateTrack(articleMain_new.getId(), target_article.getStatusDescription(),"从共享库中复制。", "");
}
}
}
}
public void refenceArticleMainFromShare(List<Long> articleMainIds, List<Integer> channelIds){
ArticleMain articleMain = null;
Article article = null;
for (Integer target_channelId : channelIds) {
for (Long articleMainId : articleMainIds) {
articleMain = articleMainDAO.get(articleMainId);
if (isNull(articleMain)) continue;
if (isNotNull(articleMain.getReference()) && articleMain.getReference()) continue;
article = articleMain.getArticle();
if (isNull(article)) continue;
if (articleMain.getChannelId() != null && target_channelId != articleMain.getChannelId()) {
ArticleMain articleMain_new = new ArticleMain();
articleMain_new.setArticle(article);
articleMain_new.setChannelId(target_channelId);
articleMain_new.setReference(true);
articleMain_new.setSort(articleMain.getSort());
articleMain_new.setTop(articleMain.getTop());
articleMainDAO.persist(articleMain_new);
articleMainDAO.flush(articleMain_new);
String target_channelName = channelDAO.get(target_channelId).getName();
operateTrackService.addOperateTrack(articleMainId, article.getStatusDescription(), "从共享库中引用到『" + target_channelName + "』栏目。", "");
operateTrackService.addOperateTrack(articleMain_new.getId(), article.getStatusDescription(),"从共享库中引用。", "");
}
}
}
}
@Override
public Boolean moveArticleMainToChannel(List<Long> articleMainIds, List<Integer> channelIds, Integer source_channelId) {
ArticleMain articleMain = null;
Channel channel = channelDAO.get(source_channelId);
Assert.notNull(channel);
String source_channelName = channel.getName();
for (Integer target_channelId : channelIds) {
for (Long articleMainId : articleMainIds) {
articleMain = articleMainDAO.findArticleMainByArticleMainAndChannel(articleMainId, source_channelId);
if (isNull(articleMain)) continue;
if (target_channelId != source_channelId) {
Article article = articleMain.getArticle();
operateTrackService.addOperateTrack(articleMainId, article.getStatusDescription(), "从『" + source_channelName + "』栏目移动。", "");
articleMain.setArticle(article);
articleMain.setChannelId(target_channelId);
articleMainDAO.merge(articleMain);
}
}
}
return true;
}
@Override
public List<ArticleMain> findArticleMainByChannel(Integer channelId) {
return articleMainDAO.findArticleMainByChannel(channelId);
}
@Override
public void pubArticleMainByChannel(Integer channelId, Boolean again, Boolean children) throws PublishException {
if (isNotNull(channelId)) {
Channel channel = channelDAO.get(channelId);
if (!channel.getPublicenable()){
throw new PublishException("栏目不允许发布文章");
}
List<ArticleMain> articleMains = articleMainDAO.findArticleMainByTitlePrerelease();
if (articleMains != null && !articleMains.isEmpty()){
for (ArticleMain articleMain : articleMains){
Article article = articleMain.getArticle();
if (article != null && article.getUrl().trim().length() > 0){
article.setStatus(Article.Status.RELEASE);
articleMain.setArticle(article);
articleMainDAO.merge(articleMain);
}
}
}
webPublish.publishChannel(channelId, again, children);
}
}
@Override
public void associateRelease(Integer channelId) throws PublishException{
if (isNotNull(channelId)){
pubArticleMainByChannel(channelId, false, false);
List<Template> templates = templateDAO.getTemplatesInChannel(channelId);
if (templates != null && !templates.isEmpty()){
for (Template template : templates){
webPublish.publishTemplateContent(template.getId(), false);
}
}
List<Channel> channelChildrens = channelDAO.getChannelChildren(channelId);
if (channelChildrens != null && !channelChildrens.isEmpty()){
for (Channel channelChildren : channelChildrens){
if (channelChildren.getPublicenable())
associateRelease(channelChildren.getId());
}
}
Channel channel = channelDAO.get(channelId);
String appChannel = channel.getAppChannel();
if (appChannel != null && appChannel.length() > 0){
String[] appChannelIds = appChannel.split(",");
for (String id : appChannelIds){
try{
Integer tempId = Integer.valueOf(id);
pubArticleMainByChannel(tempId, false, false);
}catch(Exception e){
}
}
}
}
}
@Override
public Boolean reviewArticleMainIsEffective(Long articleMainId, Integer channelId){
if (isNull(articleMainId) && isNull(channelId)) return false;
ArticleMain articleMain = articleMainDAO.findArticleMainByArticleMainAndChannel(articleMainId, channelId);
if (isNull(articleMain)) return false;
Article article = articleMain.getArticle();
if (isNull(article)) return false;
if (article.getStatus() == Status.REVIEW){
ReviewProcess rp = reviewProcessDAO.findReviewProcessByIdAndChannel(article.getReviewProcess().getId(), channelId);
List<ReviewUser> reviewUsers = rp.getReviewUsers();
List<ReviewGroup> reviewGroups = rp.getReviewGroups();
if (reviewUsers.isEmpty() && reviewGroups.isEmpty()){
return false;
}
String userName = EwcmsContextUtil.getUserName();
if (isNull(userName) || userName.length() == 0) return false;
for (ReviewUser reviewUser : reviewUsers){
if (reviewUser.getUserName().equals(userName)){
return true;
}
}
Collection<String> grouptNames = EwcmsContextUtil.getGroupnames();
if (isNull(grouptNames)) return false;
for (ReviewGroup reviewGroup : reviewGroups){
for (String groupName : grouptNames){
if (reviewGroup.getGroupName().equals(groupName)){
return true;
}
}
}
}
return false;
}
@Override
public void reviewArticleMain(Long articleMainId, Integer channelId, Integer review, String reason) {
ArticleMain articleMain = null;
Article article = null;
Assert.notNull(articleMainId);
articleMain = articleMainDAO.findArticleMainByArticleMainAndChannel(articleMainId, channelId);
if (isNull(articleMain)) return;
article = articleMain.getArticle();
if (isNull(article)) return;
if (article.getStatus() == Status.REVIEW) {
ReviewProcess rp = reviewProcessDAO.findReviewProcessByIdAndChannel(article.getReviewProcess().getId(), channelId);
String currentStatus = article.getStatusDescription();
String caption = "";
if (review == 0){// 通过
if (rp != null){
caption = "【" + rp.getName() + "】<span style='color:blue;'>通过</span>";
if (rp.getNextProcess() != null) {
article.setReviewProcess(rp.getNextProcess());
caption += ",已提交到【" + rp.getNextProcess().getName() + "】进行审核。";
}else{
article.setStatus(Status.PRERELEASE);
article.setReviewProcess(null);
caption += ",可以进行发布。";
}
}else{
article.setStatus(Status.REVIEWBREAK);
caption = "审核流程已改变,不能再进行审核。请联系频道管理员恢复到重新编辑状态。";
}
}else if (review == 1){// 不通过
if (rp != null){
caption = "【" + rp.getName() + "】<span style='color:red;'>不通过</span>";
if (rp.getPrevProcess() != null){
article.setReviewProcess(rp.getPrevProcess());
caption += ",已退回到【" + rp.getPrevProcess().getName() + "】进行重新审核。";
}else{
article.setStatus(Status.REEDIT);
article.setReviewProcess(null);
caption += ",已退回到重新编辑状态。";
}
}else{
article.setStatus(Status.REVIEWBREAK);
caption = "审核流程已改变,不能再进行审核。请联系频道管理员章恢复到重新编辑状态。";
}
}
articleMain.setArticle(article);
articleMainDAO.merge(articleMain);
operateTrackService.addOperateTrack(articleMainId, currentStatus, caption, reason);
}
}
@Override
public void moveArticleMainSort(Long articleMainId, Integer channelId, Long sort, Integer isInsert, Boolean isTop) {
ArticleMain articleMain = articleMainDAO.findArticleMainByChannelAndEqualSort(channelId, sort, isTop);
String desc = "设置排序号为:" + sort + "。";
if (articleMain == null){
articleMain = articleMainDAO.findArticleMainByArticleMainAndChannel(articleMainId, channelId);
Assert.notNull(articleMain);
articleMain.setSort(sort);
articleMainDAO.merge(articleMain);
}else{
ArticleMain articleMain_new = articleMainDAO.findArticleMainByArticleMainAndChannel(articleMainId, channelId);
Assert.notNull(articleMain_new);
articleMain_new.setSort(sort);
if (isInsert == 0){//插入
List<ArticleMain> articleMains = articleMainDAO.findArticleMainByChannelAndThanSort(channelId, sort, isTop);
if (!articleMains.isEmpty()){
for (ArticleMain articleMain_old : articleMains){
if (articleMain_new.getId() == articleMain_old.getId()) continue;
articleMain_old.setSort(articleMain_old.getSort() + 1);
articleMainDAO.merge(articleMain_old);
}
}
desc = "插入排序号为:" + sort + "。";
articleMainDAO.merge(articleMain_new);
}else if (isInsert == 1){//替换
if (articleMain_new.getId() != articleMain.getId()){
articleMain.setSort(null);
articleMainDAO.merge(articleMain);
desc = "替换排序号为:" + sort + "。";
articleMainDAO.merge(articleMain_new);
}
}
}
operateTrackService.addOperateTrack(articleMainId, articleMain.getArticle().getStatusDescription(), desc, "");
}
@Override
public Boolean findArticleMainByChannelAndEqualSort(Integer channelId, Long sort, Boolean isTop) {
ArticleMain articleMain = articleMainDAO.findArticleMainByChannelAndEqualSort(channelId, sort, isTop);
if (articleMain == null) return false;
return true;
}
@Override
public void clearArticleMainSort(List<Long> articleMainIds, Integer channelId) {
Assert.notNull(articleMainIds);
for (Long articleMainId : articleMainIds){
ArticleMain articleMain = articleMainDAO.findArticleMainByArticleMainAndChannel(articleMainId, channelId);
Assert.notNull(articleMain);
if (articleMain.getSort() != null){
articleMain.setSort(null);
articleMainDAO.merge(articleMain);
operateTrackService.addOperateTrack(articleMainId, articleMain.getArticle().getStatusDescription(), "清除排序号。", "");
}
}
}
@Override
public void breakArticleMain(List<Long> articleMainIds, Integer channelId) throws BaseException {
for (Long articleMainId : articleMainIds){
ArticleMain articleMain = articleMainDAO.get(articleMainId);
Assert.notNull(articleMain);
Article article = articleMain.getArticle();
Assert.notNull(article);
if (article.getStatus() == Status.PRERELEASE || article.getStatus() == Status.RELEASE || article.getStatus() == Status.REVIEWBREAK){
operateTrackService.addOperateTrack(articleMainId, article.getStatusDescription(), "已退回到重新编辑状态。", "");
article.setStatus(Status.REEDIT);
articleMain.setArticle(article);
articleMainDAO.merge(articleMain);
// }else{
// throw new BaseException("","只有在审核中断、发布版、已发布版状态下才能退回");
}
}
}
@Override
public String getArticleOperateTrack(Long trackId){
OperateTrack track = operateTrackService.findOperateTrackById(trackId);
if (track == null) return "";
return (track.getReason() == null)? "" : track.getReason();
}
@Override
public void delArticleMainByCrawler(Integer channelId, String userName) {
List<ArticleMain> articleMains = articleMainDAO.findArticleMainByChannelIdAndUserName(channelId, userName);
for (ArticleMain articleMain : articleMains){
if (articleMain.getArticle().getStatus() == Status.RELEASE) continue;
articleMainDAO.remove(articleMain);
}
}
@Override
public void topArticleMain(List<Long> articleMainIds, Boolean top) {
Assert.notNull(articleMainIds);
for (Long articleMainId : articleMainIds){
ArticleMain articleMain = articleMainDAO.get(articleMainId);
if (articleMain == null) continue;
if (articleMain.getTop() != top){
articleMain.setTop(top);
articleMainDAO.merge(articleMain);
String desc = "设为置顶。";
if (!top) desc = "取消置顶。";
operateTrackService.addOperateTrack(articleMainId, articleMain.getArticle().getStatusDescription(), desc, "");
}
}
}
@Override
public Boolean findArticleIsEntityByArticleAndCategory(Long articleId, Long categoryId) {
return articleMainDAO.findArticleIsEntityByArticleAndCategory(articleId, categoryId);
}
@Override
@History(modelObjectIndex = 0)
public Long addArticleMain(Article article, Integer channelId, Date published) {
Assert.notNull(article);
if (isNotNull(published)) {
article.setPublished(published);
}
if (isNull(article.getOwner())){
article.setOwner(EwcmsContextUtil.getUserName());
}
article.setModified(new Date(Calendar.getInstance().getTime().getTime()));
if (article.getType() == Type.TITLE){
titleArticleContentNull(article);
}else{
keywordAndSummary(article);
}
ArticleMain articleMain = new ArticleMain();
articleMain.setArticle(article);
articleMain.setChannelId(channelId);
articleMainDAO.persist(articleMain);
articleMainDAO.flush(articleMain);
operateTrackService.addOperateTrack(articleMain.getId(), article.getStatusDescription(), "创建。", "");
return articleMain.getId();
}
@Override
public Long addArticleMainByCrawler(Article article, Integer channelId, String userName){
Assert.notNull(article);
if (articleMainDAO.findArticleTitleIsEntityByCrawler(article.getTitle(), channelId, userName))
return null;
article.setOwner(userName);
article.setModified(new Date(Calendar.getInstance().getTime().getTime()));
//keywordAndSummary(article);
ArticleMain articleMain = new ArticleMain();
articleMain.setArticle(article);
articleMain.setChannelId(channelId);
articleMainDAO.persist(articleMain);
articleMainDAO.flush(articleMain);
operateTrackService.addOperateTrack(articleMain.getId(), article.getStatusDescription(), "通过采集器创建。", "", userName, "网络爬虫");
return articleMain.getId();
}
public Long findArticleMainCountByCrawler(Integer channelId, String userName){
return articleMainDAO.findArticleMainCountByCrawler(channelId, userName);
}
@Override
@History(modelObjectIndex = 0)
public Long updArticleMain(Article article, Long articleMainId, Integer channelId, Date published) {
ArticleMain articleMain = articleMainDAO.findArticleMainByArticleMainAndChannel(articleMainId, channelId);
Assert.notNull(articleMain);
if (isNotNull(published)) {
article.setPublished(published);
}
// if (article.getStatus() == Status.RELEASE || article.getStatus() == Status.PRERELEASE || article.getStatus() == Status.REVIEW) {
// // throw new BaseException("error.document.article.notupdate","只能在初稿或重新编辑下才能修改");
// } else {
Article article_old = articleMain.getArticle();
Assert.notNull(article_old);
if (article.getType() == Type.GENERAL) {
article.setUrl(null);
keywordAndSummary(article);
} else if (article.getType() == Type.TITLE) {
article.setKeyword("");
article.setSummary("");
if (article_old.getContents() != null && !article_old.getContents().isEmpty()) {
article.setContents(article_old.getContents());
} else {
titleArticleContentNull(article);
}
}
Date modNow = new Date(Calendar.getInstance().getTime().getTime());
article.setOwner(article_old.getOwner());
article.setCreateTime(article_old.getCreateTime());
article.setModified(modNow);
article.setStatus(Article.Status.REEDIT);
article.setRelations(article_old.getRelations());
articleMain.setArticle(article);
articleMainDAO.merge(articleMain);
operateTrackService.addOperateTrack(articleMainId, article_old.getStatusDescription(), "修改。", "");
// }
return articleMain.getId();
}
private void keywordAndSummary(Article article){
List<Content> contents = article.getContents();
String title = article.getTitle();
if (contents != null && !contents.isEmpty() && title != null && title.length()>0){
String contentAll = "";
for (Content content : contents){
contentAll += content.getDetail();
}
if (article.getKeyword() == null || article.getKeyword().length() == 0){
String keyword = HtmlStringUtil.join(ExtractKeywordAndSummary.getKeyword(title + " " + contentAll), " ");
article.setKeyword(keyword);
}
if (article.getSummary() == null || article.getSummary().length() == 0){
String summary = ExtractKeywordAndSummary.getTextAbstract(title, contentAll);
article.setSummary(summary);
}
}
}
private void titleArticleContentNull(Article article){
Content content = new Content();
content.setDetail(null);
content.setPage(1);
List<Content> contents = new ArrayList<Content>();
contents.add(content);
article.setContents(contents);
}
@Override
public Map<Channel, Long> findBeApprovalArticleMain(String userName) {
Map<Channel, Long> result = new HashMap<Channel, Long>();
List<String> groupNames = new ArrayList<String>();
UserDetails user = userService.loadUserByUsername(userName);
if (user != null){
Collection<GrantedAuthority> authorites = user.getAuthorities();
for(GrantedAuthority auth: authorites){
if(StringUtils.startsWith(auth.getAuthority(),GroupServiceable.GROUP_NAME_PERFIX)){
groupNames.add(auth.getAuthority());
}
}
}
Map<Integer, Long> map = articleMainDAO.findBeApprovalArticleMain(userName, groupNames);
if (!map.isEmpty()){
Set<Integer> keySets = map.keySet();
for (Integer key : keySets){
Channel channel = channelDAO.get(key);
Long count = map.get(key);
result.put(channel, count);
}
}
return result;
}
@Override
public Map<Integer, Long> findCreateArticleFcfChart(Integer year, Integer siteId) {
return articleMainDAO.findCreateArticleFcfChart(year, siteId);
}
@Override
public Map<Integer, Long> findReleaseArticleFcfChart(Integer year, Integer siteId) {
return articleMainDAO.findReleaseArticleFcfChart(year, siteId);
}
@Override
public Map<String, Long> findReleaseArticlePersonFcfChart(Integer year, Integer siteId) {
return articleMainDAO.findReleaseArticlePersonFcfChart(year, siteId);
}
@Override
public ArticleMain findArticleMainById(Long articleMainId) {
return articleMainDAO.get(articleMainId);
}
@Override
public void referArticleMain(Integer channelId, Long[] articleMainIds) {
Assert.notNull(channelId);
Assert.notEmpty(articleMainIds);
Channel channel = channelDAO.get(channelId);
Channel parentChannel = channel.getParent();
if (parentChannel.getType() == Channel.Type.LEADER){
for (Long articleMainId : articleMainIds){
ArticleMain articleMain = articleMainDAO.get(articleMainId);
if (articleMain == null) continue;
ArticleMain refArticleMain = new ArticleMain();
refArticleMain.setArticle(articleMain.getArticle());
refArticleMain.setChannelId(channelId);
refArticleMain.setReference(true);
refArticleMain.setSort(articleMain.getSort());
refArticleMain.setTop(articleMain.getTop());
articleMainDAO.persist(refArticleMain);
}
}
}
@Override
public void removeArticleMain(Long[] articleMainIds) {
Assert.notNull(articleMainIds);
Assert.notEmpty(articleMainIds);
for (Long articleMainId : articleMainIds){
ArticleMain articleMain = articleMainDAO.get(articleMainId);
Assert.notNull(articleMain);
if (articleMain.getReference()){
articleMain.setArticle(null);
articleMainDAO.merge(articleMain);
articleMainDAO.remove(articleMain);
}
}
}
@Override
public void shareArticleMain(List<Long> articleMainIds, Boolean share) {
Assert.notNull(articleMainIds);
for (Long articleMainId : articleMainIds){
ArticleMain articleMain = articleMainDAO.get(articleMainId);
if (articleMain == null) continue;
if (isNotNull(articleMain.getReference()) && articleMain.getReference()) continue;
if (articleMain.getShare() != share){
articleMain.setShare(share);
articleMainDAO.merge(articleMain);
String desc = "设为共享。";
if (!share) desc = "取消共享。";
operateTrackService.addOperateTrack(articleMainId, articleMain.getArticle().getStatusDescription(), desc, "");
}
}
}
}