Package org.beangle.webapp.security.action

Source Code of org.beangle.webapp.security.action.UserAction

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

import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang.StringUtils;
import org.beangle.commons.collection.CollectUtils;
import org.beangle.commons.collection.Order;
import org.beangle.commons.lang.SeqStrUtils;
import org.beangle.model.Entity;
import org.beangle.model.query.builder.Condition;
import org.beangle.model.query.builder.OqlBuilder;
import org.beangle.model.transfer.exporter.PropertyExtractor;
import org.beangle.security.blueprint.Group;
import org.beangle.security.blueprint.GroupMember;
import org.beangle.security.blueprint.User;
import org.beangle.security.blueprint.UserCategory;
import org.beangle.security.blueprint.model.GroupMemberBean;
import org.beangle.security.blueprint.service.UserPropertyExtractor;
import org.beangle.security.blueprint.service.UserService;
import org.beangle.security.codec.EncryptUtil;
import org.beangle.struts2.action.ActionTextResource;
import org.beangle.struts2.convention.route.Action;
import org.beangle.webapp.security.helper.UserDashboardHelper;

/**
* 用户管理响应处理类
*
* @author chaostone 2005-9-29
*/
public class UserAction extends SecurityActionSupport {

  private UserService userService;

  private UserDashboardHelper userDashboardHelper;

  protected void indexSetting() {
    put("categories", entityDao.getAll(UserCategory.class));
  }

  public String dashboard() {
    Long userId = getLong("user.id");
    User me = getUser();
    if (null != userId) {
      User managed = (User) entityDao.get(User.class, userId);
      if (me.equals(managed) || userService.isManagedBy(me, managed)) {
        userDashboardHelper.buildDashboard(managed);
        return forward();
      } else {
        return forward(ERROR);
      }
    } else {
      userDashboardHelper.buildDashboard(me);
    }
    return forward();
  }

  protected OqlBuilder<User> getQueryBuilder() {
    User manager = getUser();
    OqlBuilder<User> userQuery = OqlBuilder.from(entityName, "user");
    // 查询用户组
    StringBuilder sb = new StringBuilder("exists(from user.groups ug where ");
    List<Object> params = CollectUtils.newArrayList();
    boolean queryGroup = false;
    if (!userService.isAdmin(manager)) {
      List<Group> mngGroups = userService.getGroups(manager, GroupMember.Ship.MEMBER);
      if (mngGroups.isEmpty()) {
        sb.append("1=0");
      } else {
        sb.append("ug.group in(:groups) ");
        params.add(mngGroups);
      }
      queryGroup = true;
    }
    String groupName = get("groupName");
    if (StringUtils.isNotEmpty(groupName)) {
      if (queryGroup) {
        sb.append(" and ");
      }
      sb.append("ug.name like :groupName ");
      params.add("%" + groupName + "%");
      queryGroup = true;
    }
    if (queryGroup) {
      sb.append(')');
      Condition groupCondition = new Condition(sb.toString());
      groupCondition.params(params);
      userQuery.where(groupCondition);
    }

    Long categoryId = getLong("categoryId");
    if (null != categoryId) {
      userQuery.join("user.categories", "category");
      userQuery.where("category.id=:categoryId", categoryId);
    }
    populateConditions(userQuery);
    userQuery.orderBy(get(Order.ORDER_STR)).limit(getPageLimit());
    return userQuery;
  }

  protected PropertyExtractor getPropertyExtractor() {
    return new UserPropertyExtractor(new ActionTextResource(this));
  }

  /**
   * 保存用户信息
   */
  protected String saveAndForward(Entity<?> entity) {
    User user = (User) entity;
    String errorMsg = "";
    // // 收集用户身份
    String[] categories = StringUtils.split(get("categoryIds"), ",");
    for (int i = 0; i < categories.length; i++) {
      errorMsg = checkCategory(user, Long.valueOf(categories[i]));
      if (StringUtils.isNotEmpty(errorMsg)) { return forward(new Action("edit"), errorMsg); }
    }
    // 检验用户合法性
    errorMsg = checkUser(user);
    if (StringUtils.isNotEmpty(errorMsg)) { return forward(new Action("edit"), errorMsg); }
    try {
      processPassword(user);
      if (!user.isPersisted()) {
        User creator = userService.get(getUserId());
        userService.createUser(creator, user);
      } else {
        userService.saveOrUpdate(user);
      }
      updateUserGroup(user);
    } catch (Exception e) {
      return forward(ERROR);
    }
    return redirect("search", "info.save.success");
  }

