UserGroupAction.java

package com.mycim.webapp.actions.setting.security.usergroup;

import com.fa.sesa.exception.Assert;
import com.fa.sesa.exception.Errors;
import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.logging.Logger;
import com.mycim.framework.logging.LoggerFactory;
import com.mycim.framework.utils.beans.BeanUtils;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.valueobject.MessageIdList;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.bas.Relation;
import com.mycim.valueobject.consts.LinkTypeList;
import com.mycim.valueobject.consts.TransactionNames;
import com.mycim.valueobject.security.UserGroup;
import com.mycim.webapp.Constants;
import com.mycim.webapp.actions.SystemSetupAction;
import com.mycim.webapp.forms.security.UserGroupInfoForm;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;

/**
 * @author Johnson Wang
 **/
public class UserGroupAction extends SystemSetupAction {

    private static final Logger log = LoggerFactory.getLogger(UserGroupAction.class);

    private static String LOT_OWNER_REF = "$LOT_OWNER_CREATE_LOT";


    @Override
    public ActionForward init(ActionMapping mapping, ActionForm theform, HttpServletRequest request,
                              HttpServletResponse response) {

        return mapping.getInputForward();
    }

    public UserGroupInfoForm getUserGroup(UserGroupInfoForm theform) {
        long roleRrn = theform.getInstanceRrn();
        UserGroup ug = new UserGroup();
        if (roleRrn > 0) {
            ug.setInstanceRrn(roleRrn);
            ug = securityService.getUserGroup(ug);
            if (ug != null) {
                BeanUtils.copyProperties(ug, theform);
            }
            theform.setTransId(Constants.MODIFY_KEY);
        } else {
            ug = new UserGroup("", getNamedSpace(ObjectList.USERGROUP_KEY, LocalContext.getFacilityRrn()),
                               ObjectList.USERGROUP_KEY);
            BeanUtils.copyProperties(ug, theform);
            theform.setTransId(Constants.CREATE_KEY);
        }

        return theform;
    }

    public void saveUserGroup(UserGroupInfoForm userGroupForm) {
        String isAdd = userGroupForm.getTransId();
        String userGroupId = StringUtils.trimToUpperCase(userGroupForm.getInstanceId());
        String userId = LocalContext.getUserId();
        Assert.isFalse(StringUtils.isBlank(userGroupId),
                       Errors.create().key(MessageIdList.USERGROUP_MISSING_ID).content("用户组Id为空或者不存在!").build());
        UserGroup userGroup = new UserGroup(userGroupId,
                                            getNamedSpace(ObjectList.USERGROUP_KEY, LocalContext.getFacilityRrn()),
                                            ObjectList.USERGROUP_KEY);
        userGroup.setInstanceDesc(userGroupForm.getInstanceDesc());
        userGroup.setTransPerformedby(userId);
        if (StringUtils.isNotBlank(isAdd)) {
            if (StringUtils.trim(isAdd).equals(Constants.CREATE_KEY)) {
                userGroup.setTransId(TransactionNames.CREATE_KEY);
                securityService.insertUserGroup(userGroup);
            } else if (StringUtils.trim(isAdd).equals(Constants.MODIFY_KEY)) {
                userGroup.setTransId(TransactionNames.MODIFY_KEY);
                securityService.updateUserGroup(userGroup);
            }
        }
    }

    public void saveUserGroupGrantUser(UserGroupInfoForm userGroupInfoForm) {
        long userGroupRrn = userGroupInfoForm.getUserGroupRrn();
        String userId = userGroupInfoForm.getUserId();
        Assert.isFalse(userGroupRrn == 0,
                       Errors.create().key(MessageIdList.USERGROUP_MISSING_RRN).content("用户组Rrn为空或者不存在!").build());
        Assert.isFalse(StringUtils.isBlank(userId),
                       Errors.create().key(MessageIdList.USER_MISSING_RRN_ARRAY).content("用户Rrn数组为空或者不存在!").build());
        Relation relation = new Relation();
        relation.setTransId(Constants.CREATE_KEY);
        long noEnterRrn = getInstanceRrn(Constants.NO_ENTER_KEY, LocalContext.getFacilityRrn(),
                                         ObjectList.USERGROUP_KEY);
        String[] userRrns = StringUtils.split(StringUtils.substringBeforeLast(userId, ","), ",");
        for (int i = 0; i < userRrns.length; i++) {
            relation.setFromRrn(new Long(userRrns[i]));
            relation.setLinkType(LinkTypeList.USER_USERGROUP_KEY);
            relation.setToRrn(userGroupRrn);
            processDetails(relation);

            // 如果是NO_ENTER用户组,从NO_ENTER中删除用户的话,要改变用户的状态,从LOCKED变为NORMAL
            if (noEnterRrn == Long.valueOf(userGroupRrn)) {
                securityService.changeUserStatus(new Long(userRrns[i]), Constants.LOCKED_KEY, LocalContext.getUserId());
            }
        }
    }

