Java tutorial
/* 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(List<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(List<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(List<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 in (: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; } public Menu getParentMenu(Menu menu) { if (StringUtils.isEmpty(menu.getCode()) || menu.getCode().indexOf(".") < 0) { return null; } OqlBuilder<Menu> oql = OqlBuilder.from(Menu.class, "menu"); String parentCode = menu.getCode().substring(0, menu.getCode().lastIndexOf(".")); oql.where("menu.code = :code", parentCode); if (menu.getProfile() != null) { oql.where("menu.profile.id = :profileId", menu.getProfile().getId()); } List<Menu> menus = entityDao.search(oql); if (menus.size() > 0) { return menus.get(0); } return null; } }