/* ==================================================================
* 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.permission;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import com.jinhe.tss.component.support.persistence.TreeSupportDao;
import com.jinhe.tss.component.support.persistence.entityaop.IDecodable;
import com.jinhe.tss.core.exception.BusinessException;
import com.jinhe.tss.core.util.BeanUtil;
import com.jinhe.tss.um.UMConstants;
/**
* <p>
* 操作资源表时相关的补全操作和删除操作
* </p>
*/
public class ResourcePermissionImpl extends TreeSupportDao<IDecodable> implements ResourcePermission {
public ResourcePermissionImpl() {
super(IDecodable.class);
}
@Autowired private RemoteResourceTypeDao resourceTypeDao;
public void addResource(Long resourceId, String resourceTypeId) {
flush();
String unSuppliedTable = resourceTypeDao.getUnSuppliedTable(PermissionHelper.getApplicationID(), resourceTypeId);
String suppliedTable = resourceTypeDao.getSuppliedTable(PermissionHelper.getApplicationID(), resourceTypeId);
String resourceTable = resourceTypeDao.getResourceTable(PermissionHelper.getApplicationID(), resourceTypeId);
IResource resource = (IResource) getEntity(BeanUtil.createClassByName(resourceTable), resourceId);
if(resource == null) {
throw new BusinessException("权限补齐时找不到资源对象,请检查资源视图(" + resourceTable + ")中是否包含该对象?或者是否过滤掉了?");
}
List<?> parentPermissions = getEntities("from " + suppliedTable + " t where t.resourceId = ?", resource.getParentId());
for (Object temp : parentPermissions) {
ISuppliedPermission parentPermission = (ISuppliedPermission) temp;
Integer permissionState = parentPermission.getPermissionState();
// 子节点的权限跟父节点的一模一样
PermissionHelper.getInstance().insertSuppliedTable(parentPermission, resource, suppliedTable);
/* 如果permission的授权状态为PERMIT_NODE_SELF(即仅此节点,不向下传递),则相应的在未补齐表中加入一条当前新增节点授权记录
删除的时候用的到,参考com.jinhe.tss.um.permission.impl.PermissionDao.deleteOldPermission()方法 */
if(permissionState.equals(UMConstants.PERMIT_NODE_SELF)){
PermissionHelper.getInstance().insertUnSuppliedTable(parentPermission, resourceId, unSuppliedTable);
}
}
}
// public void addResource_old(Long resourceId, String resourceTypeId) {
// flush();
// String unSuppliedTable = resourceTypeDao.getUnSuppliedTable(PermissionHelper.getApplicationID(), resourceTypeId);
// String suppliedTable = resourceTypeDao.getSuppliedTable(PermissionHelper.getApplicationID(), resourceTypeId);
// String resourceTable = resourceTypeDao.getResourceTable(PermissionHelper.getApplicationID(), resourceTypeId);
// Long rootId = resourceTypeDao.getResourceRootId(PermissionHelper.getApplicationID(), resourceTypeId);
//
// List<?> parentNodes = getParentsById(resourceTable, resourceId, rootId);
// for (Iterator<?> it = parentNodes.iterator(); it.hasNext();) {
// IResource parentResource = (IResource) it.next();
//
// // 获取未补全表中和指定资源相关授权状态为2【权限维护状态 1:仅此节点, 2:该节点及所有下层节点】的授权信息,以进行补全
// List<?> parentPermissions = getEntities("from " + unSuppliedTable + " t where t.resourceId = ? and t.permissionState = ?",
// parentResource.getId(), UMConstants.PERMIT_SUB_TREE );
// for (Object parentPermission : parentPermissions) {
// IResource resource = (IResource) getEntity(BeanUtil.createClassByName(resourceTable), resourceId);
// PermissionHelper.getInstance().insertSuppliedTable((IUnSuppliedPermission) parentPermission, resource, suppliedTable);
// }
// }
// }
public void delResource(Long resourceId, String resourceTypeId){
flush();
String unSuppliedTable = resourceTypeDao.getUnSuppliedTable(PermissionHelper.getApplicationID(), resourceTypeId);
String suppliedTable = resourceTypeDao.getSuppliedTable(PermissionHelper.getApplicationID(), resourceTypeId);
executeHQL("delete " + suppliedTable + " t where t.resourceId = ?", resourceId); // 删除授权视图(补齐的表)
executeHQL("delete " + unSuppliedTable + " t where t.resourceId = ?", resourceId); // 删除授权表(未补齐表)
}
public void updateResource(Long resourceId, String resourceTypeId){
String suppliedTable = resourceTypeDao.getSuppliedTable(PermissionHelper.getApplicationID(), resourceTypeId);
String resourceTable = resourceTypeDao.getResourceTable(PermissionHelper.getApplicationID(), resourceTypeId);
List<?> children = getChildrenById(resourceTable, resourceId);
// 先删除已经存在的关系
for (Object child : children) {
executeHQL("delete " + suppliedTable + " t where t.resourceId = ?", ((IResource) child).getId());
}
// 建立新的关系
for(Object child : children){
addResource(((IResource) child).getId(), resourceTypeId);
}
}
public List<?> getResourceIds(String applicationId, String resourceTypeId, String operationId, Long userId) {
String suppliedTable = resourceTypeDao.getSuppliedTable(applicationId, resourceTypeId);
String hql = "select distinct t.resourceId from " + suppliedTable + " t, RoleUserMapping ru " +
" where t.roleId = ru.id.roleId and t.operationId = ? and ru.id.userId = ?";
return getEntities(hql, operationId, userId);
}
public List<?> getParentResourceIds(String applicationId, String resourceTypeId, Long resourceId,
String operationId, Long operatorId){
String resourceTable = resourceTypeDao.getResourceTable(PermissionHelper.getApplicationID(), resourceTypeId);
Class<?> resourceClazz = BeanUtil.createClassByName(resourceTable);
IDecodable decodable = (IDecodable) getEntity(resourceClazz, resourceId);
if(decodable == null) { //如果资源表中找不到了该id对应的资源,则可能该资源已经被删除
return new ArrayList<Object>();
}
String suppliedTable = resourceTypeDao.getSuppliedTable(applicationId, resourceTypeId);
String hql = "select distinct t.id from " + resourceClazz.getName() + " t, RoleUserMapping r, " + suppliedTable + " v" +
" where t.id = v.resourceId and v.roleId = r.id.roleId and r.id.userId = ? and v.operationId = ? and ? like t.decode || '%'";
return getEntities(hql, operatorId, operationId, decodable.getDecode());
}
public List<?> getSubResourceIds(String applicationId, String resourceTypeId, Long resourceId,
String operationId, Long operatorId){
String resourceTable = resourceTypeDao.getResourceTable(applicationId, resourceTypeId);
Class<?> resourceClazz = BeanUtil.createClassByName(resourceTable);
IDecodable decodable = (IDecodable) getEntity(resourceClazz, resourceId);
if(decodable == null) { //如果资源表中找不到了该id对应的资源,则可能该资源已经被删除
return new ArrayList<Object>();
}
String suppliedTable = resourceTypeDao.getSuppliedTable(applicationId, resourceTypeId);
String hql = "select distinct t.id from " + resourceTable + " t, RoleUserMapping r, " + suppliedTable + " v" +
" where t.id = v.resourceId and v.roleId = r.id.roleId and r.id.userId = ? and v.operationId = ? and t.decode like ?";
return getEntities(hql, operatorId, operationId, decodable.getDecode() + "%");
}
}