/* ==================================================================
* Created [2011-11-03 下午11:32:55] by Jon.King
* ==================================================================
* TSS
* ==================================================================
* mailTo:jinpujun@hotmail.com
* Copyright (c) Jon.King, 2009-2012
* ==================================================================
*/
package com.jinhe.tss.portal.permission;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import com.jinhe.tss.core.exception.BusinessException;
import com.jinhe.tss.portal.PortalConstants;
import com.jinhe.tss.portal.engine.model.Node;
import com.jinhe.tss.portal.engine.model.PortalNode;
import com.jinhe.tss.um.permission.PermissionHelper;
import com.jinhe.tss.um.permission.filter.IPermissionFilter;
import com.jinhe.tss.um.permission.filter.PermissionTag;
/**
* 过滤门户节点结构树。
*/
public class PermissionFilter4Portal implements IPermissionFilter {
@Override
public void doFilter(Object args[], Object returnValue, PermissionTag tag, PermissionHelper helper) {
Node node = (Node) returnValue;
String method = (String) args[2];
String operation;
if("maintain".equals(method)) {
operation = PortalConstants.PORTAL_EDIT_OPERRATION;
}
else if("view".equals(method)) {
operation = PortalConstants.PORTAL_VIEW_OPERRATION;
}
else if("browse".equals(method)) {
operation = PortalConstants.PORTAL_BROWSE_OPERRATION;
}
else {
operation = PortalConstants.PORTAL_BROWSE_OPERRATION;
}
List<Long> permitedResourceIds = helper.getResourceIdsByOperation(tag.application(), PortalConstants.PORTAL_RESOURCE_TYPE, operation);
doFiltrate(node, permitedResourceIds);
}
/**
* 过滤门户节点结构树,递归过程
* @param node
* @param permitedResouceIds
*/
private void doFiltrate(Node node, List<Long> permitedResouceIds){
if(node instanceof PortalNode && !permitedResouceIds.contains(node.getId())){
throw new BusinessException("您对当前门户【" + node.getName()+ "】没有浏览访问权限!");
}
Set<Node> children = node.getChildren();
for(Iterator<Node> it = children.iterator(); it.hasNext();){
Node child = it.next();
if( !permitedResouceIds.contains(child.getId()) ){
it.remove();
continue;
}
doFiltrate(child, permitedResouceIds);
}
}
}