/* ================================================================== * 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.action; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import com.jinhe.tss.cms.CMSConstants; import com.jinhe.tss.cms.entity.Article; import com.jinhe.tss.cms.entity.Attachment; import com.jinhe.tss.cms.entity.Channel; import com.jinhe.tss.cms.entity.ChannelArticle; import com.jinhe.tss.cms.helper.ArticleHelper; import com.jinhe.tss.cms.helper.ArticleQueryCondition; import com.jinhe.tss.cms.helper.parser.ArticleGridParser; import com.jinhe.tss.cms.helper.translator.ChannelCanSelectTranslator; import com.jinhe.tss.cms.helper.translator.ExcludeSiteNodeTranslator; import com.jinhe.tss.cms.service.IArticleService; import com.jinhe.tss.cms.service.IChannelService; import com.jinhe.tss.cms.workflow.WorkFlow; import com.jinhe.tss.cms.workflow.WorkFlowManager; import com.jinhe.tss.cms.workflow.WorkFlowNode.WorkerFlowButton; import com.jinhe.tss.component.dynproperty.support.IRemotePropertyService; import com.jinhe.tss.component.support.persistence.pagequery.PageInfo; import com.jinhe.tss.component.support.web.webwork.PTActionSupport; import com.jinhe.tss.core.Config; import com.jinhe.tss.core.cachepool.CacheManager; import com.jinhe.tss.core.cachepool.IPool; import com.jinhe.tss.core.exception.BusinessException; import com.jinhe.tss.core.sso.Environment; import com.jinhe.tss.core.util.EasyUtils; import com.jinhe.tss.core.util.XMLDocUtil; import com.jinhe.tss.core.web.dispaly.grid.GridDataEncoder; import com.jinhe.tss.core.web.dispaly.tree.LevelTreeParser; import com.jinhe.tss.core.web.dispaly.tree.TreeEncoder; import com.jinhe.tss.core.web.dispaly.xform.XFormEncoder; import com.jinhe.tss.um.permission.PermissionHelper; public class ArticleAction extends PTActionSupport { private static final long serialVersionUID = -4529854543499272897L; private IArticleService articleService; private IChannelService channelService; private IRemotePropertyService propertyService; private Article article = new Article(); // 文章信息 private ArticleQueryCondition condition = new ArticleQueryCondition(); // 相关的文章信息 private Long articleId; private Long channelId; private Long toArticleId; private Long oldChannelId; private Integer copyTo; // 标记值区分"复制"与"复制到"。 0:复制;1:复制到。 private Integer isTop; // 前台是否置顶的标记 private String articleContent; // 正文内容 private String isCommit; // 判断修改文章的时候是否是保存并提交 private String attachList; // 附件列表 private String associateArticleIds; // 相关文章id private String distributeToChannelIds; // 分发文章 // 分页信息 private Integer page; private String field; private Integer orderType; private int direction; //-1 向上 1:向下 //流程相关 private Integer status; //文章流程状态 private Integer oldStatus; //以前的流程状态 private Integer workflowId; /** * <p> * 获取栏目下文章列表 * </p> * @return */ public String getChannelArticles() { if (channelId == null) throw new BusinessException("栏目id为空!"); String orderBy; if(orderType == null || orderType > 0) { orderBy = field; } else { orderBy = field + " desc "; } PageInfo pageInfo = articleService.getChannelArticles(channelId, page, orderBy); Channel channel = channelService.getChannelById(channelId); List<Article> articles = new ArrayList<Article>(); List<?> list = pageInfo.getItems(); if ( !EasyUtils.isNullOrEmpty(list) ) { for ( Object temp : list ) { Article article = ArticleHelper.createArticle((Object[]) temp); articles.add(article); } } String entityCode = channel.getArticlesInChannelEntityCode(); String gridTemplate = propertyService.getGridTemplate(entityCode, CMSConstants.GRID_TEMPLATE_CODE); GridDataEncoder gEncoder = new GridDataEncoder(articles, XMLDocUtil.dataXml2Doc(gridTemplate), new ArticleGridParser()); String[] flowSteps = WorkFlowManager.getInstance().getFlowStepStatusAndNames(channel.getWorkflowId()); gEncoder.getTemplet().setColumnAttribute("status", "editorvalue", flowSteps[0]); gEncoder.getTemplet().setColumnAttribute("status", "editortext", flowSteps[1]); return print(new String[]{"ArticleList", "PageList"}, new Object[]{gEncoder, pageInfo}); } /** * 初始化文章新增信息 */ public String initArticleInfo() { Channel channel = channelService.getChannelById(channelId); String entityCode = channel.getArticlesInChannelEntityCode(); Map<String, String> map = propertyService.getXFormTemplate(entityCode, CMSConstants.XFORM_TEMPLATE_CODE); String template = (String) (map.get(CMSConstants.ARTICLE_TEMPLATE_TAB_NAME)); if(template == null) throw new BusinessException("此文章类型没有进行表单布局设置,请先转到动态属性管理页面设置!"); Map<String, Object> initMap = new HashMap<String, Object>(); initMap.put("articleTypeId", channel.getArticleTypeId()); initMap.put("isTop", CMSConstants.FALSE); initMap.put("author", Environment.getUserName()); // 默认作者为登录者,前台可进行修改 Document doc = XMLDocUtil.dataXml2Doc(template); XFormEncoder baseXFormEncoder = new XFormEncoder(XMLDocUtil.dataXml2Doc(template), initMap, false, false); if (-1 != (doc.asXML().toString()).indexOf("name=\"hitCount\"")) { baseXFormEncoder.setColumnAttribute("hitCount", "editable", "false"); } if (-1 != (doc.asXML().toString()).indexOf("name=\"status\"")) { baseXFormEncoder.setColumnAttribute("status", "editable", "false"); } Long tempArticleId = System.currentTimeMillis(); articleService.createChannelArticleRelation(channelId, tempArticleId); // 创建临时文章ID跟栏目关系,预览附件图片时有用(查找站点文件目录) Map<String, Object> initMap4Upload = new HashMap<String, Object>(); initMap4Upload.put("id", tempArticleId); initMap4Upload.put("channelId", channelId); XFormEncoder uploadXFormEncoder = new XFormEncoder(CMSConstants.XFORM_TEMPLATE_ARTICLEUPLOAD, initMap4Upload); GridDataEncoder filesGridEncoder = new GridDataEncoder(new ArrayList<Object>(), CMSConstants.TEMPLATE_ATTACHSLIST); return print(new String[]{"ArticleInfo", "ArticleContent", "AttachsUpload", "AttachsList"}, new Object[]{baseXFormEncoder, "<![CDATA[]]>", uploadXFormEncoder, filesGridEncoder}); } /** * 获取文章信息 */ public String getArticleInfo() { Article article = articleService.getArticleById(articleId); article.setChannelId(channelId); Map<String, String> map = propertyService.getXFormTemplate(article.getEntityCode(), CMSConstants.XFORM_TEMPLATE_CODE); String template = (String) (map.get(CMSConstants.ARTICLE_TEMPLATE_TAB_NAME)); if(template == null) throw new BusinessException("此文章类型没有进行表单布局设置,请先转到动态属性管理页面设置!"); Document doc = XMLDocUtil.dataXml2Doc(template); XFormEncoder baseXFormEncoder = new XFormEncoder(doc, article, false, false); if(-1 != (doc.asXML().toString()).indexOf("name=\"hitCount\"")) baseXFormEncoder.setColumnAttribute("hitCount", "editable", "false"); if(-1 != (doc.asXML().toString()).indexOf("name=\"status\"")) baseXFormEncoder.setColumnAttribute("status", "editable", "false"); XFormEncoder uploadXFormEncoder = new XFormEncoder(CMSConstants.XFORM_TEMPLATE_ARTICLEUPLOAD, article); List<Attachment> attachments = new ArrayList<Attachment>(article.getAttachments().values()); GridDataEncoder uploadGridEncoder = new GridDataEncoder(attachments, CMSConstants.TEMPLATE_ATTACHSLIST); return print(new String[]{"ArticleInfo", "ArticleContent", "AttachsUpload", "AttachsList"}, new Object[]{baseXFormEncoder, "<![CDATA[" + article.getContent() + "]]>", uploadXFormEncoder, uploadGridEncoder}); } /** * 保存文章。或者是保存并提交文章。 */ public String saveArticleInfo() { if( Config.TRUE.equalsIgnoreCase(isCommit) ){ article.setStatus(CMSConstants.TOPUBLISH_STATUS); } article.setContent(articleContent); if(article.getId() == null || article.getId().longValue() == 0) { //新增的时候上传的附件对象以new Date()为主键,此处的"articleId"就是这个值 articleService.createArticle(article, channelId, attachList, articleId); } else { articleService.updateArticle(article, channelId, attachList); } return printSuccessMessage(); } /** * 删除文章 */ public String deleteArticle() { if (articleId == null) throw new BusinessException("文章id为空!"); articleService.deleteArticle(articleId, channelId); return printSuccessMessage("删除文章成功"); } /** * 移动文章(跨栏目移动) */ public String moveArticle() { if (channelId == null || oldChannelId == null) throw new BusinessException("栏目id为空!"); if (articleId == null) throw new BusinessException("文章id为空!"); articleService.moveArticle(articleId, oldChannelId, channelId); return printSuccessMessage("移动文章成功"); } /** * 文章排序 */ public String moveArticleDownOrUp() { articleService.moveArticleDownOrUp(articleId, toArticleId, channelId); return printSuccessMessage("文章排序成功"); } /** * 跨页的文章排序 */ public String moveArticleDownOrUpCross(){ articleService.moveArticleDownOrUpCross(articleId, channelId, page, direction); return printSuccessMessage("文章排序(跨页)成功"); } /** * 文章锁定 */ public String lockingArticle() { articleService.lockingArticle(articleId); return printSuccessMessage("锁定文章成功"); } /** * 文章解锁 */ public String unLockingArticle() { articleService.unLockingArticle(articleId); return printSuccessMessage("解除锁定成功"); } /** * 改变文章状态 */ public String changeArticleStatus() { articleService.changeArticleStatus(articleId, oldStatus, status, workflowId); return printSuccessMessage("状态改变成功"); } /** * 获取文章流程信息 */ public String getWorkFlowStatus() { if (CMSConstants.LOCKING_STATUS.equals(status)) status = CMSConstants.START_STATUS; // 当文章的状态为XMLSTATUS时,转换成PUBLISHSTATUS(待发布)状态来处理流程 if (CMSConstants.XML_STATUS.equals(status)) status = CMSConstants.TOPUBLISH_STATUS; Document doc = DocumentHelper.createDocument(); Element workflowElement = doc.addElement("WorkFlow"); Element nextButtonElement = workflowElement.addElement("NextButton"); WorkFlowManager wfManager = WorkFlowManager.getInstance(); WorkerFlowButton fb = wfManager.getNextButton(workflowId, status); if (fb != null) { String operationId = fb.getStatus().toString(); if (articleService.getArticleWorkflowPermission(operationId, CMSConstants.DEFAULT_WORKFLOW_ID)) { Element buttonElement = nextButtonElement.addElement("Button"); buttonElement.addAttribute("name", fb.getButton()); buttonElement.addAttribute("id", fb.getStatus().toString()); } } Map<Integer, WorkerFlowButton> map = wfManager.getPreviews(workflowId, status); Element previewButtonElement = workflowElement.addElement("PreviewButton"); for ( WorkerFlowButton pfb : map.values()) { String operationId = "-" + pfb.getStatus(); // 加 - 号表示逆流程 if (articleService.getArticleWorkflowPermission(operationId, CMSConstants.DEFAULT_WORKFLOW_ID)) { Element buttonElement = previewButtonElement.addElement("Button"); buttonElement.addAttribute("name", pfb.getButton()); buttonElement.addAttribute("id", pfb.getStatus().toString()); } } return print("ArticleWorkFlow", doc.asXML()); } /** * 获取工作流信息 */ public String getWorkFlowTree() { List<WorkFlow> list = new ArrayList<WorkFlow>(); IPool pool = CacheManager.getInstance().getCachePool("workflows_info"); List<?> codeList = WorkFlowManager.getInstance().getWorkFlowCodes(); for( Object code : codeList ){ WorkFlow flow = (WorkFlow) pool.getObject(code).getValue(); list.add(flow); } TreeEncoder encoder = new TreeEncoder(list); encoder.setRootCanSelect(false); return print("WorkFlowTree", encoder); } /** * 根据对栏目的权限过滤对文章的权限 */ public String getArticleOperation(){ PermissionHelper permissionHelper = PermissionHelper.getInstance(); List<?> operations = permissionHelper.getOperationsByResource(CMSConstants.RESOURCE_TYPE_CHANNEL, channelId, Environment.getOperatorId()); String permissionAll = "p1,p2,"; for ( Object operation : operations ) { permissionAll += "a_" + operation + ","; } permissionAll += "cd1,cd2,cd3,cd4,cd5,ca1,ca2,ca3,ca4,ca5"; return print("Operation", permissionAll); } /** * 文章的复制和复制到 */ public String copyArticle(){ if (channelId == null) throw new BusinessException("栏目id为空!"); if (articleId == null) throw new BusinessException("文章id为空!"); articleService.copyArticle(articleId, channelId, CMSConstants.TRUE.equals(copyTo)); return printSuccessMessage("复制成功"); } /** * 转载文章 */ public String reshipArticle(){ if (channelId == null) throw new BusinessException("栏目id为空!"); if (articleId == null) throw new BusinessException("文章id为空!"); articleService.reshipArticle(articleId, channelId, oldChannelId); return printSuccessMessage("转载成功"); } /** * 文章置顶和取消置顶 */ public String doOrUndoTopArticle(){ if(CMSConstants.TRUE.equals(isTop)){ articleService.undoTopArticle(articleId, channelId); return printSuccessMessage("置顶成功"); } articleService.doTopArticle(articleId, channelId); return printSuccessMessage("取消置顶成功"); } /** * 获得指定文章的关联信息 */ public String getArticleExistRelationship(){ Object[] data = articleService.getArticleExistRelationship(articleId); TreeEncoder treeEncoder = new TreeEncoder(data[0], new LevelTreeParser()); treeEncoder.setTranslator(new ExcludeSiteNodeTranslator()); return print( new String[] { "AssociateArticleTree", "AssociateArticleExistTree" }, new Object[]{ treeEncoder, new TreeEncoder(data[1]) } ); } /** * 获得栏目的文章列表以建立起关联关系 */ public String getPageArticlesByChannel() { PageInfo pageInfo = articleService.getChannelArticles(channelId, page); List<Article> articles = new ArrayList<Article>(); List<?> list = pageInfo.getItems(); if ( !EasyUtils.isNullOrEmpty(list) ) { for ( Object temp : list ) { Article article = ArticleHelper.createArticle((Object[]) temp); articles.add(article); } } return print("AssociateArticleList", new TreeEncoder( articles )); } /** * 保存相关文章关系 */ public String relatedArticleTo(){ articleService.relatedArticleTo(articleId, associateArticleIds); return printSuccessMessage("成功保存文章的关联关系!"); } /** * 获得文章分发关系信息 */ public String getDistributeArticleRelationShip(){ Object[] objects = articleService.getDistributeArticleRelationShip(articleId, channelId); TreeEncoder treeEncoder = new TreeEncoder(objects[0], new LevelTreeParser()); treeEncoder.setTranslator(new ChannelCanSelectTranslator((String) objects[1], channelId)); treeEncoder.setNeedRootNode(false); TreeEncoder channelEncoder = new TreeEncoder(objects[2]); channelEncoder.setTranslator(new ExcludeSiteNodeTranslator()); channelEncoder.setRootCanSelect(false); return print(new String[]{"distributeArticleTree", "distributeArticleExistTree"}, new Object[]{treeEncoder, channelEncoder}); } /** * 保存文章分发关系信息 */ public String saveDistributeArticleRelationShip(){ articleService.saveDistributeArticleRelationShip(articleId, channelId, distributeToChannelIds); return printSuccessMessage("保存成功"); } /** * 获得文章来源信息 */ public String getDistributeArticleSource(){ ChannelArticle ca = articleService.getChannelArticle(articleId, channelId); XFormEncoder xEncoder = new XFormEncoder(CMSConstants.XFORM_TEMPLATE_ARTICLE_SOURCE, ca); return print("DistributeSource", xEncoder); } /** * 获取搜索文章的查询模板 * @return */ public String getSearchArticleTemplate() { XFormEncoder xEncoder = new XFormEncoder(CMSConstants.XFORM_TEMPLATE_SEARCH_ARTICLE); return print("SearchArticle", xEncoder); } /** * 搜索文章列表 */ public String getArticleList() { Object[] data = articleService.searchArticleList(condition); GridDataEncoder gEncoder = new GridDataEncoder(data[0], CMSConstants.GRID_TEMPLATE_ARTICLELIST, new ArticleGridParser()); return print(new String[]{"ArticleList", "PageList"}, new Object[]{gEncoder, (PageInfo)data[1]}); } public Article getArticle() { return article; } public ArticleQueryCondition getCondition() { return condition; } public void setArticleContent(String articleContent) { this.articleContent = articleContent; } public void setArticleId(Long articleId) { this.articleId = articleId; } public void setAssociateArticleIds(String associateArticleIds) { this.associateArticleIds = associateArticleIds; } public void setAttachList(String attachList) { this.attachList = attachList; } public void setChannelId(Long channelId) { this.channelId = channelId; } public void setCopyTo(Integer copyTo) { this.copyTo = copyTo; } public void setDistributeToChannelIds(String distributeToChannelIds) { this.distributeToChannelIds = distributeToChannelIds; } public void setField(String field) { this.field = field; } public void setIsTop(Integer isTop) { this.isTop = isTop; } public void setToArticleId(Long newArticleId) { this.toArticleId = newArticleId; } public void setOldChannelId(Long oldChannelId) { this.oldChannelId = oldChannelId; } public void setOldStatus(Integer oldStatus) { this.oldStatus = oldStatus; } public void setOrderType(Integer orderType) { this.orderType = orderType; } public void setPage(Integer page) { this.page = page; } public void setStatus(Integer status) { this.status = status; } public void setWorkflowId(Integer workflowId) { this.workflowId = workflowId; } public void setDirection(int direction) { this.direction = direction; } public void setIsCommit(String isCommit) { this.isCommit = isCommit; } public void setPropertyService(IRemotePropertyService propertyService) { this.propertyService = propertyService; } public void setService(IArticleService service) { this.articleService = service; } public void setChannelService(IChannelService channelService) { this.channelService = channelService; } }