package com.jspxcms.core.web.back;
import static com.jspxcms.core.support.Constants.CREATE;
import static com.jspxcms.core.support.Constants.DELETE_SUCCESS;
import static com.jspxcms.core.support.Constants.EDIT;
import static com.jspxcms.core.support.Constants.MESSAGE;
import static com.jspxcms.core.support.Constants.OPERATION_SUCCESS;
import static com.jspxcms.core.support.Constants.OPRT;
import static com.jspxcms.core.support.Constants.SAVE_SUCCESS;
import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.web.PageableDefaults;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.jspxcms.common.util.RowSide;
import com.jspxcms.common.web.Servlets;
import com.jspxcms.core.domain.Info;
import com.jspxcms.core.domain.Model;
import com.jspxcms.core.domain.Node;
import com.jspxcms.core.domain.NodeDetail;
import com.jspxcms.core.domain.User;
import com.jspxcms.core.domain.Workflow;
import com.jspxcms.core.fulltext.InfoFulltextService;
import com.jspxcms.core.generatepage.GeneratePageService;
import com.jspxcms.core.service.ModelService;
import com.jspxcms.core.service.NodeQueryService;
import com.jspxcms.core.service.NodeService;
import com.jspxcms.core.service.WorkflowService;
import com.jspxcms.core.support.Constants;
import com.jspxcms.core.support.Context;
import freemarker.template.TemplateException;
/**
* NodeController
*
* @author liufang
*
*/
@Controller
@RequestMapping("/core/node")
public class NodeController {
private static final Logger logger = LoggerFactory
.getLogger(NodeController.class);
@RequiresPermissions("core:node:left")
@RequestMapping("left.do")
public String left(HttpServletRequest request,
org.springframework.ui.Model modelMap) {
User user = Context.getCurrentUser(request);
Integer siteId = Context.getCurrentSiteId(request);
List<Node> list = query.findList(siteId, null);
Boolean allNode = user.getAllNode(siteId);
modelMap.addAttribute("allNode", allNode);
if (!allNode) {
modelMap.addAttribute("nodeRights", user.getNodeRights(siteId));
}
modelMap.addAttribute("list", list);
return "core/node/node_left";
}
@RequiresPermissions("core:node:list")
@RequestMapping("list.do")
public String list(
Integer queryParentId,
Boolean showDescendants,
@PageableDefaults(sort = { "treeNumber", "id" }, sortDir = Direction.ASC) Pageable pageable,
HttpServletRequest request, org.springframework.ui.Model modelMap) {
User user = Context.getCurrentUser(request);
Integer siteId = Context.getCurrentSiteId(request);
Node parent = null;
if (queryParentId != null) {
parent = query.get(queryParentId);
}
if (parent == null) {
parent = query.findRoot(siteId);
if (parent != null) {
queryParentId = parent.getId();
}
}
Map<String, String[]> params = Servlets.getParameterValuesMap(request,
Constants.SEARCH_PREFIX);
List<Node> list = query.findList(queryParentId, showDescendants,
user.getId(), user.getAllNode(siteId), params,
pageable.getSort());
List<Model> nodeModelList = modelService.findList(siteId,
Node.NODE_MODEL_TYPE);
modelMap.addAttribute("parent", parent);
modelMap.addAttribute("list", list);
modelMap.addAttribute("nodeModelList", nodeModelList);
modelMap.addAttribute("queryParentId", queryParentId);
modelMap.addAttribute("showDescendants", showDescendants);
return "core/node/node_list";
}
@RequiresPermissions("core:node:create")
@RequestMapping("create.do")
public String create(Integer cid, Integer parentId, Integer modelId,
Integer queryParentId, Boolean showDescendants,
HttpServletRequest request, org.springframework.ui.Model modelMap) {
Integer siteId = Context.getCurrentSiteId(request);
Node bean = null;
if (cid != null) {
bean = query.get(cid);
}
Node parent = null;
if (bean != null) {
if (bean.getParent() != null) {
parent = bean.getParent();
} else {
// 首页不能复制
cid = null;
bean = null;
parent = query.findRoot(siteId);
}
} else if (parentId != null) {
parent = query.get(parentId);
} else {
parent = query.findRoot(siteId);
}
Model model = null;
if (modelId != null) {
model = modelService.get(modelId);
} else if (parent != null && parent.getParent() != null) {
// 指定了父节点,且父节点不是根节点。
model = parent.getNodeModel();
} else if (query.findRoot(siteId) != null) {
// 根节点已经存在,获取默认节点模型
model = modelService.findDefault(siteId, Node.NODE_MODEL_TYPE);
// 没有定义节点模型
if (model == null) {
// TODO
throw new IllegalStateException("Node model not found!");
}
} else {
// 根节点不存在,获取默认首页模型
model = modelService.findDefault(siteId, Node.HOME_MODEL_TYPE);
// 没有定义首页模型
if (model == null) {
// TODO
throw new IllegalStateException("NodeHome model not found!");
}
}
String modelType = model.getType();
List<Model> nodeModelList = modelService.findList(siteId, modelType);
List<Model> infoModelList = modelService.findList(siteId,
Info.MODEL_TYPE);
Model infoModelDef = null;
if (!infoModelList.isEmpty()) {
infoModelDef = infoModelList.get(0);
}
List<Workflow> workflowList = workflowService.findList(siteId);
modelMap.addAttribute("workflowList", workflowList);
modelMap.addAttribute("cid", cid);
modelMap.addAttribute("bean", bean);
modelMap.addAttribute("parent", parent);
modelMap.addAttribute("model", model);
modelMap.addAttribute("nodeModelList", nodeModelList);
modelMap.addAttribute("infoModelDef", infoModelDef);
modelMap.addAttribute("infoModelList", infoModelList);
modelMap.addAttribute("queryParentId", queryParentId);
modelMap.addAttribute("showDescendants", showDescendants);
modelMap.addAttribute(OPRT, CREATE);
return "core/node/node_form";
}
@RequiresPermissions("core:node:edit")
@RequestMapping("edit.do")
public String edit(
Integer id,
Integer modelId,
Integer queryParentId,
Boolean showDescendants,
Integer position,
@PageableDefaults(sort = { "treeNumber", "id" }, sortDir = Direction.ASC) Pageable pageable,
HttpServletRequest request, org.springframework.ui.Model modelMap) {
User user = Context.getCurrentUser(request);
Integer siteId = Context.getCurrentSiteId(request);
Node bean = query.get(id);
Node parent = bean.getParent();
Map<String, String[]> params = Servlets.getParameterValuesMap(request,
Constants.SEARCH_PREFIX);
RowSide<Node> side = query.findSide(queryParentId, showDescendants,
user.getId(), user.getAllNode(siteId), params, bean, position,
pageable.getSort());
modelMap.addAttribute("bean", bean);
modelMap.addAttribute("side", side);
modelMap.addAttribute("position", position);
List<Model> infoModelList = modelService.findList(siteId,
Info.MODEL_TYPE);
List<Model> modelList = modelService.findList(siteId,
Node.NODE_MODEL_TYPE);
List<Model> nodeModelList;
if (bean.getParent() == null) {
// 首页模型
nodeModelList = modelService.findList(siteId, Node.HOME_MODEL_TYPE);
} else {
nodeModelList = modelList;
}
Model model;
// 允许修改栏目模型
if (modelId != null) {
model = modelService.get(modelId);
} else {
model = bean.getNodeModel();
}
List<Workflow> workflowList = workflowService.findList(siteId);
modelMap.addAttribute("workflowList", workflowList);
modelMap.addAttribute("model", model);
modelMap.addAttribute("parent", parent);
modelMap.addAttribute("bean", bean);
modelMap.addAttribute("modelList", modelList);
modelMap.addAttribute("nodeModelList", nodeModelList);
modelMap.addAttribute("infoModelList", infoModelList);
modelMap.addAttribute("queryParentId", queryParentId);
modelMap.addAttribute("showDescendants", showDescendants);
modelMap.addAttribute(OPRT, EDIT);
return "core/node/node_form";
}
@RequiresPermissions("core:node:save")
@RequestMapping("save.do")
public String save(Integer cid, Node bean, NodeDetail detail,
Integer parentId, Integer nodeModelId, Integer infoModelId,
Integer workflowId, Integer queryParentId, Boolean showDescendants,
String redirect, HttpServletRequest request, RedirectAttributes ra) {
Integer siteId = Context.getCurrentSiteId(request);
Integer userId = Context.getCurrentUserId(request);
Map<String, String> customs = Servlets.getParameterMap(request,
"customs_");
Map<String, String> clobs = Servlets.getParameterMap(request, "clobs_");
service.save(bean, detail, customs, clobs, parentId, nodeModelId,
infoModelId, workflowId, userId, siteId);
logger.info("save Node, name={}.", bean.getName());
ra.addAttribute("queryParentId", queryParentId);
ra.addAttribute("showDescendants", showDescendants);
ra.addFlashAttribute(MESSAGE, SAVE_SUCCESS);
ra.addFlashAttribute("refreshLeft", true);
if (Constants.REDIRECT_LIST.equals(redirect)) {
return "redirect:list.do";
} else if (Constants.REDIRECT_CREATE.equals(redirect)) {
ra.addAttribute("parentId", parentId);
return "redirect:create.do";
} else {
ra.addAttribute("id", bean.getId());
return "redirect:edit.do";
}
}
@RequiresPermissions("core:node:update")
@RequestMapping("update.do")
public String update(@ModelAttribute("bean") Node bean,
@ModelAttribute("detail") NodeDetail detail, Integer parentId,
Integer nodeModelId, Integer infoModelId, Integer workflowId,
Integer position, Integer queryParentId, Boolean showDescendants,
String redirect, HttpServletRequest request, RedirectAttributes ra) {
Integer siteId = Context.getCurrentSiteId(request);
Map<String, String> customs = Servlets.getParameterMap(request,
"customs_");
Map<String, String> clobs = Servlets.getParameterMap(request, "clobs_");
service.update(bean, detail, customs, clobs, nodeModelId, infoModelId,
workflowId);
// 移动节点
if (parentId != null && bean.getParent() != null
&& !parentId.equals(bean.getParent().getId())) {
service.move(new Integer[] { bean.getId() }, parentId, siteId);
}
logger.info("update Node, name={}.", bean.getName());
ra.addAttribute("queryParentId", queryParentId);
ra.addAttribute("showDescendants", showDescendants);
ra.addFlashAttribute(MESSAGE, SAVE_SUCCESS);
ra.addFlashAttribute("refreshLeft", true);
if (Constants.REDIRECT_LIST.equals(redirect)) {
return "redirect:list.do";
} else {
ra.addAttribute("id", bean.getId());
ra.addAttribute("position", position);
return "redirect:edit.do";
}
}
@RequiresPermissions("core:node:batch_update")
@RequestMapping("batch_update.do")
public String batchUpdate(Integer[] id, String[] name, String[] number,
Integer[] views, Boolean[] hidden, Integer queryParentId,
Boolean showDescendants, Pageable pageable,
HttpServletRequest request, RedirectAttributes ra) {
Integer siteId = Context.getCurrentSiteId(request);
if (ArrayUtils.isNotEmpty(id)) {
// 有排序的情况下不更新树结构,以免引误操作。
boolean isUpdateTree = pageable.getSort() == null;
Node[] beans = service.batchUpdate(id, name, number, views, hidden,
siteId, isUpdateTree);
for (Node bean : beans) {
logger.info("update Node, name={}.", bean.getName());
}
}
ra.addAttribute("queryParentId", queryParentId);
ra.addAttribute("showDescendants", showDescendants);
ra.addFlashAttribute(MESSAGE, SAVE_SUCCESS);
ra.addFlashAttribute("refreshLeft", true);
return "redirect:list.do";
}
@RequiresPermissions("core:node:delete")
@RequestMapping("delete.do")
public String delete(Integer[] ids, Integer queryParentId,
Boolean showDescendants, RedirectAttributes ra) {
Node[] beans = service.delete(ids);
for (Node bean : beans) {
logger.info("delete Node, name={}.", bean.getName());
}
ra.addAttribute("queryParentId", queryParentId);
ra.addAttribute("showDescendants", showDescendants);
ra.addFlashAttribute(MESSAGE, DELETE_SUCCESS);
ra.addFlashAttribute("refreshLeft", true);
return "redirect:list.do";
}
@RequiresPermissions("core:node:move:form")
@RequestMapping("move_input.do")
public String moveInput(Integer[] ids, Boolean noChecked,
Integer queryParentId, Boolean showDescendants,
HttpServletRequest request, org.springframework.ui.Model modelMap) {
User user = Context.getCurrentUser(request);
Integer siteId = Context.getCurrentSiteId(request);
List<Node> selectedList = query.findByIds(ids);
// 获得已选择节点的所有父节点ID,用于展开树。
Set<Integer> selectedPids = new HashSet<Integer>();
// 获得选中节点的ID
Set<Integer> selectedIds = new HashSet<Integer>();
for (Node node : selectedList) {
selectedIds.add(node.getId());
Node parent = node.getParent();
while (parent != null) {
selectedPids.add(parent.getId());
parent = parent.getParent();
}
}
List<Node> list = query.findList(siteId, null);
Boolean allNode = user.getAllNode(siteId);
modelMap.addAttribute("allNode", allNode);
if (!allNode) {
modelMap.addAttribute("nodeRights", user.getNodeRights(siteId));
}
modelMap.addAttribute("list", list);
modelMap.addAttribute("noChecked", noChecked);
modelMap.addAttribute("selectedList", selectedList);
modelMap.addAttribute("selectedIds", selectedIds.toArray());
modelMap.addAttribute("selectedPids", selectedPids.toArray());
modelMap.addAttribute("queryParentId", queryParentId);
modelMap.addAttribute("showDescendants", showDescendants);
return "core/node/node_move";
}
@RequiresPermissions("core:node:move:submit")
@RequestMapping("move_submit.do")
public String moveSubmit(Integer[] ids, Integer id, Integer queryParentId,
Boolean showDescendants, HttpServletRequest request,
RedirectAttributes ra) {
Integer siteId = Context.getCurrentSiteId(request);
service.move(ids, id, siteId);
// bug??
// ra.addAttribute("ids", ids);
ra.addAttribute("noChecked", true);
ra.addAttribute("queryParentId", queryParentId);
ra.addAttribute("showDescendants", showDescendants);
ra.addFlashAttribute(MESSAGE, SAVE_SUCCESS);
ra.addFlashAttribute("refreshLeft", true);
return "redirect:move_input.do?ids=" + StringUtils.join(ids, "&ids=");
}
@RequiresPermissions("core:node:generate_page")
@RequestMapping("generate_page.do")
public String generatePage(Integer[] ids, Integer queryParentId,
Boolean showDescendants, HttpServletRequest request,
RedirectAttributes ra) throws IOException, TemplateException {
List<Node> nodes = query.findByIds(ids);
if (CollectionUtils.isNotEmpty(nodes)) {
Node[] nodeArr = nodes.toArray(new Node[nodes.size()]);
generatePageService.generateNodeWhole(nodeArr);
}
ra.addAttribute("queryParentId", queryParentId);
ra.addAttribute("showDescendants", showDescendants);
ra.addFlashAttribute(MESSAGE, OPERATION_SUCCESS);
return "redirect:list.do";
}
@RequiresPermissions("core:node:delete_page")
@RequestMapping("delete_page.do")
public String deletePage(Integer id, Integer queryParentId,
Boolean showDescendants, HttpServletRequest request,
RedirectAttributes ra) throws IOException, TemplateException {
Node node = query.get(id);
if (node != null) {
generatePageService.deletePage(node);
}
ra.addAttribute("id", id);
ra.addAttribute("queryParentId", queryParentId);
ra.addAttribute("showDescendants", showDescendants);
ra.addFlashAttribute(MESSAGE, OPERATION_SUCCESS);
return "redirect:edit.do";
}
@RequiresPermissions("core:node:add_fulltext")
@RequestMapping("add_fulltext.do")
public String addFulltext(Integer[] ids, Integer queryParentId,
Boolean showDescendants, HttpServletRequest request,
RedirectAttributes ra) throws IOException, TemplateException {
List<Node> nodes = query.findByIds(ids);
if (CollectionUtils.isNotEmpty(nodes)) {
infoFulltextService.addDocumentWhole(nodes);
}
ra.addAttribute("queryParentId", queryParentId);
ra.addAttribute("showDescendants", showDescendants);
ra.addFlashAttribute(MESSAGE, OPERATION_SUCCESS);
return "redirect:list.do";
}
@ModelAttribute
public void preloadBean(@RequestParam(required = false) Integer oid,
org.springframework.ui.Model modelMap) {
if (oid != null) {
Node bean = query.get(oid);
if (bean != null) {
modelMap.addAttribute("bean", bean);
NodeDetail detail = bean.getDetail();
if (detail == null) {
detail = new NodeDetail();
detail.setId(oid);
detail.setNode(bean);
}
modelMap.addAttribute("detail", detail);
}
}
}
@Autowired
private InfoFulltextService infoFulltextService;
@Autowired
private GeneratePageService generatePageService;
@Autowired
private WorkflowService workflowService;
@Autowired
private ModelService modelService;
@Autowired
private NodeService service;
@Autowired
private NodeQueryService query;
}