/* ==================================================================
* Created [2009-4-27 下午11:32:55] by Jon.King
* ==================================================================
* TSS
* ==================================================================
* mailTo:jinpujun@hotmail.com
* Copyright (c) Jon.King, 2009-2012
* ==================================================================
*/
package com.jinhe.tss.um.service.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import com.jinhe.tss.core.exception.BusinessException;
import com.jinhe.tss.core.sso.Environment;
import com.jinhe.tss.core.util.EasyUtils;
import com.jinhe.tss.um.UMConstants;
import com.jinhe.tss.um.dao.IGroupDao;
import com.jinhe.tss.um.dao.IRoleDao;
import com.jinhe.tss.um.entity.Group;
import com.jinhe.tss.um.entity.RoleGroup;
import com.jinhe.tss.um.entity.RoleUser;
import com.jinhe.tss.um.entity.Strategy;
import com.jinhe.tss.um.entity.User;
import com.jinhe.tss.um.service.IStrategyService;
public class StrategyService implements IStrategyService {
@Autowired private IRoleDao roleDao;
@Autowired private IGroupDao groupDao;
public void deleteStrategy(Long id) {
roleDao.deleteStrategy((Strategy) roleDao.getEntity(Strategy.class, id));
}
public void disable(Long id, Integer disabled) {
Strategy strategy = (Strategy) roleDao.getEntity(Strategy.class, id);
if(UMConstants.FALSE.equals(disabled) && strategy.getEndDate().getTime() < System.currentTimeMillis()) {
throw new BusinessException(strategy.getName() + " 已过期,不能启用");
}
strategy.setDisabled(disabled);
roleDao.update(strategy);
}
public List<User> getUsersByGroupId(Long groupId) {
return groupDao.getUsersByGroupId(groupId);
}
public Map<String, Object> getStrategyInfo4Create() {
Long operatorId = Environment.getOperatorId();
List<Object> groups = new ArrayList<Object>();
groups.addAll(groupDao.getGroupsByType(Group.MAIN_GROUP_TYPE, operatorId)); // 主用户组
groups.addAll(groupDao.getGroupsByType(Group.ASSISTANT_GROUP_TYPE, operatorId)); // 辅助用户组
Map<String, Object> map = new HashMap<String, Object>();
map.put("Rule2GroupTree", groups);
map.put("Rule2UserTree", groupDao.getVisibleMainUsers(operatorId));
map.put("Rule2RoleTree", roleDao.getSubAuthorizeableRoles(operatorId));
return map;
}
public Map<String, Object> getStrategyInfo4Update(Long strategyId) {
Long operatorId = Environment.getOperatorId();
Map<String, Object> map = new HashMap<String, Object>();
map.put("RuleInfo", roleDao.getEntity(Strategy.class, strategyId));
map.put("Rule2RoleTree", roleDao.getSubAuthorizeableRoles(operatorId));
map.put("Rule2GroupTree", groupDao.getGroupsByType(Group.MAIN_GROUP_TYPE, operatorId)); // 主用户组
map.put("Rule2GroupExistTree", roleDao.getGroupsByStrategy(strategyId));
map.put("Rule2UserExistTree", roleDao.getUsersByStrategy(strategyId));
map.put("Rule2RoleExistTree", roleDao.getRolesByStrategy(strategyId));
return map;
}
public List<?> getStrategyByCreator() {
return roleDao.getEntities("from Strategy o where o.creatorId = ?" , Environment.getOperatorId());
}
public void saveStrategy(Strategy strategy, String userIds, String groupIds, String roleIds) {
if(strategy.getId() == null) {
roleDao.createObject(strategy);
}
else {
roleDao.update(strategy);
}
// 在角色用户关系表中保存 策略对用户,策略对角色的信息 在角色用户组关系表中保存 策略对用户组,策略对角色的信息
saveRule2Group(strategy, roleIds, groupIds);
saveRule2User(strategy, roleIds, userIds);
}
/**
* <p>
* 在角色用户关系表中保存 策略对用户,策略对角色的信息。
* 策略可以授予用户、用户组、也可以授予角色,或者三者兼有。
* </p>
* @param strategy
* @param roleIdsStr
* @param userIdsStr
*/
private void saveRule2User(Strategy strategy, String roleIdsStr, String userIdsStr) {
List<?> roleUsers = roleDao.getRoleUserByStrategy(strategy.getId());
Map<String, RoleUser> historyMap = new HashMap<String, RoleUser>(); // 把老的转授记录放入一个map, 以"roleId_userId"为key
for (Object temp : roleUsers) {
RoleUser roleUser = (RoleUser) temp;
historyMap.put(roleUser.getRoleId() + "_" + roleUser.getUserId(), roleUser);
}
String[] roleIds = EasyUtils.isNullOrEmpty(roleIdsStr) ? new String[0] : roleIdsStr.split(",");
String[] userIds = EasyUtils.isNullOrEmpty(userIdsStr) ? new String[0] : userIdsStr.split(",");
if (userIds.length > 0 && roleIds.length > 0) {
for (String roleId : roleIds) {
for (String userId : userIds) {
saveRoleUser(historyMap, roleId, userId, strategy);
}
}
} else if (userIds.length == 0) {
for (String roleId : roleIds) {
saveRoleUser(historyMap, roleId, null, strategy);
}
}
else if (roleIds.length == 0) {
for (String userId : userIds) {
saveRoleUser(historyMap, null, userId, strategy);
}
}
//老的转授记录中剩下的就是该删除的了
roleDao.deleteAll(historyMap.values());
}
/** roleId, userId 之一有可能为null */
private void saveRoleUser(Map<String, RoleUser> historyMap, String roleId, String userId, Strategy strategy){
// 如果老的转授记录里面有,则从历史记录中移出
RoleUser roleUser = historyMap.remove(roleId + "_" + userId);
//如果老的转授记录里面没有,则新增
if (roleUser == null) {
roleUser = new RoleUser();
roleUser.setRoleId(Long.valueOf(roleId));
roleUser.setUserId(Long.valueOf(userId));
roleUser.setStrategyId(strategy.getId());
roleDao.createObject(roleUser);
}
}
/**
* <p>
* 在角色用户组关系表中保存 策略对用户组,策略对角色的信息
* </p>
* @param strategy
* @param roleIdsStr
* @param groupIdsStr
*/
private void saveRule2Group(Strategy strategy, String roleIdsStr, String groupIdsStr) {
List<?> roleGroups = roleDao.getRoleGroupByStrategy(strategy.getId());
Map<String, RoleGroup> historyMap = new HashMap<String, RoleGroup>(); // 把老的转授记录做成一个map, 以"roleId_groupId"为key
for (Object temp : roleGroups) {
RoleGroup roleGroup = (RoleGroup) temp;
historyMap.put(roleGroup.getRoleId() + "_" + roleGroup.getGroupId(), roleGroup);
}
String[] roleIds = EasyUtils.isNullOrEmpty(roleIdsStr) ? new String[0] : roleIdsStr.split(",");
String[] groupIds = EasyUtils.isNullOrEmpty(groupIdsStr) ? new String[0] : groupIdsStr.split(",");
if (groupIds.length > 0 && roleIds.length > 0) {
for (String roleId : roleIds) {
for (String groupId : groupIds) {
saveRoleGroup(historyMap, roleId, groupId, strategy);
}
}
} else if (groupIds.length == 0) {
for (String roleId : roleIds) {
saveRoleGroup(historyMap, roleId, null, strategy);
}
}
else if (roleIds.length == 0) {
for (String groupId : groupIds) {
saveRoleGroup(historyMap, null, groupId, strategy);
}
}
// 老的转授记录中剩下的就是该删除的了
roleDao.deleteAll(historyMap.values());
}
/** roleId, groupId 之一有可能为null */
private void saveRoleGroup(Map<String, RoleGroup> historyMap, String roleId, String groupId, Strategy strategy){
// 如果老的转授记录里面有,则从老的转授记录中移出
RoleGroup roleGroup = historyMap.remove(roleId + "_" + groupId);
//如果老的转授记录里面没有,则新增
if (roleGroup == null) {
roleGroup = new RoleGroup();
roleGroup.setRoleId(Long.valueOf(roleId));
roleGroup.setGroupId(Long.valueOf(groupId));
roleGroup.setStrategyId(strategy.getId());
roleDao.createObject(roleGroup);
}
}
}