package com.norteksoft.tags.menu; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.Tag; import javax.servlet.jsp.tagext.TagSupport; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.norteksoft.acs.entity.authorization.BusinessSystem; import com.norteksoft.acs.service.authorization.BusinessSystemManager; import com.norteksoft.acs.service.security.SecurityResourceCache; import com.norteksoft.mms.module.entity.Menu; import com.norteksoft.mms.module.service.MenuManager; import com.norteksoft.product.util.ContextUtils; import com.norteksoft.product.util.PropUtils; import com.norteksoft.product.util.SystemUrls; import com.norteksoft.product.util.freemarker.TagUtil; public class SecondMenuTag extends TagSupport { private static final long serialVersionUID = 1L; private Log log = LogFactory.getLog(SecondMenuTag.class); private MenuManager menuManager; private Long menuId; private Long secondMenuId; private String code; private BusinessSystemManager businessSystemManager; @Override public int doStartTag() throws JspException { try { menuManager=(MenuManager)ContextUtils.getBean("menuManager"); String systemCode=ContextUtils.getSystemCode(); String currentCode = StringUtils.isEmpty(code)?systemCode:code; String lastMenuIdStr=pageContext.getRequest().getParameter("menuId"); if(lastMenuIdStr == null){ if(pageContext.getRequest().getAttribute("menuId")!=null){ lastMenuIdStr = pageContext.getRequest().getAttribute("menuId").toString(); }else{ Menu lastMenu=menuManager.getDefaultMenuByLayer(currentCode); if(lastMenu!=null){ lastMenuIdStr = lastMenu.getId().toString(); } } } if(lastMenuIdStr!=null){ Menu secondMenu=menuManager.getMenuByLastMenu(2,Long.parseLong(lastMenuIdStr)); if(secondMenu!=null)secondMenuId=secondMenu.getId(); menuId=Long.parseLong(lastMenuIdStr); } JspWriter out=pageContext.getOut(); out.print(readScriptTemplate(currentCode)); } catch (Exception e) { log.error(e); throw new JspException(e); } return Tag.EVAL_PAGE; } @Override public int doEndTag() throws JspException { return Tag.EVAL_PAGE; } //读取脚本模板 private String readScriptTemplate(String currentCode) throws Exception{ Menu firstMenu=menuManager.getRootMenu(menuId); List<Menu> menus=menuManager.getEnableMenuByLayer(2,firstMenu.getId()); List<Menu> finalMenus=new ArrayList<Menu>(); businessSystemManager = (BusinessSystemManager)ContextUtils.getBean("businessSystemManager"); BusinessSystem business = businessSystemManager.getSystemBySystemCode(currentCode); String parentBusinessCode = null; for(Menu menu:menus){ String url=menu.getUrl(); if(url.contains("?")){ url=url.substring(0,menu.getUrl().indexOf("?")); } if(business!=null){ parentBusinessCode = business.getParentCode(); if(StringUtils.isNotEmpty(parentBusinessCode)){//如果是子系统,则在url前加上当前系统的编码 //url:/form/list-data.htm,属于mms子系统,则新url应为/mms/form/list-data.htm url="/"+currentCode+url; } } String grantedAuthorities = SecurityResourceCache.getAuthoritysInCache(url); if(grantedAuthorities!=null){ if(ContextUtils.isAuthority(grantedAuthorities)){ finalMenus.add(menu); } }else{ if("ems".equals(currentCode)){ finalMenus.add(menu); } } } String sysUrl=""; List<Menu> resultMenus=new ArrayList<Menu>(); for(Menu menu:finalMenus){ String url=menu.getUrl(); if(url.contains("?")){ url=url.substring(0,menu.getUrl().indexOf("?")); menu.setUrl(url); } Menu lastMenu = menuManager.getLastMenu(menu.getId()); menu.setLastMenuId(lastMenu.getId()); resultMenus.add(menu); } Map<String, Object> root=new HashMap<String, Object>(); if(secondMenuId!=null){ root.put("secondMenuId", secondMenuId); }else{ if(resultMenus.size()>0){ root.put("secondMenuId", resultMenus.get(0).getId()); } } if(business!=null){ parentBusinessCode = business.getParentCode(); if(StringUtils.isEmpty(parentBusinessCode)){ sysUrl = SystemUrls.getSystemUrl(currentCode); }else{ sysUrl = SystemUrls.getSystemUrl(parentBusinessCode); } } if(PropUtils.getProp("project.model")!=null&&PropUtils.getProp("project.model").equals("developing.model")){ if(sysUrl.indexOf("mms/common/list.htm")>0){//开发模式下自定义流程二级菜单url sysUrl = PropUtils.getProp("host.imatrix"); } } if(sysUrl.lastIndexOf("/")==sysUrl.length()-1){//是80端口时 sysUrl = sysUrl.substring(0,sysUrl.length()-1); } root.put("systemCode",currentCode); root.put("sysUrl",sysUrl); root.put("subSysable", StringUtils.isEmpty(parentBusinessCode)?false:true);//是否是子系统,false代表不是子系统如ems,true代表是子系统如mms root.put("menus", resultMenus); String result = TagUtil.getContent(root, "menu/secondMenuTag.ftl"); return result; } public Long getMenuId() { return menuId; } public void setMenuId(Long menuId) { this.menuId = menuId; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } }