/* ================================================================== * 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.entity; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.Transient; import javax.persistence.UniqueConstraint; import org.dom4j.Element; import com.jinhe.tss.component.support.persistence.entityaop.IDecodable; import com.jinhe.tss.component.support.persistence.entityaop.OperateInfo; import com.jinhe.tss.core.exception.BusinessException; import com.jinhe.tss.core.persistence.IEntity; import com.jinhe.tss.core.util.BeanUtil; import com.jinhe.tss.core.util.XMLDocUtil; import com.jinhe.tss.core.web.dispaly.tree.ILevelTreeNode; import com.jinhe.tss.core.web.dispaly.tree.TreeAttributesMap; import com.jinhe.tss.core.web.dispaly.xform.IXForm; import com.jinhe.tss.portal.PortalConstants; import com.jinhe.tss.portal.entity.permission.MenuResourceView; import com.jinhe.tss.um.permission.IResource; /** * 导航栏内容定义器:描述导航栏(菜单)基本信息及内容定义信息 */ @Entity @Table(name = "pms_menu", uniqueConstraints = { @UniqueConstraint(name="MULTI_NAME_MENU", columnNames = { "parentId", "name" }) }) @SequenceGenerator(name = "menu_sequence", sequenceName = "menu_sequence", initialValue = 1000, allocationSize = 50) public class Navigator extends OperateInfo implements IEntity, ILevelTreeNode, IXForm, IDecodable, IResource { /** * 菜单组 */ public static final Integer TYPE_MENU = new Integer(1); /** * 普通URL方式: url = www.google.com */ public static final Integer TYPE_MENU_ITEM_4 = new Integer(4); /** * CMS栏目方式: url = ${common.articleListUrl}&channelId=38 */ public static final Integer TYPE_MENU_ITEM_7 = new Integer(7); /** * 行为方式: params = appCode:\'UMS\',redirect:\'http://${PT_ip}/ums/redirect.html\',url:\'ums/permission.htm\' * methodName = jumpTo(方法可定义在门户外挂文件或门户元素上), contentId = 16, contentName = IFrame */ public static final Integer TYPE_MENU_ITEM_6 = new Integer(6); /** * 页面/版面/Portlet 门户内部链接: contentId=66 * 读取时再解析成 url = portal!previewPortal.action?portalId=" + portalId + "&id=" + contentId */ public static final Integer TYPE_MENU_ITEM_3 = new Integer(3); /** * 局部替换方式: contentId=66, targetId=88 * 读取时再解析成 url = portal!getPortalXML.action?portalId=" + portalId + "&id=" + contentId + "&targetId=" + targetId */ public static final Integer TYPE_MENU_ITEM_5 = new Integer(5); @Id @GeneratedValue(strategy = GenerationType.AUTO, generator = "menu_sequence") private Long id; @Column(nullable = false) private String name; //菜单(项)名称 private Integer type; //类型 参考 TYPE_MENU_X private Long parentId; //菜单项对应菜单 private Long portalId; //菜单或菜单项所属于门户ID private String url; //url地址 private String target ; //目标区域,_blank/_self 等 private Long contentId; private String contentName; //显示内容 private Long targetId; private String targetName; //目标:版面/Portlet替换 private String methodName; //方法名 private String params; //参数 @Column(length = 1000) private String description; //菜单内容的描述信息 @Column(nullable = false) private Integer seqNo; // 顺序号 private String decode; // 层码 private Integer levelNo; // 层次值 private Integer disabled = PortalConstants.FALSE; // 是否停用 @Transient private List<Navigator> children = new ArrayList<Navigator>(); public List<Navigator> getChildren(){ return this.children; } public void addChild(Navigator navigator){ this.children.add(navigator); } public TreeAttributesMap getAttributes() { TreeAttributesMap map = new TreeAttributesMap(id, name); map.put("parentId", parentId); map.put("portalId", this.portalId); map.put("type", type); map.put("disabled", disabled); map.put("resourceTypeId", getResourceType()); if(this.type.equals(TYPE_MENU)){ map.put("icon", "../platform/images/icon/menu.gif"); } else { map.put("icon", "../platform/images/icon/menu_item.gif"); } super.putOperateInfo2Map(map); return map; } /** * |- 菜单 <br> * ......|- 菜单项 <br> * ..............|- 菜单项 <br> * ..............|- 菜单项 <br> * ..............|- 菜单项 <br> * ......|- 菜单项 <br> * ..............|- 菜单项 <br> * ..............|- 菜单项 <br> * * @param list */ public Element composeMenuNode(List<Navigator> list){ if( !this.type.equals(TYPE_MENU) ){ throw new BusinessException("非[菜单]不能进行组装菜单操作!"); } Map<Long, Element> map = new HashMap<Long, Element>(); Element root = this.genMenuNode(); for ( Navigator entity : list ) { map.put(entity.getId(), entity.genMenuNode()); } for ( Navigator entity : list ) { Element node = map.get(entity.getId()); Element parent = map.get(entity.getParentId()); if(parent != null){ parent.add(node); } } return root; } private Element genMenuNode(){ Map<String, Object> map = new LinkedHashMap<String, Object>(); map.put("id", id); map.put("name", name); map.put("type", type); map.put("url", url); map.put("target", target); map.put("methodName", methodName); map.put("params", params); map.put("contentId", contentId); map.put("targetId", targetId); // 页面/版面/Portlet 门户内部链接 if(type.equals(TYPE_MENU_ITEM_3)){ map.put("url", "portal!previewPortal.action?portalId=" + portalId + "&id=" + contentId); } // 局部替换方式 if(type.equals(TYPE_MENU_ITEM_5)){ map.put("action", "portal!getPortalXML.action?portalId=" + portalId + "&id=" + contentId + "&targetId=" + targetId); } return XMLDocUtil.map2AttributeNode(map, this.type.equals(TYPE_MENU) ? "Menu" : "MenuItem"); } public Map<String, Object> getAttributesForXForm() { Map<String, Object> map = new HashMap<String, Object>(); BeanUtil.addBeanProperties2Map(this, map, "children".split(",")); return map; } public Class<?> getParentClass() { if(this.parentId.equals(PortalConstants.ROOT_ID)) { return MenuResourceView.class; } return getClass(); } public String getResourceType() { return PortalConstants.MENU_RESOURCE_TYPE; } public String toString(){ return "(id:" + this.id + ", name:" + this.name + ")"; } public String getMethodName() { return methodName; } public String getDescription() { return description; } public Long getParentId() { return parentId; } public Long getId() { return id; } public String getName() { return name; } public Integer getSeqNo() { return seqNo; } public Long getContentId() { return contentId; } public String getContentName() { return contentName; } public String getParams() { return params; } public String getTarget() { return target; } public Integer getType() { return type; } public Long getPortalId() { return portalId; } public String getUrl() { return url; } public Long getTargetId() { return targetId; } public String getTargetName() { return targetName; } public void setContentId(Long contentId) { this.contentId = contentId; } public void setContentName(String contentName) { this.contentName = contentName; } public void setDescription(String description) { this.description = description; } public void setId(Long id) { this.id = id; } public void setMethodName(String methodName) { this.methodName = methodName; } public void setName(String name) { this.name = name; } public void setParams(String params) { this.params = params; } public void setParentId(Long parentId) { this.parentId = parentId; } public void setSeqNo(Integer seqNo) { this.seqNo = seqNo; } public void setTarget(String target) { this.target = target; } public void setType(Integer type) { this.type = type; } public void setUrl(String url) { this.url = url; } public void setPortalId(Long portalId) { this.portalId = portalId; } public void setTargetId(Long targetId) { this.targetId = targetId; } public void setTargetName(String targetName) { this.targetName = targetName; } public Integer getDisabled() { return disabled; } public void setDisabled(Integer disabled) { this.disabled = disabled; } public String getDecode() { return decode; } public Integer getLevelNo() { return levelNo; } public void setDecode(String decode) { this.decode = decode; } public void setLevelNo(Integer levelNo) { this.levelNo = levelNo; } }