/* ==================================================================
* 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.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
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.util.BeanUtil;
import com.jinhe.tss.um.UMConstants;
import com.jinhe.tss.um.dao.IGroupDao;
import com.jinhe.tss.um.dao.IUserDao;
import com.jinhe.tss.um.entity.Group;
import com.jinhe.tss.um.entity.User;
import com.jinhe.tss.um.helper.dto.GroupDTO;
import com.jinhe.tss.um.helper.dto.OperatorDTO;
import com.jinhe.tss.um.service.ILoginService;
/**
* <p>
* 用户登录系统相关业务逻辑处理接口:
* <li>根据用户登录名获取用户名及认证方式信息等;
* <li>根据用户ID获取用户信息;
* <li>根据用户登录名获取用户信息;
* </p>
*/
public class LoginService implements ILoginService {
@Autowired private IUserDao userDao;
@Autowired private IGroupDao groupDao;
public String[] getLoginInfoByLoginName(String loginName) {
User user = getUserByLoginName(loginName);
return new String[] { user.getUserName(), user.getAuthenticateMethod() };
}
private User getUserByLoginName(String loginName) {
User user = userDao.getUserByLoginName(loginName);
if (user == null) {
throw new BusinessException("此帐号(" + loginName + ")不存在");
}
else if (UMConstants.TRUE.equals(user.getDisabled())) {
throw new BusinessException("此帐号(" + loginName + ")已被停用");
}
else if (user.getAccountUsefulLife() != null) {
if ( new Date().after(user.getAccountUsefulLife()) ) {
throw new BusinessException("此帐号(" + loginName + ")已过期");
}
}
return user;
}
public OperatorDTO getOperatorDTOByID(Long userId) {
User user = userDao.getEntity(userId);
return createOperatorDTO(user);
}
public OperatorDTO getOperatorDTOByLoginName(String loginName) {
User user = getUserByLoginName(loginName);
return createOperatorDTO(user);
}
/* 拷贝User对象的所有属性到OperatorDTO */
private OperatorDTO createOperatorDTO(User user) {
OperatorDTO dto = new OperatorDTO();
// 共有的属性直接拷贝
BeanUtil.copy(dto, user);
// 其他用户对象特有的属性全部放到DTO的map里面保存
Map<String, Object> dtoMap = dto.getAttributesMap();
Field[] fields = user.getClass().getDeclaredFields();
for (Field field : fields) {
String fieldName = field.getName();
try {
dtoMap.put(fieldName, BeanUtil.getPropertyValue(user, fieldName));
} catch (Exception e) {
}
}
dtoMap.putAll(user.getDynpropertiesMap());
return dto;
}
@SuppressWarnings("unchecked")
public List<Object[]> getUserRolesAfterLogin(Long userId) {
String hql = "select distinct o.id.userId, o.id.roleId from ViewRoleUser o where o.id.userId = ?";
return (List<Object[]>) userDao.getEntities(hql, userId);
}
public List<Long> getRoleIdsByUserId(Long userId) {
List<Object[]> userRoles = getUserRolesAfterLogin(userId);
List<Long> roleIds = new ArrayList<Long>();
for( Object[] urInfo : userRoles ){
roleIds.add((Long) urInfo[1]);
}
return roleIds;
}
public Object[] getRootGroupByUserId(Long userId) {
List<?> list = groupDao.getFatherGroupsByUserId(userId);
if (list.size() == 0) {
return null;
}
Group group = (Group) list.get(0);
return new Object[] {group.getId(), group.getName()};
}
public Map<Integer, Object[]> getGroupsByUserId(Long userId) {
List<?> list = groupDao.getFatherGroupsByUserId(userId);
Map<Integer, Object[]> result = new HashMap<Integer, Object[]>();
for (int i = 1; i < list.size() + 1; i++) {
Group group = (Group) list.get(i - 1);
result.put(i, new Object[] {group.getId(), group.getName()});
}
return result;
}
public List<GroupDTO> getGroupTreeByGroupId(Long groupId) {
List<Group> groups = groupDao.getChildrenById(groupId);
List<GroupDTO> returnList = new ArrayList<GroupDTO>();
for( Group group : groups ){
GroupDTO dto = new GroupDTO();
dto.setId(group.getId().toString());
dto.setName(group.getName());
dto.setParentId(group.getParentId().toString());
returnList.add(dto);
}
return returnList;
}
public List<OperatorDTO> getUsersByGroupId(Long groupId) {
List<User> users = groupDao.getUsersByGroupId(groupId);
return translateUserList2DTO(users);
}
public OperatorDTO translateUser(Long userId, String userDepositoryCode) {
User user = userDao.getEntity(userId);
if (user == null) {
throw new BusinessException("没有找到编号ID为(" + userId + ")的用户");
}
// 不同用户库; 如若相同,则直接返回用户。
String originalUserDepositoryCode = user.getApplicationId();
if ( !userDepositoryCode.equals(originalUserDepositoryCode) ) {
// 原用户不为平台用户,则先将给用户转换为平台用户,再有平台用户转换为目标用户库的用户
if (!UMConstants.TSS_APPLICATION_ID.equals(originalUserDepositoryCode)) {
user = userDao.getAppUser(userId, UMConstants.TSS_APPLICATION_ID); // 取到平台用户
if (user == null) {
throw new BusinessException("用户(" + userId + ")没有对应的平台("
+ UMConstants.TSS_APPLICATION_ID + ")用户");
}
}
Long appUserId = user.getId();
user = userDao.getAppUser(appUserId, userDepositoryCode); // 取到目标用户库的用户
if (user == null) {
throw new BusinessException("用户【" + appUserId + "】没有对应的其他用户库【" + userDepositoryCode + "】用户");
}
}
return createOperatorDTO(user);
}
public void savePassword(Long userId, String password) {
User user = userDao.getEntity(userId);
user.setPassword(password);
userDao.update(user);
}
@SuppressWarnings("unchecked")
public List<OperatorDTO> getUsersByRoleId(Long roleId) {
String hql = "select distinct u from RoleUser ru, User u" +
" where ru.id.userId = u.id and ru.id.roleId = ? order by u.id";
List<User> data = (List<User>) groupDao.getEntities( hql, roleId );
return translateUserList2DTO(data);
}
@SuppressWarnings("unchecked")
public List<Group> getGroupsByRoleId(Long roleId) {
String hql = "select distinct g from RoleGroup rg, Group g" +
" where rg.groupId = g.id and rg.roleId = ? order by g.decode";
return (List<Group>) groupDao.getEntities( hql, roleId );
}
private List<OperatorDTO> translateUserList2DTO(List<User> users){
List<OperatorDTO> returnList = new ArrayList<OperatorDTO>();
for( User user : users ){
returnList.add(createOperatorDTO(user));
}
return returnList;
}
}