GrantUserToRoleAction.java

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

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.lang.StringUtils;
import com.mycim.valueobject.MessageIdList;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.bas.NamedObject;
import com.mycim.valueobject.bas.Relation;
import com.mycim.valueobject.consts.LinkTypeList;
import com.mycim.valueobject.consts.SessionNames;
import com.mycim.valueobject.security.Role;
import com.mycim.valueobject.security.User;
import com.mycim.webapp.Constants;
import com.mycim.webapp.WebUtils;
import com.mycim.webapp.actions.AbstractAction;
import com.mycim.webapp.forms.security.UserInfoForm;
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.Collection;
import java.util.List;

/**
 * @author Johnson Wang
 **/
public class GrantUserToRoleAction extends AbstractAction {

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

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

        return qryRoleAllByUser(mapping, (UserInfoForm) form, request, response);
    }

    @Override
    public ActionForward cancel(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                                HttpServletResponse response) throws Exception {
        String jumpToUser = ((UserInfoForm) form).getJumpToUser();
        if ("1".equals(jumpToUser)) {
            response.sendRedirect(request.getContextPath() + "/userQuery.do?init=1");
            return WebUtils.NULLActionForward;
        } else {
            return mapping.findForward("cancel");
        }
    }

    public ActionForward qryRoleAllByUser(ActionMapping mapping, UserInfoForm theform, HttpServletRequest request,
                                          HttpServletResponse response) {
        long userRrn = getInstanceRrn(theform.getInstanceId(), LocalContext.getFacilityRrn(), ObjectList.USER_KEY);
        Collection userRoles = getUserRoles(userRrn);
        theform.setPages(new Integer(1));
        User user = new User();
        user.setInstanceRrn(getInstanceRrn(WebUtils.getParameter("instanceId", request), LocalContext.getFacilityRrn(),
                                           ObjectList.USER_KEY));
        user.setRoleList(userRoles);
        request.setAttribute(SessionNames.USERPROFILE_KEY, user);
        return (new ActionForward(mapping.getInput()));
    }

    public ActionForward deleteUserGrantRole(ActionMapping mapping, UserInfoForm theform, HttpServletRequest request,
                                             HttpServletResponse response) {
        User user = new User();
        user.setInstanceRrn(
                getInstanceRrn(theform.getInstanceId(), LocalContext.getFacilityRrn(), ObjectList.USER_KEY));
        String item = WebUtils.getParameter(Constants.ITEM_KEY, request);
        Assert.isFalse(StringUtils.isBlank(item),
                       Errors.create().key(MessageIdList.USER_MISSING_DELETED_INFORMATION).content("删除的信息为空或者不存在!")
                             .build());

        Role role = new Role();
        role.setInstanceRrn(new Long(item).longValue());

        removeUserToRole(user, role);
        user.setRoleList(this.getUserRoles(user.getInstanceRrn()));
        request.setAttribute(SessionNames.USERPROFILE_KEY, user);
        return (new ActionForward(mapping.getInput()));
    }

    public ActionForward addUserGrantRole(ActionMapping mapping, UserInfoForm theform, HttpServletRequest request,
                                          HttpServletResponse response) {
        User user = new User();
        user.setInstanceRrn(
                getInstanceRrn(theform.getInstanceId(), LocalContext.getFacilityRrn(), ObjectList.USER_KEY));
        String roleId = theform.getRoleId();
        long roleRrn = getInstanceRrn(StringUtils.trimToUpperCase(roleId),
                                      getNamedSpace(ObjectList.ROLE_KEY, LocalContext.getFacilityRrn()),
                                      ObjectList.ROLE_KEY);
        Assert.isFalse(StringUtils.isBlank(roleId) || roleRrn <= 0,
                       Errors.create().key(MessageIdList.ROLE_MISSING_ID).content("角色id为空或者不存在!").build());

        Role role = new Role(StringUtils.trimToUpperCase(roleId),
                             getNamedSpace(ObjectList.ROLE_KEY, LocalContext.getFacilityRrn()), ObjectList.ROLE_KEY);
        Assert.isFalse(role == null, Errors.create().key(MessageIdList.ROLE_MISSING).content("角色为空或者不存在!").build());

        addUserToRole(user, role);
        user.setRoleList(this.getUserRoles(user.getInstanceRrn()));
        theform.setRoleId("");
        request.setAttribute(SessionNames.USERPROFILE_KEY, user);
        return (new ActionForward(mapping.getInput()));
    }

    protected List<Relation> getUserRoles(long userRrn) {
        return securityService.getUserRoles(userRrn);
    }

    protected void removeUserToRole(User user, Role role) {
        Relation relation = buildRelation(user, role);
        Assert.isFalse(null == relation,
                       Errors.create().key(MessageIdList.USER_REMOVE_ERROR).content("从角色中删除用户错误!").build());

        relation.setLinkType(LinkTypeList.USER_ROLE_KEY);
        log.info("before remove");
        log.info("relation " + relation.getFromRrn() + "   " + relation.getToRrn());
        securityService.removeUserFromRole(relation);
    }

    protected void addUserToRole(User user, Role role) {
        Relation relation = buildRelation(user, role);
        Assert.isFalse(null == relation,
                       Errors.create().key(MessageIdList.USER_MISSING_RELATION).content("relation为空!").build());

        relation.setLinkType(LinkTypeList.USER_ROLE_KEY);
        if (baseService.getRelation(relation) == null) {
            securityService.addUserToRole(relation);
        }
    }

    protected Relation buildRelation(NamedObject fromObject, NamedObject toObject) {
        Relation relation = new Relation();
        if (fromObject.getInstanceRrn() <= 0) {
            long fromRrn = baseService.getNamedObjectRrn(fromObject);
            Assert.isFalse(fromRrn <= 0,
                           Errors.create().key(MessageIdList.USER_MISSING_FROMRRN).content("没有找到fromRrn!").build());
            relation.setFromRrn(fromRrn);
        } else {
            relation.setFromRrn(fromObject.getInstanceRrn());
        }
        if (toObject.getInstanceRrn() <= 0) {
            long toRrn = baseService.getNamedObjectRrn(toObject);
            Assert.isFalse(toRrn <= 0,
                           Errors.create().key(MessageIdList.USER_MISSING_TORRN).content("没有找到toRrn!").build());
            relation.setToRrn(toRrn);
        } else {
            relation.setToRrn(toObject.getInstanceRrn());
        }
        return relation;
    }

}