  private void updateUserGroup(User user) {
    Set<GroupMember> userMembers = user.getGroups();
    Map<Group, GroupMember> memberMap = CollectUtils.newHashMap();
    for (GroupMember gm : userMembers) {
      memberMap.put(gm.getGroup(), gm);
    }
    Set<GroupMember> newMembers = CollectUtils.newHashSet();
    Set<GroupMember> removedMembers = CollectUtils.newHashSet();
    User manager = getUser();
    Collection<GroupMember> members = userService.getGroupMembers(manager,
        GroupMember.Ship.GRANTER);
    for (GroupMember member : members) {
      GroupMember myMember = memberMap.get(member.getGroup());
      boolean isMember = getBool("member" + member.getGroup().getId());
      boolean isGranter = getBool("granter" + member.getGroup().getId());
      boolean isManager = getBool("manager" + member.getGroup().getId());
      if (!isMember && !isGranter && !isManager) {
        if (null != myMember) {
          user.getGroups().remove(myMember);
          removedMembers.add(myMember);
        }
      } else {
        if (null == myMember) {
          myMember = new GroupMemberBean(member.getGroup(), user, null);
        }
        myMember.setUpdatedAt(new Date());
        myMember.setMember(isMember);
        myMember.setGranter(isGranter);
        myMember.setManager(isManager);
        newMembers.add(myMember);
      }
    }
    entityDao.saveOrUpdate(newMembers);
    entityDao.remove(removedMembers);
  }

  protected void editSetting(Entity<?> entity) {
    User user = (User) entity;
    User manager = getUser();
    Collection<GroupMember> members = userService.getGroupMembers(manager,
        GroupMember.Ship.GRANTER);
    Set<GroupMember> userMembers = user.getGroups();
    Map<Group, GroupMember> memberMap = CollectUtils.newHashMap();
    for (GroupMember gm : userMembers) {
      memberMap.put(gm.getGroup(), gm);
    }
    put("memberMap", memberMap);
    put("members", members);
    put("categories", entityDao.getAll(UserCategory.class));
  }

  /**
   * 删除一个或多个用户
   *
   * @param mapping
   * @param form
   * @param request
   * @param response
   * @return
   */
  public String remove() {
    String userIdSeq = get("userIds");
    Long[] userIds = SeqStrUtils.transformToLong(userIdSeq);
    User creator = userService.get(getUserId());
    List<User> toBeRemoved = userService.getUsers(userIds);
    try {
      for (User one : toBeRemoved) {
        // 不能删除自己
        if (!one.getId().equals(getUserId())) {
          userService.removeUser(creator, one);
        }
      }
    } catch (Exception e) {
      return redirect("search", "info.delete.failure");
    }
    return redirect("search", "info.delete.success");
  }

  /**
   * 禁用或激活一个或多个用户
   *
   * @param mapping
   * @param form
   * @param request
   * @param response
   * @return
   */
  public String activate() {
    String userIdSeq = get("userIds");
    Long[] userIds = SeqStrUtils.transformToLong(userIdSeq);
    String isActivate = get("isActivate");
    try {
      if (StringUtils.isNotEmpty(isActivate) && "false".equals(isActivate)) {
        // logHelper.info(request, "UnActivate userIds:" + userIds);
        userService.updateState(userIds, User.FREEZE);
      } else {
        // logHelper.info(request, "Activate userIds:" + userIds);
        userService.updateState(userIds, User.ACTIVE);
      }
    } catch (Exception e) {
      // logHelper.info(request, "Faliure Activate alert for userIds:"
      // + userIds, e);
      return forward(ERROR, "error.occurred");
    }
    String msg = "ok.activate";
    if (StringUtils.isNotEmpty(isActivate) && "false".equals(isActivate)) msg = "info.unactivate.success";

    return redirect("search", msg);
  }

  /**
   * 核实用户身份
   *
   * @param user
   * @param category
   * @return
   */
  protected String checkCategory(User user, Long categoryId) {
    user.getCategories().add(entityDao.get(UserCategory.class, categoryId));
    return "";
  }

  protected String checkUser(User user) {
    if (!user.isPersisted() && entityDao.exist(entityName, "name", user.getName())) { return "error.model.existed"; }
    return "";
  }

  public String info() throws Exception {
    String loginName = get("loginName");
    if (StringUtils.isNotBlank(loginName)) {
      User user = userService.get(loginName);
      if (null != user) {
        put("user", user);
        return forward();
      } else {
        return null;
      }
    } else {
      return super.info();
    }
  }

  protected void processPassword(User user) {
    String password = get("password");
    if (StringUtils.isNotBlank(password)) {
      user.setPassword(EncryptUtil.encode(password));
    } else if (!user.isPersisted()) {
      password = User.DEFAULT_PASSWORD;
      user.setPassword(EncryptUtil.encode(password));
    }
  }

  public void setUserService(UserService userService) {
    this.userService = userService;
  }

  public void setUserDashboardHelper(UserDashboardHelper userDashboardHelper) {
    this.userDashboardHelper = userDashboardHelper;
  }
}
TOP

Related Classes of org.beangle.webapp.security.action.UserAction

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.