    private void processDetails(Relation relation) {
        String action = relation.getTransId();

        if (action.equals(Constants.CREATE_KEY)) {

            securityService.addUserToUsergroup(relation);
        } else if (action.equals(Constants.DELETE_KEY)) {
 
            securityService.removeUserFromGroup(relation);
        }
    }

    public void deleteUserGroup(UserGroupInfoForm userGroupInfoForm) {
        String userGroupId = userGroupInfoForm.getUserGroupId();
        Assert.isFalse(StringUtils.isBlank(userGroupId),
                       Errors.create().key(MessageIdList.USERGROUP_MISSING_ID).content("用户组Id为空或者不存在!").build());
        UserGroup userGroup = new UserGroup(userGroupId, baseService
                .getNamedSpace(LocalContext.getFacilityRrn(), ObjectList.USERGROUP_KEY), ObjectList.USERGROUP_KEY);
        userGroup = securityService.getUserGroup(userGroup);
        userGroup.setTransId(Constants.DELETE_KEY);
        Assert.isFalse(securityService.isAdminGroup(userGroup.getInstanceRrn()),
                       Errors.create().key(MessageIdList.USERGROUP_IS_ADMIN).content("用户组为管理员组,无法删除!").build());
        boolean confirmDeleteFlag = userGroupInfoForm.isConfirmDelete();
        if (confirmDeleteFlag != true) {
            Collection users = securityService.getUsers(userGroup);
            Assert.isFalse(users != null && users.size() > 0,
                           Errors.create().key(MessageIdList.USERGROUP_HAS_USER).content("用户组下有用户,无法删除!").build());
        }
        securityService.deleteUserGroup(userGroup);
    }

    public void deleteHasUserGroupGrantUser(UserGroupInfoForm userGroupInfoForm) {
        long userGroupRrn = userGroupInfoForm.getUserGroupRrn();
        String userId = userGroupInfoForm.getUserId();
        Assert.isFalse(userGroupRrn == 0,
                       Errors.create().key(MessageIdList.USERGROUP_MISSING_ID).content("用户组Id为空或者不存在!").build());
        Assert.isFalse(StringUtils.isBlank(userId),
                       Errors.create().key(MessageIdList.USER_MISSING_RRN_ARRAY).content("用户Rrn数组为空或者不存在!").build());
        Relation relation = new Relation();
        relation.setTransId(Constants.DELETE_KEY);
        long noEnterRrn = getInstanceRrn(Constants.NO_ENTER_KEY, LocalContext.getFacilityRrn(),
                                         ObjectList.USERGROUP_KEY);
        String[] userRrns = StringUtils.split(StringUtils.substringBeforeLast(userId, ","), ",");
        for (int i = 0; i < userRrns.length; i++) {
            relation.setFromRrn(new Long(userRrns[i]));
            relation.setLinkType(LinkTypeList.USER_USERGROUP_KEY);
            relation.setToRrn(userGroupRrn);
            processDetails(relation);

            // 如果是NO_ENTER用户组,从NO_ENTER中删除用户的话,要改变用户的状态,从LOCKED变为NORMAL
            if (noEnterRrn == userGroupRrn) {
                securityService.changeUserStatus(new Long(userRrns[i]), Constants.NORMAL_KEY, LocalContext.getUserId());
            }
        }
    }

    public Map qryUserGroupAll() {
        Collection userGroupList = null;
        userGroupList = securityService.getUserGroupAll();
        Map json = new HashMap();
        json.put("results", userGroupList);
        json.put("rows", userGroupList.size() + "");
        return json;
    }

