//$Id: AuthorityServiceImpl.java,v 1.6 2007/01/22 13:01:24 chaostone Exp $
/*
*
* Copyright c 2005-2009
* Licensed under the Apache License, Version 2.0 (the "License")
* http://www.apache.org/licenses/LICENSE-2.0
*
*/
/********************************************************************************
* @author chaostone
*
* MODIFICATION DESCRIPTION
*
* Name Date Description
* ============ ============ ============
* dell Created
* chaostone 2005-9-26 rename some method's signature
*
********************************************************************************/
package org.beanfuse.security.menu.service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.commons.collections.CollectionUtils;
import org.beanfuse.entity.Model;
import org.beanfuse.persist.impl.BaseServiceImpl;
import org.beanfuse.security.Authority;
import org.beanfuse.security.Group;
import org.beanfuse.security.Resource;
import org.beanfuse.security.User;
import org.beanfuse.security.menu.Menu;
import org.beanfuse.security.menu.MenuAuthority;
import org.beanfuse.security.menu.MenuProfile;
import org.beanfuse.security.menu.dao.MenuAuthorityDao;
import org.beanfuse.security.service.UserService;
/**
* 授权信息的服务实现类
*
* @author dell,chaostone 2005-9-26
*/
public class MenuAuthorityServiceImpl extends BaseServiceImpl implements MenuAuthorityService {
protected MenuAuthorityDao menuAuthorityDao;
protected UserService userService;
public List getMenuAuthorities(MenuProfile profile, User user) {
return getMenuAuthorities(profile, user, -1, null);
}
public List getMenuAuthorities(MenuProfile profile, User user, int depth, String ancestorCode) {
if (null == user)
return Collections.EMPTY_LIST;
Set menuAuthorities = new HashSet();
if (null != user.getGroups()) {
for (Iterator it = user.getGroups().iterator(); it.hasNext();) {
menuAuthorities.addAll(menuAuthorityDao.getMenuAuthorities(profile, ((Group) it
.next()), depth, ancestorCode));
}
}
List authorityList = new ArrayList(menuAuthorities);
Collections.sort(authorityList);
return authorityList;
}
public List getMenuAuthorities(MenuProfile profile, Group group) {
return getMenuAuthorities(profile, group, -1);
}
public List getMenuAuthorities(MenuProfile profile, Group group, int depth) {
return getMenuAuthorities(profile, group, depth, null);
}
public List getMenuAuthorities(MenuProfile profile, Group group, int depth, String ancestorCode) {
if (null == group)
return Collections.EMPTY_LIST;
List groupAuthorities = menuAuthorityDao.getMenuAuthorities(profile, group, depth,
ancestorCode);
return groupAuthorities;
}
public MenuAuthority getMenuAuthority(Group group, Menu menu) {
if (group == null || null == menu)
return null;
else
return menuAuthorityDao.getMenuAuthority(group, menu);
}
public List getMenus(MenuProfile profile, User user) {
return getMenus(profile, user, -1, null);
}
public List getMenus(MenuProfile profile, User user, int depth, String ancestorCode) {
Set modules = new HashSet();
Set groups = userService.getGroups(user);
for (Iterator iterator = groups.iterator(); iterator.hasNext();) {
Group group = (Group) iterator.next();
modules.addAll(menuAuthorityDao.getMenus(profile, group, depth, ancestorCode));
}
if (null == modules)
return Collections.EMPTY_LIST;
List moduleList = new ArrayList(modules);
Collections.sort(moduleList);
return moduleList;
}
public List getMenus(MenuProfile profile, Group group) {
return menuAuthorityDao.getMenus(profile, group, 0, null);
}
/**
* @deprecated
*/
public void copyAuthority(MenuProfile profile, Group fromGroup, Collection toGroups) {
List fromAuthorities = getMenuAuthorities(profile, fromGroup);
List allAdded = new ArrayList();
for (Iterator iter = toGroups.iterator(); iter.hasNext();) {
Group toGroup = (Group) iter.next();
List toAuthorities = getMenuAuthorities(profile, toGroup);
Collection newAuthorities = CollectionUtils.subtract(fromAuthorities, toAuthorities);
for (Iterator iterator = newAuthorities.iterator(); iterator.hasNext();) {
// GroupAuthority auth = (GroupAuthority) iterator.next();
// allAdded.add(auth.clone());
}
}
entityService.saveOrUpdate(allAdded);
}
public void authorize(Group group, Set resources) {
// 查找保留的权限
Set reserved = new HashSet();
for (Iterator iterator = group.getAuthorities().iterator(); iterator.hasNext();) {
Authority authority = (Authority) iterator.next();
if (resources.contains(authority.getResource())) {
reserved.add(authority);
resources.remove(authority.getResource());
}
}
group.getAuthorities().clear();
group.getAuthorities().addAll(reserved);
// 新权限
Authority model = null;
try {
model = (Authority) Model.newInstance(Authority.class);
} catch (Exception e) {
throw new RuntimeException("cannot init authroity by class:" + Authority.class);
}
model.setGroup(group);
for (Iterator iter = resources.iterator(); iter.hasNext();) {
Resource element = (Resource) iter.next();
Authority authority = null;// (Authority) model.clone();
authority.setResource(element);
group.getAuthorities().add(authority);
}
entityService.saveOrUpdate(group);
}
/**
* 从module列表中拼成一个功能点名称集合
*
* @param modules
* @return
*/
public static Set distillResources(Collection menus) {
if (null == menus || menus.size() < 0)
return Collections.EMPTY_SET;
Set actionNames = new HashSet();
for (Iterator it = menus.iterator(); it.hasNext();) {
Set actions = ((Menu) it.next()).getResources();
if (null != actions) {
for (Iterator ot = actions.iterator(); ot.hasNext();) {
actionNames.add(((Resource) ot.next()).getName());
}
}
}
return actionNames;
}
public void saveOrUpdate(MenuAuthority o) {
entityService.saveOrUpdate(o);
}
public void setMenuAuthorityDao(MenuAuthorityDao menuAuthorityDao) {
this.menuAuthorityDao = menuAuthorityDao;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}