关于导出角色及可查询的报表
...
...
...
...
...
...
1.2 实现思路
1.Java查询实现类
关键步骤
(1)资源类型(resourceType)控制:只显示灵活分析、电子表格、仪表分析、透视分析、组合分析、地图分析
(2)判断该角色是否拥有资源的权限和权限类型:getRolesPurviewTypes()
(3)设置参数和返回参数对象
2.
...
建立灵活分析报表
(1)建立相关参数(用于绑定java查询类中定义的参数对象)
角色名称:获取角色信息(t_role)
...
资源类型:获取资源信息(t_restree)
...
(2)建立java数据源,java查询对象,java查询,灵活分析报表
2 实现步骤
2.1 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)
...