    public Map qryUserGroupGrantUserAll(UserGroupInfoForm userGroupInfoForm) {
        Collection userGroupGrantUserList = null;
        Collection hasUserGroupGrantUserList = null;
        String userId = userGroupInfoForm.getUserId();
        long userGroupRrn = userGroupInfoForm.getUserGroupRrn();
        Collection tempMenuTree = new ArrayList();
        if (StringUtils.isNotBlank(userId)) {
            userGroupGrantUserList = securityService
                    .getGroupUserById(StringUtils.trimToUpperCase(userId), new Long(userGroupRrn).longValue());
        } else {
            userGroupGrantUserList = securityService.getUserAll();
            hasUserGroupGrantUserList = securityService.getHasGrantUserAll(new Long(userGroupRrn).longValue(), "");
            for (Iterator iterator = userGroupGrantUserList.iterator(); iterator.hasNext(); ) {
                HashMap grantUser = (HashMap) iterator.next();
                String grantUserId = (String) grantUser.get("instanceId");
                for (Iterator iterator2 = hasUserGroupGrantUserList.iterator(); iterator2.hasNext(); ) {
                    HashMap hasGrantUser = (HashMap) iterator2.next();
                    String hasGrantUserId = (String) hasGrantUser.get("instanceId");
                    if (grantUserId.equals(hasGrantUserId)) {
                        tempMenuTree.add(grantUser);
                    }
                }
            }
            if (tempMenuTree.size() > 0) {
                userGroupGrantUserList.removeAll(tempMenuTree);
            }
        }
        Map json = new HashMap();
        json.put("results", userGroupGrantUserList);
        json.put("rows", userGroupGrantUserList.size() + "");
        return json;
    }

    public Map qryHasUserGroupGrantUserAll(UserGroupInfoForm userGroupInfoForm) {
        long userGroupRrn = userGroupInfoForm.getUserGroupRrn();
        String userid = userGroupInfoForm.getUserId();
        List<Map> userGroupGrantUserList = securityService
                .getHasGrantUserAll(new Long(userGroupRrn).longValue(), userid);
        Map json = new HashMap();
        json.put("results", userGroupGrantUserList);
        json.put("rows", userGroupGrantUserList.size() + "");
        return json;
    }

    public Map qrylotOwnerInfo(UserGroupInfoForm userGroupInfoForm) {
        Collection userGroupGrantUserList = new HashSet();
        List<String> groupsList = sysService.getRefFileKey(LOT_OWNER_REF, "");
        for (Iterator<String> iterator = groupsList.iterator(); iterator.hasNext(); ) {
            long userGroupRrn = getInstanceRrn(iterator.next(), LocalContext.getFacilityRrn(),
                                               ObjectList.USERGROUP_KEY);
            userGroupGrantUserList.addAll(securityService.getHasGrantUserAll(userGroupRrn, ""));
        }
        Map json = new HashMap();
        json.put("results", userGroupGrantUserList);
        json.put("rows", userGroupGrantUserList.size() + "");
        return json;
    }

    public List<Map> qryUserGroupGrantTree(UserGroupInfoForm userGroupInfoForm) {
        long userGroupRrn = userGroupInfoForm.getUserGroupRrn();
        Assert.isFalse(userGroupRrn == 0,
                       Errors.create().key(MessageIdList.USERGROUP_MISSING_RRN).content("用户组Rrn为空或者不存在!").build());
        List<Map> userList = securityService.getUserAll();
        for (Map map : userList) {
            HashMap userItem = (HashMap) map;
            String instanceId = (String) userItem.get("instanceId");
            String instanceRrn = (String) userItem.get("instanceRrn");
            userItem.put("boxLabel", instanceId);
            userItem.put("inputValue", instanceRrn);
            userItem.put("checked", new Boolean(false));
        }

        return userList;
    }

    // 菜单是否选中
    private void isChecked(Collection roleGrantMenuList, HashMap menuItem, String id) {
        for (Iterator iteratorGrant = roleGrantMenuList.iterator(); iteratorGrant.hasNext(); ) {
            HashMap grantItem = (HashMap) iteratorGrant.next();
            String torrn = (String) grantItem.get("torrn");
            if (id.equals(torrn)) {
                menuItem.put("checked", new Boolean(true));
                break;
            } else {
                menuItem.put("checked", new Boolean(false));
            }
        }
        if (roleGrantMenuList.size() <= 0) {
            menuItem.put("checked", new Boolean(false));
        }
    }

    private long getUserMenuRrn(long useRrn) {
        return securityService.getUserMenuRrn(useRrn);
    }

}