/* Copyright c 2005-2012.
* Licensed under GNU LESSER General Public License, Version 3.
* http://www.gnu.org/licenses
*/
package org.beangle.security.blueprint.service;
import java.sql.Date;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.beangle.commons.collection.CollectUtils;
import org.beangle.model.EntityExistException;
import org.beangle.model.persist.impl.BaseServiceImpl;
import org.beangle.model.query.builder.OqlBuilder;
import org.beangle.security.blueprint.AdminUser;
import org.beangle.security.blueprint.Group;
import org.beangle.security.blueprint.GroupMember;
import org.beangle.security.blueprint.User;
import org.beangle.security.blueprint.model.GroupMemberBean;
import org.springframework.dao.DataIntegrityViolationException;
/**
* 用户信息服务的实现类
*
* @author dell,chaostone 2005-9-26
*/
public class UserServiceImpl extends BaseServiceImpl implements UserService {
public boolean isAdmin(User user) {
OqlBuilder<?> query = OqlBuilder.from(AdminUser.class, "admin");
query.where("admin.user=:user", user).select("admin.id");
return !entityDao.search(query).isEmpty();
}
public User get(String name, String password) {
Map<String, Object> params = CollectUtils.newHashMap();
params.put("name", name);
params.put("password", password);
List<?> userList = entityDao.searchHQLQuery(
"from User user where user.name = :name and user.password = :password", params);
if (userList.size() > 0) return (User) userList.get(0);
else return null;
}
public User get(Long id) {
return entityDao.get(User.class, id);
}
public User get(String loginName) {
if (StringUtils.isEmpty(loginName)) return null;
OqlBuilder<User> entityQuery = OqlBuilder.from(User.class, "user");
entityQuery.where("user.name=:name", loginName);
List<User> users = entityDao.search(entityQuery);
return (users.isEmpty()) ? null : users.get(0);
}
public List<User> getUsers(Long[] userIds) {
return entityDao.get(User.class, userIds);
}
public void updateState(Long[] ids, int state) {
assert (null == ids || ids.length < 1);
List<User> users = getUsers(ids);
for (int i = 0; i < users.size(); i++) {
User cur = users.get(i);
cur.setStatus(state);
}
entityDao.saveOrUpdate(users);
}
public void saveOrUpdate(User user) throws EntityExistException {
try {
user.setUpdatedAt(new Date(System.currentTimeMillis()));
if (!user.isPersisted()) {
user.setCreatedAt(new Date(System.currentTimeMillis()));
}
entityDao.saveOrUpdate(user);
} catch (DataIntegrityViolationException e) {
throw new EntityExistException("User already exits:" + user);
} catch (Exception e) {
throw new EntityExistException("User already exits:" + user);
}
}
// workgroup for no session
@SuppressWarnings({ "rawtypes", "unchecked" })
public List<Group> getGroups(User user, GroupMember.Ship ship) {
if (isAdmin(user)) return entityDao.getAll(Group.class);
OqlBuilder builder = OqlBuilder.from(GroupMember.class, "gm");
builder.where("gm.user=:user", user).select("gm.group");
if (null != ship) {
if (ship.equals(GroupMember.Ship.MEMBER)) builder.where("gm.member=true");
if (ship.equals(GroupMember.Ship.MANAGER)) builder.where("gm.manager=true");
if (ship.equals(GroupMember.Ship.GRANTER)) builder.where("gm.granter=true");
}
return entityDao.search(builder);
}
public List<GroupMember> getGroupMembers(User user, GroupMember.Ship ship) {
if (isAdmin(user)) {
List<GroupMember> members = CollectUtils.newArrayList();
List<Group> groups = entityDao.getAll(Group.class);
for (Group group : groups) {
GroupMemberBean gmb = new GroupMemberBean(group, user, GroupMember.Ship.MEMBER);
gmb.setGranter(true);
gmb.setManager(true);
members.add(gmb);
}
return members;
}
OqlBuilder<GroupMember> builder = OqlBuilder.from(GroupMember.class, "gm");
builder.where("gm.user=:user", user);
if (null != ship) {
if (ship.equals(GroupMember.Ship.MEMBER)) builder.where("gm.member=true");
if (ship.equals(GroupMember.Ship.MANAGER)) builder.where("gm.manager=true");
if (ship.equals(GroupMember.Ship.GRANTER)) builder.where("gm.granter=true");
}
return entityDao.search(builder);
}
public void createUser(User creator, User newUser) {
newUser.setCreator(creator);
newUser.setUpdatedAt(new Date(System.currentTimeMillis()));
newUser.setCreatedAt(new Date(System.currentTimeMillis()));
entityDao.saveOrUpdate(newUser);
}
public void removeUser(User manager, User user) {
if (isManagedBy(manager, user)) {
entityDao.remove(user);
}
}
public boolean isManagedBy(User manager, User user) {
return (isAdmin(manager) || manager.equals(user.getCreator()));
}
public void createGroup(User owner, Group group) {
group.setUpdatedAt(new Date(System.currentTimeMillis()));
group.setCreatedAt(new Date(System.currentTimeMillis()));
group.setOwner(owner);
group.getMembers().add(new GroupMemberBean(group, owner, GroupMember.Ship.MANAGER));
entityDao.saveOrUpdate(group);
}
/**
* 超级管理员不能删除
*/
public void removeGroup(User manager, List<Group> groups) {
List<Object> removed = CollectUtils.newArrayList();
for (final Group group : groups) {
for (GroupMember m : manager.getGroups()) {
if (m.getUser().equals(manager)) {
manager.getGroups().remove(m);
removed.add(m);
}
}
if (group.getOwner().equals(manager) || isAdmin(manager)) entityDao.remove(group);
}
entityDao.remove(removed);
}
}