package org.fireflow.demo.system.module;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.fireflow.demo.misc.Utils;
import org.fireflow.demo.security.bean.User;
import org.fireflow.demo.system.bean.SysMenu;
import org.nutz.dao.Cnd;
import org.nutz.dao.pager.Pager;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.log.Log;
import org.nutz.log.Logs;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import org.nutz.service.EntityService;
@At("/SysMenu")
@IocBean(fields={"dao"})
public class SysMenuModule extends EntityService<SysMenu>{
private static final Log log = Logs.get();
private static final String icon = "/static/images/function2.gif";
@At
@Ok("json")
public List<MenuNode> loadMyMenus(HttpServletRequest req){
String contextPath = req.getContextPath();
Cookie stateCookie = Utils.getCookieByName(req, "okerp_1_navigator_state");
Map<String,String> isActiveStateMap = new HashMap<String,String>();
Map<String,String> isExpandedMap = new HashMap<String,String>();
if (stateCookie!=null){
String stateStr = stateCookie.getValue();
if (stateStr!=null){
StringTokenizer tokenizer = new StringTokenizer(stateStr,"_");
while (tokenizer.hasMoreTokens()){
String token = tokenizer.nextToken();
int idx1 = token.indexOf("-");
if (idx1>0){
String menuCode = token.substring(0,idx1);
String isActive = token.substring(idx1+1,idx1+2);
String isExpand = token.substring(idx1+2);
isActiveStateMap.put(menuCode, isActive);
isExpandedMap.put(menuCode,isExpand);
}
}
}
}
List<MenuNode> allMenu = new ArrayList<MenuNode>();
List<SysMenu> list = queryChildren("m0");
//构造菜单树
if (list!=null){
for (SysMenu m : list){
MenuNode mn = new MenuNode();
mn.setId(m.getCode());
mn.setFolder(SysMenu.MENUGROUP_TYPE.equals(m.getType())?true:false);
mn.setFunctionCode(m.getFuncCode());
mn.setText(m.getName());
if ("t".equals(isActiveStateMap.get(m.getCode()))){
mn.setActive(true);
}else{
mn.setActive(false);
}
if ("t".equals(isExpandedMap.get(m.getCode()))){
mn.setExpanded(true);
}
else{
mn.setExpanded(false);
}
if (!mn.isFolder()){
String url = m.getUrl();
if (url!=null && !url.trim().equals("")){
if (url.startsWith("/")){
url = contextPath+url;
}else{
url = contextPath+"/"+url;
}
mn.setHref(url);
}
mn.setIconUrl(contextPath+icon);
//判断权限
Subject subject = SecurityUtils.getSubject();
User curUser = (User)subject.getPrincipal();
//TODO root 拥有所有业务权限,这个待斟酌,目前用于测试方便。
if (curUser!=null && curUser.getLoginName().equals("root")){
allMenu.add(mn);
}
else if (subject.isPermitted(mn.getFunctionCode())){
allMenu.add(mn);
}
}else{
loadChildMenuNodes(mn,contextPath,isActiveStateMap,isExpandedMap);
if (mn.getChildren().size()>0){//有子菜单才将他加入列表
allMenu.add(mn);
}
}
}
}
//检查菜单功能权限
return allMenu;
}
protected void loadChildMenuNodes(MenuNode parent,String contextPath,Map<String,String> isActiveStateMap,
Map<String,String> isExpandedMap){
List<SysMenu> list = queryChildren(parent.getId());
if (list!=null){
for (SysMenu m : list){
MenuNode mn = new MenuNode();
mn.setId(m.getCode());
mn.setFolder(SysMenu.MENUGROUP_TYPE.equals(m.getType())?true:false);
mn.setFunctionCode(m.getFuncCode());
mn.setText(m.getName());
if ("t".equals(isActiveStateMap.get(m.getCode()))){
mn.setActive(true);
}else{
mn.setActive(false);
}
if ("t".equals(isExpandedMap.get(m.getCode()))){
mn.setExpanded(true);
}
else{
mn.setExpanded(false);
}
if (!mn.isFolder()){
String url = m.getUrl();
if (url!=null && !url.trim().equals("")){
if (url.startsWith("/")){
url = contextPath+url;
}else{
url = contextPath+"/"+url;
}
mn.setHref(url);
}
mn.setIconUrl(contextPath+icon);
//判断权限
Subject subject = SecurityUtils.getSubject();
User curUser = (User)subject.getPrincipal();
//TODO root 拥有所有业务权限,这个待斟酌,目前用于测试方便。
if (curUser!=null && curUser.getLoginName().equals("root")){
parent.getChildren().add(mn);
}
else if (subject.isPermitted(mn.getFunctionCode())){
parent.getChildren().add(mn);
}
}else{
loadChildMenuNodes(mn,contextPath,isActiveStateMap,isExpandedMap);
if (mn.getChildren().size()>0){//有子菜单才将他加入列表
parent.getChildren().add(mn);
}
}
}
}
}
protected List<SysMenu> queryChildren(String pCode){
List<SysMenu> list = dao().query(SysMenu.class, Cnd.where("parentCode","=",pCode).asc("sort"));
return list;
}
@At
public Object list(@Param("page") int page ,@Param("rows") int rows){
if (rows < 1)
rows = 10;
Pager pager = dao().createPager(page, rows);
List<SysMenu> list = dao().query(SysMenu.class, null, pager);
Map<String, Object> map = new HashMap<String, Object>();
if (pager != null) {
pager.setRecordCount(dao().count(SysMenu.class));
map.put("pager", pager);
}
map.put("list", list);
return map;
}
@At
public boolean add(@Param("..") SysMenu obj){
try{
dao().insert(obj);
return true;
}catch (Throwable e) {
if (log.isDebugEnabled())
log.debug("E!!",e);
return false;
}
}
@At
public boolean delete(@Param("..") SysMenu obj){
try{
dao().delete(obj);
return true;
}catch (Throwable e) {
if (log.isDebugEnabled())
log.debug("E!!",e);
return false;
}
}
@At
public boolean update(@Param("..") SysMenu obj){
try{
dao().update(obj);
return true;
}catch (Throwable e) {
if (log.isDebugEnabled())
log.debug("E!!",e);
return false;
}
}
}
class MenuNode{
String id = null;
List<MenuNode> children = new ArrayList<MenuNode>();
boolean isFolder = false;
boolean isExpanded = true;
boolean isActive = false;
String href = null;
String hrefTarget = null;
String functionCode = null;
String text = null;
String iconUrl = null;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public List<MenuNode> getChildren() {
return children;
}
public void setChildren(List<MenuNode> children) {
this.children = children;
}
public boolean isFolder() {
return isFolder;
}
public void setFolder(boolean isFolder) {
this.isFolder = isFolder;
}
public boolean isExpanded() {
return isExpanded;
}
public void setExpanded(boolean isExpanded) {
this.isExpanded = isExpanded;
}
public String getHref() {
return href;
}
public void setHref(String href) {
this.href = href;
}
public String getHrefTarget() {
return hrefTarget;
}
public void setHrefTarget(String hrefTarget) {
this.hrefTarget = hrefTarget;
}
public String getFunctionCode() {
return functionCode;
}
public void setFunctionCode(String functionCode) {
this.functionCode = functionCode;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public boolean isActive() {
return isActive;
}
public void setActive(boolean isActive) {
this.isActive = isActive;
}
public String getIconUrl(){
return iconUrl;
}
public void setIconUrl(String iconUrl){
this.iconUrl = iconUrl;
}
}