/* ==================================================================
* 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 org.aopalliance.intercept.MethodInvocation;
import org.springframework.beans.factory.annotation.Autowired;
import com.jinhe.tss.component.support.persistence.entityaop.MatchByDaoMethodNameInterceptor;
/**
* <p> ResourcePermissionInteceptor.java </p>
*
* 资源自动注册、补齐等维护操作的拦截器。 </br>
* 拦截资源注册、修改、删除等操作,根据权限模型中依赖关系对被操作的资源进行权限修复。 </br>
*
* 注: UserDao.create or update User 时,无需拦截补齐权限,其权限在GroupUserDao里显示补齐。 </br>
*/
public class ResourcePermissionInterceptor extends MatchByDaoMethodNameInterceptor {
@Autowired private ResourcePermission resourcePermission;
public static final int MOVE = 5;
protected int judgeManipulateKind(String methodName){
if(methodName.startsWith("move")) {
return MOVE;
}
else {
return super.judgeManipulateKind(methodName);
}
}
public Object invoke(MethodInvocation invocation) throws Throwable {
Object[] args = invocation.getArguments();
String methodName = invocation.getMethod().getName();
//get...(...)一般为读取操作,无须进行资源注册
if( args == null || methodName.startsWith("get")){
return invocation.proceed();
}
for (int i = 0; i < args.length; i++) {
if (args[i] instanceof IResource) {
switch (judgeManipulateKind(invocation.getMethod().getName())) {
// 注册资源。
// 注:修改的时候也会被本拦截器拦住,但IResourcePermission.addResource方法会判断节点的权限是否已经补齐了, 如果已经补齐则不再补齐。
// TODO 这种做法需要改进,最好能区分“修改”还是“新增”。
case SAVE:
Object returnObj = invocation.proceed();
addResource((IResource)args[i]); //拦截新增资源的权限补齐操作需要在新增保存完成后。
return returnObj;
// 移动资源
case MOVE:
returnObj = invocation.proceed();
if(returnObj != null && returnObj instanceof IResource) {
moveResource((IResource)returnObj); //拦截移动资源的权限重新补齐操作需要在整个枝移动保存完成后。
}
return returnObj;
// 删除资源
case DELETE:
deleteResource((IResource)args[i]);
break;
}
}
}
return invocation.proceed();
}
/** 新注册一个资源 */
protected void addResource(IResource resource) {
Long resourceId = resource.getId();
String resourceType = resource.getResourceType();
if(resourceId == null || resourceType == null) return;
resourcePermission.addResource(resourceId, resourceType);
}
/** 资源被移动时修改资源 */
protected void moveResource(IResource resource){
Long resourceId = resource.getId();
String resourceType = resource.getResourceType();
if(resourceId == null || resourceType == null) return;
resourcePermission.updateResource(resourceId, resourceType);
}
/** 删除一个注册资源 */
protected void deleteResource(IResource resource) {
Long resourceId = resource.getId();
String resourceType = resource.getResourceType();
if(resourceId == null || resourceType == null) return;
resourcePermission.delResource(resourceId, resourceType);
}
}