页面树结构
转至元数据结尾
转至元数据起始

1 概述

1.1 需求

某个项目,它主要是以角色控制报表权限的,现希望能够查看角色与其可查询报表的对应关系。在系统中并没有办法直接做出这样的表,

因此基于java查询,建立灵活分析报表,用于查询角色及其可查询的报表,包含以下信息:

     (1)输出字段:角色名称,资源名称
     (2)参数:角色名称,资源类型

Java查询接口说明请见:IJavaQueryData

注意:本示例来源于实际项目,原始版本是V6.1,可作为参考性质,也许是不能运行的。

1.2 实现思路

1.Java查询实现类

关键步骤

     (1)资源类型(resourceType)控制:只显示灵活分析、电子表格、仪表分析、透视分析、组合分析、地图分析

     (2)判断该角色是否拥有资源的权限和权限类型:getRolesPurviewTypes()

     (3)设置参数和返回参数对象

2.建立灵活分析报表

     (1)建立相关参数(用于绑定java查询类中定义的参数对象)

             角色名称:获取角色信息(t_role)

             资源类型:获取资源信息(t_restree)

    (2)建立java数据源,java查询对象,java查询,灵活分析报表

2 实现步骤

2.1 Java查询实现类

代码:

RoleAccessibleQueryData.java
package smartbi.btjt.javaquery;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.log4j.Logger;
import smartbi.SmartbiException;
import smartbi.catalogtree.CatalogElement;
import smartbi.catalogtree.CatalogTreeErrorCode;
import smartbi.catalogtree.CatalogTreeModule;
import smartbi.catalogtree.IAssignee;
import smartbi.catalogtree.PurviewType;
import smartbi.catalogtree.ResourcePermission;
import smartbi.catalogtree.ResourcePermissionBO;
import smartbi.catalogtree.ResourcePermissionItem;
import smartbi.catalogtree.ResourceTreeNode;
import smartbi.catalogtree.ResourceTreeNodeDAO;
import smartbi.freequery.FreeQueryErrorCode;
import smartbi.freequery.metadata.IJavaQueryData;
import smartbi.freequery.metadata.JavaQueryConfig;
import smartbi.freequery.metadata.JavaQueryOutputField;
import smartbi.freequery.metadata.JavaQueryParameter;
import smartbi.freequery.querydata.CellData;
import smartbi.freequery.querydata.GridData;
import smartbi.user.IRole;
import smartbi.usermanager.RoleDAO;
import smartbi.util.StringUtil;
import smartbi.util.ValueType;
public class RoleAccessibleQueryData implements IJavaQueryData {
	private static final Logger log = Logger
			.getLogger(RoleAccessibleQueryData.class);
	
	private List<? extends IRole> inputRoles;
	private Set<String> resourceTypes = new HashSet<String>(StringUtil.split("SPREADSHEET_REPORT,SIMPLE_REPORT,Dashboard,DashboardMap,INSIGHT,COMBINED_QUERY",
			","));

