- 由 谢凯新创建, 最终由 徐晓兰修改于 三月 16, 2017
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)备选值和默认值设置:SQL
2.4 绑定参数
2.5 建立灵活分析
2.6 导出(以excel为例)
3 相关资源(EPPR-8293)
- 无标签