/**
* Copyright (c)2010-2011 Enterprise Website Content Management System(EWCMS), All rights reserved.
* EWCMS PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
* http://www.ewcms.com
*/
package com.ewcms.security.manage.service;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import com.ewcms.security.manage.model.Authority;
import com.ewcms.security.manage.model.Group;
import com.ewcms.security.manage.model.User;
@Service
public class GroupService extends AbstractService implements GroupServiceable{
static final Logger logger = LoggerFactory.getLogger(GroupService.class);
/**
* 移除过时的用户
*
* @param users 用户集合
*/
private void removeExpiredUsers(final Collection<User> users){
for(User user : users){
String name = user.getUsername();
removeExpiredUserByUsername(name);
}
}
/**
* 通过用户名移除过时的用户
*
* @param names 用户名集合
*/
private void removeExpiredUseByUsernames(final Collection<String> names){
for(String name : names){
removeExpiredUserByUsername(name);
}
}
/**
* 得到完整用户组名
*
* GROUP_在通用权限中标志为用户组权限。
*
* @param name 输入的名称
* @return
*/
String groupNameFull(final String name){
if(!name.startsWith(GROUP_NAME_PERFIX)){
return GROUP_NAME_PERFIX + name;
}
return name;
}
@Override
public boolean hasGroupname(final String name) {
Group group = groupDao.get(groupNameFull(name));
return group != null;
}
@Override
public String addGroup(final String name,final String remark)throws UserServiceException {
if(hasGroupname(name)){
throw new UserServiceException(messages.getMessage(
"GroupService.groupnameExist","groupname exist"));
}
String namefull = groupNameFull(name);
Group group = new Group(namefull,remark);
groupDao.persist(group);
return namefull;
}
/**
* 得到存在的用户组
*
* @param name 用户组名称
* @return
* @throws UserServiceException
*/
private Group getExistGroup(final String name)throws UserServiceException{
Group group = groupDao.get(name);
if(group == null){
throw new UserServiceException(messages.getMessage(
"GroupService.groupNotFound",new Object[]{name},"Can't found "+ name + " gruop"));
}
return group;
}
@Override
public void updateGroup(final String name,final String remark)throws UserServiceException {
Group group = getExistGroup(name);
group.setRemark(remark);
groupDao.persist(group);
}
@Override
public void removeGroup(final String name) {
//TODO ACL result set clean;
groupDao.removeByPK(name);
}
@Override
public Group getGroup(final String name) {
return groupDao.get(name);
}
@Override
public Set<User> addUsersToGroup(final String name,final Set<String> usernames) {
Group group = getExistGroup(name);
Set<User> newUsers = new HashSet<User>();
for(String username : usernames){
User user = getUserByUsername(username);
if(!group.getUsers().contains(user)){
newUsers.add(user);
}
}
group.getUsers().addAll(newUsers);
groupDao.persist(group);
removeExpiredUsers(newUsers);
return newUsers;
}
@Override
public Set<Authority> addAuthoritiesToGroup(final String name,final Set<String> authNames) {
Group group = getExistGroup(name);
Set<Authority> newAuths = new HashSet<Authority>();
for(String authName : authNames){
Authority auth = getAuthorityByName(authName);
if(!group.getAuthorities().contains(auth)){
newAuths.add(auth);
}
}
group.getAuthorities().addAll(newAuths);
groupDao.persist(group);
removeExpiredUsers(group.getUsers());
return newAuths;
}
@Override
public void removeUsersInGroup(final String name,final Set<String> usernames) {
Group group = getExistGroup(name);
if(group.getUsers().isEmpty()){
return ;
}
Set<User> users = new HashSet<User>();
for(User user : group.getUsers()){
if(!usernames.contains(user.getUsername())){
users.add(user);
}
}
group.setUsers(users);
groupDao.persist(group);
removeExpiredUseByUsernames(usernames);
}
@Override
public void removeAuthoritiesInGroup(final String name,final Set<String> authNames) throws UserServiceException{
Group group = getExistGroup(name);
if(group.getAuthorities().isEmpty()){
return ;
}
Set<Authority> auths = new HashSet<Authority>();
for(Authority auth : group.getAuthorities()){
if(!authNames.contains(auth.getName())){
auths.add(auth);
}
}
group.setAuthorities(auths);
groupDao.persist(group);
removeExpiredUsers(group.getUsers());
}
}