/* ==================================================================
* Created [2009-4-27 下午11:32:55] by Jon.King
* ==================================================================
* TSS
* ==================================================================
* mailTo:jinpujun@hotmail.com
* Copyright (c) Jon.King, 2009-2012
* ==================================================================
*/
package com.jinhe.tss.um.action;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.jinhe.tss.component.support.web.webwork.PTActionSupport;
import com.jinhe.tss.core.exception.BusinessException;
import com.jinhe.tss.core.util.DateUtil;
import com.jinhe.tss.core.util.EasyUtils;
import com.jinhe.tss.core.web.dispaly.tree.LevelTreeParser;
import com.jinhe.tss.core.web.dispaly.tree.TreeEncoder;
import com.jinhe.tss.core.web.dispaly.tree.TreeNodeOptionsEncoder;
import com.jinhe.tss.core.web.dispaly.xform.XFormEncoder;
import com.jinhe.tss.um.UMConstants;
import com.jinhe.tss.um.entity.Role;
import com.jinhe.tss.um.entity.permission.resources.RoleResources;
import com.jinhe.tss.um.entity.permission.supplied.RolePermissionsFull;
import com.jinhe.tss.um.permission.PermissionHelper;
import com.jinhe.tss.um.permission.PermissionService;
import com.jinhe.tss.um.permission.dispaly.IPermissionOption;
import com.jinhe.tss.um.permission.dispaly.ResourceTreeParser;
import com.jinhe.tss.um.permission.dispaly.TreeNodeOption4Permission;
import com.jinhe.tss.um.service.IRoleService;
public class RoleAction extends PTActionSupport {
private static final long serialVersionUID = 4201390207436477752L;
private IRoleService roleService;
private PermissionService permissionService;
private Long roleId; //当资源对角色进行授权时, 表示resourceId
private String role2UserIds;
private String role2GroupIds;
private Long parentRoleId;
private Integer roleState = UMConstants.FALSE;
private Long groupId;
private Long targetId; // 移动或者排序的目标节点ID
private int direction; // 分+1(向下),和-1(向上)
private String applicationId; // 应用id
private String resourceType; // 资源类型id
private String permissionRank; // 授权级别(1:普通(10),2/3:可授权,可授权可传递(11))
private String setPermission; // 角色资源权限选项的集合, 当资源对角色授权时: role1|2224,role2|4022
private Role role = new Role();
private String isRole2Resource;
/**
* 获取所有的角色(不包系统级的角色)
*/
public String getAllRole2Tree() {
List<?> roles = roleService.getAllVisiableRole();
TreeEncoder treeEncoder = new TreeEncoder(roles, new LevelTreeParser());
treeEncoder.setNeedRootNode(false);
return print("RoleGroupTree", treeEncoder);
}
/**
* 获取用户可见的角色组
*/
public String getCanAddedGroup2Tree(){
List<?> canAddGroups = roleService.getAddableRoleGroups();
TreeEncoder treeEncoder = new TreeEncoder(canAddGroups, new LevelTreeParser());
treeEncoder.setNeedRootNode(false);
return print("GroupTree", treeEncoder);
}
/**
* 保存一个Role对象的明细信息、角色对用户信息、角色对用户组的信息
*/
public String saveRole() {
boolean isNew = (role.getId() == null);
roleService.saveRole2UserAndRole2Group(role, role2UserIds, role2GroupIds);
return doAfterSave(isNew, role, "RoleGroupTree");
}
/**
* 保存角色组信息
*/
public String saveRoleGroupInfo(){
boolean isNew = (role.getId() == null);
roleService.saveRoleGroup(role);
return doAfterSave(isNew, role, "RoleGroupTree");
}
/**
* 获得角色组信息
*/
public String getRoleGroupInfo(){
XFormEncoder xFormEncoder;
if (isCreateNew()) { // 如果是新增,则返回一个空的无数据的模板
Map<String, Object> map = new HashMap<String, Object>();
map.put("parentId", parentRoleId);
map.put("isGroup", UMConstants.TRUE);
xFormEncoder = new XFormEncoder(UMConstants.ROLEGROUP_XFORM_TEMPLET_PATH, map);
}
else {
Role role = roleService.getRoleById(roleId);
xFormEncoder = new XFormEncoder(UMConstants.ROLEGROUP_XFORM_TEMPLET_PATH, role);
}
return print("RoleGroupInfo",xFormEncoder);
}
/**
* 获取一个Role(角色)对象的明细信息、角色对用户组信息、角色对用户信息
*/
public String getRoleInfoAndRelation() {
if (isCreateNew()) { // 新建角色
return getNewRoleInfoAndRelation();
}
else { // 编辑角色
return getEditRoleInfoAndRelation();
}
}
private String getNewRoleInfoAndRelation(){
XFormEncoder roleXFormEncoder;
TreeEncoder usersTreeEncoder;
TreeEncoder groupsTreeEncoder;
Map<String, Object> map = new HashMap<String, Object>();
map.put("parentId", parentRoleId);
map.put("isGroup", UMConstants.FALSE);
// 默认的有效时间
map.put("startDate", DateUtil.format(new Date()));
Calendar calendar = new GregorianCalendar();
calendar.add(UMConstants.ROLE_LIFE_TYPE, UMConstants.ROLE_LIFE_TIME);
map.put("endDate", DateUtil.format(calendar.getTime()));
// 如果是新增,则返回一个空的无数据的模板
roleXFormEncoder = new XFormEncoder(UMConstants.ROLE_XFORM_TEMPLET_PATH, map);
Map<String, Object> data = roleService.getInfo4CreateNewRole();
usersTreeEncoder = new TreeEncoder(data.get("Role2UserTree"));
usersTreeEncoder.setNeedRootNode(false);
groupsTreeEncoder = new TreeEncoder(data.get("Role2GroupTree"), new LevelTreeParser());
groupsTreeEncoder.setNeedRootNode(false);
TreeEncoder roleToUserTree = new TreeEncoder(null);
TreeEncoder roleToGroupTree = new TreeEncoder(null);
return print(new String[]{"RoleInfo", "Role2GroupTree", "Role2UserTree", "Role2GroupExistTree", "Role2UserExistTree"},
new Object[]{roleXFormEncoder, groupsTreeEncoder, usersTreeEncoder, roleToGroupTree, roleToUserTree});
}
private String getEditRoleInfoAndRelation(){
Map<String, Object> data = roleService.getInfo4UpdateExistRole(roleId);
Role role = (Role)data.get("RoleInfo");
XFormEncoder roleXFormEncoder = new XFormEncoder(UMConstants.ROLE_XFORM_TEMPLET_PATH, role);
TreeEncoder usersTreeEncoder = new TreeEncoder(data.get("Role2UserTree"));
usersTreeEncoder.setNeedRootNode(false);
TreeEncoder groupsTreeEncoder = new TreeEncoder(data.get("Role2GroupTree"), new LevelTreeParser());
groupsTreeEncoder.setNeedRootNode(false);
TreeEncoder roleToGroupTree = new TreeEncoder(data.get("Role2GroupExistTree"));
TreeEncoder roleToUserTree = new TreeEncoder(data.get("Role2UserExistTree"));
return print(new String[]{"RoleInfo", "Role2GroupTree", "Role2UserTree", "Role2GroupExistTree", "Role2UserExistTree"},
new Object[]{roleXFormEncoder, groupsTreeEncoder, usersTreeEncoder, roleToGroupTree, roleToUserTree});
}
/**
* 删除角色
*/
public String delete(){
roleService.delete(roleId);
return printSuccessMessage();
}
/**
* 停用/启用角色
*/
public String disable(){
roleService.disable(roleId, roleState);
return printSuccessMessage();
}
/**
* 排序
*/
public String sort(){
roleService.sort(roleId, targetId, direction);
return printSuccessMessage();
}
/**
* 移动
*/
public String move(){
roleService.move(roleId, targetId);
return printSuccessMessage();
}
/**
* 得到操作权限
*/
public String getOperation() {
roleId = (roleId == null) ? UMConstants.ROLE_ROOT_ID : roleId;
// 角色(组)树上: 匿名角色节点只需一个“角色权限设置”菜单即可
if(roleId.equals(UMConstants.ANONYMOUS_ROLE_ID)) {
return print("Operation", "p1,p2," + UMConstants.PERMISSION_SET_OPERRATION);
}
else {
List<?> list = PermissionHelper.getInstance().getOperationsByResource(roleId, RolePermissionsFull.class.getName(), RoleResources.class);
return print("Operation", "p1,p2," + EasyUtils.list2Str(list));
}
}
/**
* 根据用户组id查找用户列表
*/
public String getUserByGroupId(){
List<?> list = roleService.getUsersByGroupId(groupId);
return print("Group2UserListTree", new TreeEncoder(list));
}
/**
* 查询应用系统列表,根据登录用户ID过滤。
* 现在没有过滤(性能不允许),显示用户能够看到的所有应用, 没有授权权限的是不能进行授权的,所以这里不过滤没有大碍
*/
public String getApplications(){
Map<String, Object> map = new HashMap<String, Object>();
map.put("roleId", roleId);
map.put("isRole2Resource", isRole2Resource);
XFormEncoder xFormEncoder = new XFormEncoder(UMConstants.SERACH_PERMISSION_XFORM_TEMPLET_PATH, map);
List<?> apps = roleService.getPlatformApplication();
String[] appEditor = EasyUtils.generateComboedit(apps, "applicationId", "name", "|");
xFormEncoder.setColumnAttribute("applicationId", "editorvalue", appEditor[0]);
xFormEncoder.setColumnAttribute("applicationId", "editortext", appEditor[1]);
return print("SearchPermission", xFormEncoder);
}
/**
* 根据应用id获得资源类型。 做 应用系统/资源类型/授权级别 三级下拉框时用
*/
public String getResourceTypes(){
StringBuffer sb = new StringBuffer();
sb.append("<column name=\"resourceType\" caption=\"资源类型\" mode=\"string\" editor=\"comboedit\" ");
List<?> types = roleService.getResourceTypeByAppId(applicationId);
String[] resourceTypeEditor = EasyUtils.generateComboedit(types, "resourceTypeId", "name", "|");
sb.append(" editorvalue=\"").append(resourceTypeEditor[0]).append("\" ");
sb.append(" editortext=\"").append(resourceTypeEditor[1]).append("\"/>");
return print("ResourceType", sb);
}
public String initSetPermission(){
if( isRole2Resource != null && "1".equals(isRole2Resource) ){
return getApplications();
}
Map<String, Object> map = new HashMap<String, Object>();
applicationId = applicationId == null ? PermissionHelper.getApplicationID() : applicationId;
map.put("applicationId", applicationId);
map.put("resourceType", resourceType);
map.put("roleId", roleId);
map.put("isRole2Resource", isRole2Resource);
XFormEncoder xFormEncoder = new XFormEncoder(UMConstants.SERACH_PERMISSION_XFORM_TEMPLET_PATH, map);
xFormEncoder.setColumnAttribute("applicationId", "editortext", applicationId);
xFormEncoder.setColumnAttribute("applicationId", "editorvalue", applicationId);
xFormEncoder.setColumnAttribute("resourceType", "editortext", resourceType);
xFormEncoder.setColumnAttribute("resourceType", "editorvalue", resourceType);
return print("SearchPermission", xFormEncoder);
}
// ===========================================================================
// 授权相关方法
// ===========================================================================
/**
* 获取授权用的矩阵图
*/
public String getPermissionMatrix() {
if( EasyUtils.isNullOrEmpty(permissionRank) ){
throw new BusinessException("请选择授权级别");
}
List<Long[]> roleUsers = roleService.getRoles4Permission();
Object[] matrixInfo;
// 角色对资源授权(“角色维护”菜单,多个资源授权给单个角色)时,生成 资源-操作选项 矩阵
if( "1".equals(isRole2Resource) ) {
if( EasyUtils.isNullOrEmpty(applicationId) ){
throw new BusinessException("请选择应用系统");
}
if( EasyUtils.isNullOrEmpty(resourceType) ){
throw new BusinessException("请选择资源类型");
}
matrixInfo = permissionService.genResource2OperationMatrix(applicationId, resourceType,
roleId, permissionRank, roleUsers);
}
// 资源对角色授权(“资源授予角色”菜单,单个资源授权给多个角色)时,生成 角色-操作选项 矩阵。
else {
if( applicationId == null ) {
applicationId = PermissionHelper.getApplicationID();
}
permissionService = PermissionHelper.getPermissionService(applicationId, permissionService);
matrixInfo = permissionService.genRole2OperationMatrix(applicationId, resourceType,
roleId, permissionRank, roleUsers); // 此时roleId其实是资源ID(resourceId)
}
TreeNodeOptionsEncoder treeNodeOptionsEncoder = new TreeNodeOptionsEncoder();
List<?> operations = (List<?>) matrixInfo[1];
if(null != operations){
for ( Object temp : operations ) {
treeNodeOptionsEncoder.add(new TreeNodeOption4Permission((IPermissionOption) temp));
}
}
TreeEncoder rolesTreeEncoder = new TreeEncoder(matrixInfo[0], new ResourceTreeParser());
rolesTreeEncoder.setOptionsEncoder(treeNodeOptionsEncoder);
rolesTreeEncoder.setNeedRootNode(false);
return print("setPermission", rolesTreeEncoder);
}
public String savePermission() {
if( applicationId == null ) {
applicationId = PermissionHelper.getApplicationID();
}
permissionService = PermissionHelper.getPermissionService(applicationId, permissionService);
// 角色对资源授权(“角色维护”菜单,多个资源授权给单个角色)
if( "1".equals(isRole2Resource) ) {
permissionService.saveResources2Role(applicationId, resourceType, roleId, permissionRank, setPermission);
}
// 资源对角色授权(“资源授予角色”菜单,单个资源授权给多个角色)
else {
permissionService.saveResource2Roles(applicationId, resourceType, roleId, permissionRank, setPermission);
}
return printSuccessMessage();
}
public void setRoleService(IRoleService service) {
this.roleService = service;
}
public void setRoleId(Long roleId) {
this.roleId = roleId;
}
public void setParentRoleId(Long parentRoleId) {
this.parentRoleId = parentRoleId;
}
public void setGroupId(Long groupId) {
this.groupId = groupId;
}
public void setRole2GroupIds(String role2GroupIds) {
this.role2GroupIds = role2GroupIds;
}
public void setRole2UserIds(String role2UserIds) {
this.role2UserIds = role2UserIds;
}
public void setRoleState(Integer roleState) {
this.roleState = roleState;
}
public void setDirection(int direction) {
this.direction = direction;
}
public void setTargetId(Long targetId) {
this.targetId = targetId;
}
public void setApplicationId(String applicationId) {
this.applicationId = applicationId;
}
public void setResourceType(String resourceType) {
this.resourceType = resourceType;
}
public void setPermissionRank(String permissionRank) {
this.permissionRank = permissionRank;
}
public Role getRole() {
return this.role;
}
public void setPermissionService(PermissionService permissionService) {
this.permissionService = permissionService;
}
public void setSetPermission(String setPermission) {
this.setPermission = setPermission;
}
public void setIsRole2Resource(String isRole2Resource) {
this.isRole2Resource = isRole2Resource;
}
}