	public void close() {
	}
	/**
	 * 获取Java查询需要的配置信息
	 */
	public List<JavaQueryConfig> getConfigs() {
		return new ArrayList<JavaQueryConfig>();
	}
	private int skip;
	/**
	 * 获取指定行的数据
	 */
	public GridData getGridData(int from, int count) {
		log.debug("JsonJavaQuery.getGridData()");
		/*if (inputRoles == null)
			throw new SmartbiException(
					FreeQueryErrorCode.EXPR_PARAME_NULL_VALUE)
					.setDetail(getParameters().get(0).getAlias());*/
		Map<String, List<CatalogElement>> maps = new HashMap<String, List<CatalogElement>>();
		for (CatalogElement element : ResourcePermissionBO.getInstance()
				.filterCatalogs(
						CatalogTreeModule.getInstance().getAllElements(),
						PurviewType.REF)) {
			ResourceTreeNode parent = element.getNode().getParentNode();
			String pid = parent == null ? null : parent.getId();
			List<CatalogElement> children = maps.get(pid);
			if (children == null) {
				children = new ArrayList<CatalogElement>();
				maps.put(pid, children);
			}
			children.add(element);
		}
		GridData grid = new GridData();
		List<String> headers = new ArrayList<String>();
		for (JavaQueryOutputField f : getOutputFields())
			headers.add(f.getId());
		grid.setStringHeaders(headers);
		grid.setData(new ArrayList<List<CellData>>());
		for (IRole role : inputRoles) {
			getUserAccessibleGridData(from, count, maps, grid, role);
		}
		return grid;
	}
	/**
	 * 获取用户可见数据
	 * @param from
	 * @param count
	 * @param maps
	 * @param grid
	 * @param role
	 * @return
	 */
	private GridData getUserAccessibleGridData(int from, int count,
			Map<String, List<CatalogElement>> maps, GridData grid, IRole role) {
		List<CatalogElement> roots = maps.get(null);
		List<String> paths = new ArrayList<String>();
		Set<String> rootTypes = new HashSet<String>(Arrays.asList(
				"DEFAULT_TREENODE", "PARAMS", "PUBLIC_PAGES", "DATASOURCES",
				"BUSINESS_THEMES"));
		for (CatalogElement root : roots) {
			if (!rootTypes.contains(root.getType()))
				continue;
			if (root.getType().equals("SELF_TREENODE")
					|| root.getType().equals("SELF_PORTAL_PAGE"))
				continue;
			toGridData(paths, root, maps, from, count, grid, role);
			if (grid.getRowsCount() == count)
				return grid;
		}
		if (grid.getRowsCount() < count) {
			CatalogElement element = CatalogTreeModule.getInstance()
					.getCatalogElementById("PARAMS");
			if (element != null)
				toGridData(paths, element, maps, from, count, grid, role);
		}
		return grid;
	}
	/**
	 * 转换成网格数据
	 */
	private void toGridData(List<String> paths, CatalogElement element,
			Map<String, List<CatalogElement>> maps, int from, int count,
			GridData gridData, IRole role) {
		List<CellData> row = toRowData(paths, element, role);
		if (row != null) {
			if (from > skip)
				skip++;
			else
				gridData.getData().add(row);
		}
		if (gridData.getRowsCount() == count)
			return;
		List<CatalogElement> childs = maps.get(element.getId());
		if (childs == null)
			return;
		String alias = element.getAlias();
		if (StringUtil.isNullOrEmpty(alias))
			alias = element.getName();
		paths.add(alias);
		try {
			for (CatalogElement child : childs) {
				toGridData(paths, child, maps, from, count, gridData, role);
				if (gridData.getRowsCount() == count)
					return;
			}
		} finally {
			paths.remove(paths.size() - 1);
		}
	}
	/**
	 * 转换成行(记录)
	 */
	private List<CellData> toRowData(List<String> paths,
			CatalogElement element, IRole role) {
		if (element.isFolder() || resourceTypes != null
				&& resourceTypes.size() != 0
				&& !resourceTypes.contains(element.getType()))
			return null;
		Set<PurviewType> types = getRolesPurviewTypes(role, element.getId());
		// 管理员查询出来的权限为空
		if (role.getId().equals("ADMINS") || types != null && types.size() > 0) {
			List<CellData> row = new ArrayList<CellData>();
			CellData cell = new CellData();
			cell.setStringValue(element.getId());
			row.add(cell);
			
			cell = new CellData();
			cell.setStringValue(element.getAlias());
			row.add(cell);
			
			cell = new CellData();
			cell.setStringValue(element.getType());
			row.add(cell);
			cell = new CellData();
			cell.setStringValue(role.getId());
			row.add(cell);
			cell = new CellData();
			cell.setStringValue(role.getName());
			row.add(cell);
			cell = new CellData();
			StringBuilder buff = new StringBuilder();
			if (!role.getId().equals("ADMINS")) {
				for (PurviewType p : types)
					buff.append(p.getAlias()).append(',');
				if (buff.length() > 0)
					buff.setLength(buff.length() - 1);
			} else
				buff.append("管理员");
			cell.setStringValue(buff.toString());
			row.add(cell);
			return row;
		}
		return null;
	}
	
	/**
	 * 返回Java查询的输出字段
	 */
	public List<JavaQueryOutputField> getOutputFields() {
		List<JavaQueryOutputField> result = new ArrayList<JavaQueryOutputField>();
		result.add(new JavaQueryOutputField("ResourceId", "ResourceId", "资源ID",
				"", ValueType.STRING, ""));
		result.add(new JavaQueryOutputField("ResourceName", "ResourceName",
				"资源名称", "", ValueType.STRING, ""));
		result.add(new JavaQueryOutputField("ResourceType", "ResourceType",
				"资源类型", "", ValueType.STRING, ""));
		result.add(new JavaQueryOutputField("RoleId", "RoleId", "角色ID", "",
				ValueType.STRING, ""));
		result.add(new JavaQueryOutputField("RoleName", "RoleName", "角色名", "",
				ValueType.STRING, ""));
		result.add(new JavaQueryOutputField("Purview", "Purview", "权限", "",
				ValueType.STRING, ""));
		return result;
	}
	/**
	 * 返回参数对象
	 */
	public List<JavaQueryParameter> getParameters() {
		List<JavaQueryParameter> result = new ArrayList<JavaQueryParameter>();
		result.add(new JavaQueryParameter("RoleName", "RoleName", "角色名称", "",
				ValueType.STRING, true));
		result.add(new JavaQueryParameter("ResourceTypes", "ResourceTypes",
				"资源类型", "", ValueType.STRING, true));
		return result;
	}
	/**
	 * 返回总行数,返回Integer.MAX_VALUE表示未知总行数
	 */
	public int getRowCount() {
		return Integer.MAX_VALUE;
	}
	
