Package org.beangle.ems.security.nav.service

Source Code of org.beangle.ems.security.nav.service.MenuServiceImpl

/* Copyright c 2005-2012.
* Licensed under GNU  LESSER General Public License, Version 3.
* http://www.gnu.org/licenses
*/
package org.beangle.ems.security.nav.service;

import java.util.Collections;
import java.util.List;
import java.util.Set;

import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.beangle.commons.collection.CollectUtils;
import org.beangle.model.persist.impl.BaseServiceImpl;
import org.beangle.model.query.builder.OqlBuilder;
import org.beangle.model.util.HierarchyEntityUtil;
import org.beangle.ems.security.Authority;
import org.beangle.ems.security.Category;
import org.beangle.ems.security.Group;
import org.beangle.ems.security.GroupMember;
import org.beangle.ems.security.User;
import org.beangle.ems.security.nav.Menu;
import org.beangle.ems.security.nav.MenuProfile;
import org.beangle.ems.security.nav.model.MenuBean;
import org.beangle.ems.security.service.UserService;

/**
* @author chaostone
* @version $Id: MenuServiceImpl.java Jun 5, 2011 9:25:49 PM chaostone $
*/
public class MenuServiceImpl extends BaseServiceImpl implements MenuService {

  private UserService userService;

  public List<MenuProfile> getProfiles(User user) {
    Set<Category> categories = CollectUtils.newHashSet();
    categories.add(user.getDefaultCategory());
    categories.addAll(user.getCategories());
    OqlBuilder<MenuProfile> query = OqlBuilder.from(MenuProfile.class, "menuProfile");
    query.where("menuProfile.category in(:categories)", categories).cacheable();
    return entityDao.search(query);
  }

  public List<Menu> getMenus(MenuProfile profile, User user) {
    Set<Menu> menus = CollectUtils.newHashSet();
    List<Group> groups = userService.getGroups(user, GroupMember.Ship.MEMBER);
    for (final Group group : groups) {
      if (group.isEnabled()) menus.addAll(getMenus(profile, group, Boolean.TRUE));
    }
    return addParentMenus(menus);
  }

  /**
   * 添加父菜单并且排序
   *
   * @param menus
   * @return
   */
  private List<Menu> addParentMenus(Set<Menu> menus) {
    HierarchyEntityUtil.addParent(menus);
    List<Menu> menuList = CollectUtils.newArrayList(menus);
    Collections.sort(menuList);
    return menuList;
  }

  /**
   * 查询用户组对应的模块
   */
  public List<Menu> getMenus(MenuProfile profile, Group group, Boolean enabled) {
    OqlBuilder<Menu> query = buildMenuQuery(profile, group).cacheable();
    if (null != enabled) {
      query.where("menu.enabled=:enabled", enabled);
    }
    List<Menu> menus = entityDao.search(query);
    return addParentMenus(CollectUtils.newHashSet(menus));
  }

  private OqlBuilder<Menu> buildMenuQuery(MenuProfile profile, Group group) {
    OqlBuilder<Menu> builder = OqlBuilder.from(Menu.class);
    builder.join("menu.resources", "mr");
    builder.where("exists(from " + Authority.class.getName()
        + " a where a.group=:group and a.resource=mr)", group);
    if (null != profile) {
      builder.where("menu.profile=:profile", profile);
    }
    return builder;
  }

  public void move(Menu menu, Menu location, int indexno) {
    if (ObjectUtils.equals(menu.getParent(), location)) {
      if (NumberUtils.toInt(((MenuBean) menu).getIndexno()) != indexno) {
        shiftCode(menu, location, indexno);
      }
    } else {
      if (null != menu.getParent()) {
        menu.getParent().getChildren().remove(menu);
      }
      menu.setParent(location);
      shiftCode(menu, location, indexno);
    }
  }

  private void shiftCode(Menu menu, Menu newParent, int indexno) {
    List<Menu> sibling = null;
    if (null != newParent) sibling = newParent.getChildren();
    else {
      sibling = CollectUtils.newArrayList();
      for (Menu m : menu.getProfile().getMenus()) {
        if (null == m.getParent()) sibling.add(m);
      }
    }
    Collections.sort(sibling);
    sibling.remove(menu);
    indexno--;
    if (indexno > sibling.size()) {
      indexno = sibling.size();
    }
    sibling.add(indexno, menu);
    int nolength = String.valueOf(sibling.size()).length();
    Set<Menu> menus = CollectUtils.newHashSet();
    for (int seqno = 1; seqno <= sibling.size(); seqno++) {
      Menu one = sibling.get(seqno - 1);
      generateCode(one, StringUtils.leftPad(String.valueOf(seqno), nolength, '0'), menus);
    }
    entityDao.saveOrUpdate(menus);
  }

  private void generateCode(Menu menu, String indexno, Set<Menu> menus) {
    menus.add(menu);
    if (null != indexno) {
      ((MenuBean) menu).generateCode(indexno);
    } else {
      ((MenuBean) menu).generateCode();
    }
    if (null != menu.getChildren()) {
      for (Menu m : menu.getChildren()) {
        generateCode(m, null, menus);
      }
    }
  }

  public void setUserService(UserService userService) {
    this.userService = userService;
  }

}
TOP

Related Classes of org.beangle.ems.security.nav.service.MenuServiceImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.