Package org.beangle.ems.security.service

Source Code of org.beangle.ems.security.service.UserServiceImpl

/* Copyright c 2005-2012.
* Licensed under GNU  LESSER General Public License, Version 3.
* http://www.gnu.org/licenses
*/
package org.beangle.ems.security.service;

import java.sql.Date;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.beangle.commons.collection.CollectUtils;
import org.beangle.ems.security.Group;
import org.beangle.ems.security.GroupMember;
import org.beangle.ems.security.User;
import org.beangle.ems.security.event.GroupCreationEvent;
import org.beangle.ems.security.event.UserAlterationEvent;
import org.beangle.ems.security.event.UserCreationEvent;
import org.beangle.ems.security.event.UserRemoveEvent;
import org.beangle.ems.security.event.UserStatusEvent;
import org.beangle.ems.security.model.GroupMemberBean;
import org.beangle.model.persist.impl.BaseServiceImpl;
import org.beangle.model.query.builder.OqlBuilder;

/**
* 用户信息服务的实现类
*
* @author dell,chaostone 2005-9-26
*/
public class UserServiceImpl extends BaseServiceImpl implements UserService {

  public boolean isAdmin(User user) {
    return User.ROOT.equals(user.getId());
  }

  public boolean isAdmin(Long userId) {
    return User.ROOT.equals(userId);
  }

  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 int updateState(final User manager, Long[] ids, final boolean enabled) {
    assert (null == ids || ids.length < 1);
    @SuppressWarnings("unchecked")
    List<User> users = (List<User>) CollectionUtils.select(getUsers(ids), new Predicate() {
      public boolean evaluate(Object object) {
        User one = (User) object;
        return isManagedBy(manager, one) && !manager.equals(one) && (one.isEnabled() != enabled);
      }
    });

    for (int i = 0; i < users.size(); i++) {
      User cur = users.get(i);
      cur.setEnabled(enabled);
    }
    if (!users.isEmpty()) {
      entityDao.saveOrUpdate(users);
      publish(new UserStatusEvent(users, enabled));
    }
    return users.size();
  }

  public void saveOrUpdate(User user) {
    user.setUpdatedAt(new Date(System.currentTimeMillis()));
    if (!user.isPersisted()) {
      user.setCreatedAt(new Date(System.currentTimeMillis()));
    }
    entityDao.saveOrUpdate(user);
    publish(new UserAlterationEvent(Collections.singletonList(user)));
  }

  // workground for no session
  @SuppressWarnings({ "rawtypes", "unchecked" })
  public List<Group> getGroups(User user, GroupMember.Ship ship) {
    if (isAdmin(user) && !ObjectUtils.equals(ship, GroupMember.Ship.MEMBER)) 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");
    }
    builder.cacheable();
    return entityDao.search(builder);
  }

  public List<GroupMember> getGroupMembers(User user, GroupMember.Ship ship) {
    if (isAdmin(user) && !ObjectUtils.equals(ship, GroupMember.Ship.MEMBER)) {
      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);
    publish(new UserCreationEvent(Collections.singletonList(newUser)));
  }

  public void removeUser(User manager, User user) {
    List<User> removed=CollectUtils.newArrayList();
    if (isManagedBy(manager, user)) {
      entityDao.remove(user);
      removed.add(user);
    }
    publish(new UserRemoveEvent(removed));
  }

  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);
    publish(new GroupCreationEvent(group));
  }

  /**
   * 超级管理员不能删除
   */
  public void removeGroup(User manager, List<Group> groups) {
    List<Object> removed = CollectUtils.newArrayList();
    for (final Group group : groups) {
      if (group.getOwner().equals(manager) || isAdmin(manager)) entityDao.remove(group);
    }
    entityDao.remove(removed);
  }

}
TOP

Related Classes of org.beangle.ems.security.service.UserServiceImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.