	public void init() {
	}
	public void loadConfigs(String configs) {
	}
	public String saveConfigs() {
		return "";
	}
	public void setConfigValue(String key, String value) {
	}
	public void setConfigValues(Map<String, String> configValues) {
	}
	/**
	 * 设置参数值
	 */
	public void setParameterValue(String id, String value, String displayValue) {
		if (id.equals("RoleName")) {
			if (StringUtil.isNullOrEmpty(value))
				inputRoles = null;
			else if(value.equals("全部")){
				inputRoles = RoleDAO.getInstance().likeName("");
			}
			else {
				if (value != null && value.startsWith("'")
						&& value.endsWith("'"))
					value = value.substring(1, value.length() - 1);
				inputRoles = RoleDAO.getInstance().likeName(value);
			}
		} else if (id.equals("ResourceTypes")) {
			this.resourceTypes = new HashSet<String>(StringUtil.split(value,
					","));
		}
		
		
	}
	/**
	 * 通过角色和节点,判断该角色是否拥有权限和权限类型。本方法是参照
	 * ResourcePermissionBO.getInstance().getUserPurviewTypes修改的
	 * @param role : 角色
	 * @param id : 节点ID
	 * @return Set<PurviewType> : 资源类型
	 */
	@SuppressWarnings("unchecked")
	public Set<PurviewType> getRolesPurviewTypes(IRole role, String id) {
		ResourceTreeNode node = ResourceTreeNodeDAO.getInstance().load(id);
		CatalogElement element = null;
		if (node != null) {
			Map<String, CatalogElement> catalogElementMap = (Map<String, CatalogElement>) CatalogTreeModule.getInstance().getStateModule()
					.getRequestAttribute("CATALOGELEMENT_MAP");
			if (catalogElementMap == null) {
				catalogElementMap = new HashMap<String, CatalogElement>();
				CatalogTreeModule
						.getInstance()
						.getStateModule()
						.setRequestAttribute("CATALOGELEMENT_MAP",
								catalogElementMap);
			}
			element = catalogElementMap.get(id);
			if (element == null) {
				element = new CatalogElement(node);
				catalogElementMap.put(id, element);
			}
		}
		if (element == null)
			throw new SmartbiException(
					CatalogTreeErrorCode.CATALOG_ELEMENT_NOT_FOUND);
		Set<PurviewType> types = new HashSet<PurviewType>();
		ResourcePermission perms = element.getPermission();
		if (perms.getOwner() != null) {
			IAssignee owner = perms.getOwner();
			switch (owner.getType()) {
			case ROLE:
				if (role.getId().equals(owner.getId())) {
					types.add(PurviewType.OWNER);
					break;
				}
				break;
			}
		}
		if (perms.getPermissionItems() != null) {
			for (ResourcePermissionItem perm : perms.getPermissionItems()) {
				PurviewType permType = perm.getPurviewType();
				IAssignee assignee = perm.getAssignee();
				if (assignee == null) {
					types.add(permType);
					continue;
				}
				switch (assignee.getType()) {
				case ROLE:
					if (role.getId().equals(assignee.getId())) {
						types.add(permType);
						break;
					}
					break;
				}
			}
		}
		return types;
	}


新建java查询对象用于查询,见wiki Java数据源

2.2 新建java查询

2.3 建立公共参数

资源类型参数

  1. 控件类型:下拉框
  2. 备选值设置:静态列表


角色名称参数
(1)控件类型:列表对话框 (方便点击和搜索两种方式使用)
(2)备选值和默认值设置:SQL

2.4 绑定参数

2.5 建立灵活分析


2.6 导出(以excel为例)


3 相关资源(EPPR-8293)

资源:灵活分析——关于导出角色及可查询的报表.xml

源码:RoleAccessibleQueryData.zip

  • 无标签