/* ==================================================================
* 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.portal.action;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.jinhe.tss.component.support.web.webwork.PTActionSupport;
import com.jinhe.tss.core.exception.BusinessException;
import com.jinhe.tss.core.web.dispaly.tree.ITreeTranslator;
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.tree.TreeNode;
import com.jinhe.tss.core.web.dispaly.xform.XFormEncoder;
import com.jinhe.tss.portal.entity.Navigator;
import com.jinhe.tss.portal.entity.PortalStructure;
import com.jinhe.tss.portal.helper.MenuTreeParser;
import com.jinhe.tss.portal.helper.StrictLevelTreeParser;
import com.jinhe.tss.portal.service.INavigatorService;
import com.jinhe.tss.portal.service.IPortalService;
public class NavigatorAction extends PTActionSupport {
private static final long serialVersionUID = -740021470875971846L;
private INavigatorService service;
private IPortalService portalService;
private Long id;
private Long parentId;
private Long portalId;
private Integer disabled ;
private Integer type;
private Long targetId; // 移动或者排序的目标节点ID
private int direction; // 分+1(向下),和-1(向上)
private Navigator navigator = new Navigator();
/**
* <p> 生成单个菜单 </p>
* @return
*/
public String getMenuXML(){
return print("MainMenu", service.getMenuXML(id));
}
/**
* <p>
* 菜单的树型展示。
* 菜单依附于门户而存在,要想给某角色授于菜单管理权限,首先要授予门户节点的查看权限。
* </p>
* @return
*/
public String getAllNavigator4Tree(){
List<?> data = service.getAllNavigator();
TreeEncoder encoder = new TreeEncoder(data, new StrictLevelTreeParser());
encoder.setNeedRootNode(false);
return print("MenuTree", encoder);
}
/**
* <p>
* 单个菜单控件的详细信息
* </p>
* @return
*/
public String getNavigatorInfo(){
XFormEncoder encoder;
if(isCreateNew()){
Map<String, Object> map = new HashMap<String, Object>();
map.put("parentId", parentId);
map.put("portalId", portalId);
map.put("target", "_blank");
map.put("type", type);
encoder = new XFormEncoder("template/xform/MenuXForm" + type + ".xml", map);
}
else {
Navigator info = service.getNavigatorInfo(id);
encoder = new XFormEncoder("template/xform/MenuXForm" + type + ".xml", info);
}
return print(Navigator.TYPE_MENU.equals(type) ? "MenuInfo" : "MenuItemInfo", encoder);
}
/**
* <p>
* 保存菜单控件
* </p>
* @return
*/
public String save(){
boolean isNew = navigator.getId() == null;
navigator = service.saveMenu(navigator);
return doAfterSave(isNew, navigator, "MenuTree");
}
/**
* <p>
* 删除菜单控件.
* </p>
* @return
*/
public String delete(){
service.deleteMenu(id);
return printSuccessMessage();
}
/**
* <p>
* 停用/启用 菜单Navigator(将其下的disabled属性设为"1"/"0")
* </p>
* @return
*/
public String disable(){
service.disable(id, disabled);
return printSuccessMessage();
}
/**
* <p>
* 同组下的Navigator排序
* </p>
* @return
*/
public String sort(){
service.sort(id, targetId, direction);
return printSuccessMessage();
}
/**
* 移动
* @return
*/
public String move(){
if(id.equals(targetId)){
throw new BusinessException("节点不能移动到自身节点下");
}
service.moveMenu(id, targetId, portalId);
return printSuccessMessage();
}
/**
* 根据菜单获取菜单项树
* @return
*/
public String getMenus4TreeByPortal(){
List<?> data = service.getMenusByPortal(portalId);
TreeEncoder encoder = new TreeEncoder(data, new LevelTreeParser());
encoder.setNeedRootNode(false);
return print("MenuTree", encoder);
}
public String getPortalStructuresByPortal4Tree(){
List<?> data = portalService.getPortalStructuresByPortal(portalId);
TreeEncoder encoder = new TreeEncoder(data, new LevelTreeParser());
final int type = this.type;
encoder.setTranslator(new ITreeTranslator(){
public Map<String, Object> translate(Map<String, Object> attributes) {
Object psType = attributes.get("type");
switch(type){
case 3:
if(psType.equals(PortalStructure.TYPE_PORTAL))
attributes.put(TreeNode.TREENODE_ATTRIBUTE_CANSELECTED, "0");
break;
case 2:
if(psType.equals(PortalStructure.TYPE_PORTAL) || psType.equals(PortalStructure.TYPE_PAGE))
attributes.put(TreeNode.TREENODE_ATTRIBUTE_CANSELECTED, "0");
break;
case 1: //此处为菜单替换方式中目标版面项,可以选择版面或者页面
if((psType.equals(PortalStructure.TYPE_PORTAL) || psType.equals(PortalStructure.TYPE_PORTLET_INSTANCE)))
attributes.put(TreeNode.TREENODE_ATTRIBUTE_CANSELECTED, "0");
break;
case 0:
if(!psType.equals(PortalStructure.TYPE_PORTLET_INSTANCE))
attributes.put(TreeNode.TREENODE_ATTRIBUTE_CANSELECTED, "0");
break;
default:
throw new BusinessException("取门户树时传的参数不正确!");
}
return attributes;
}
});
encoder.setNeedRootNode(false);
return print("SiteTree", encoder);
}
/**
* 移动的时候用到
* @return
*/
public String getNavigators4Tree(){
List<?> data = service.getMenusByPortal(portalId);
//过滤移动节点自身
for(Iterator<?> it = data.iterator(); it.hasNext();){
Navigator menu = (Navigator) it.next();
if(menu.getId().equals(id)){
it.remove();
break;
}
}
TreeEncoder encoder = new TreeEncoder(data, new MenuTreeParser());
final Long portalId = this.portalId;
encoder.setTranslator(new ITreeTranslator(){
public Map<String, Object> translate(Map<String, Object> attributes) {
if( !attributes.get("portalId").equals(portalId) )
attributes.put(TreeNode.TREENODE_ATTRIBUTE_CANSELECTED, "0");
if( ((Integer)attributes.get("type")) < 1 )
attributes.put(TreeNode.TREENODE_ATTRIBUTE_CANSELECTED, "0");
return attributes;
}
});
encoder.setNeedRootNode(false);
return print("SiteTree", encoder);
}
public void setService(INavigatorService service) {
this.service = service;
}
public void setPortalService(IPortalService portalService) {
this.portalService = portalService;
}
public void setDisabled(Integer disabled) {
this.disabled = disabled;
}
public void setId(Long id) {
this.id = id;
}
public void setParentId(Long groupId) {
this.parentId = groupId;
}
public void setDirection(int direction) {
this.direction = direction;
}
public void setTargetId(Long targetId) {
this.targetId = targetId;
}
public Navigator getNavigator() {
return navigator;
}
public void setType(Integer type) {
this.type = type;
}
public void setPortalId(Long portalId) {
this.portalId = portalId;
}
}