此文档说明如何在Smartbi中实现自定义JavaeBean示例。
在项目的使用过程中,有一些数据不能直接从关系或者多维数据库中获取,可能需要从另外一些途径获取又或者需要一些特殊的处理。
Smartbi中的查询和多维分析无法完成此功能,因此提供了Java查询二次开发接口允许项目进行定制性的开发。 为了应对这种需求,Smartbi
提供了一个可以根据需要扩充的Java查询方式,可以根据实际情况开发来满足您的需求。
本方案是在Smartbi中添加自定义的Java查询类,并使Smartbi正确的展示数据的过程。 下面讲解一下具体的实现步骤:
- 解压smartbi.war到临时目录
- 新建Java项目MyAuthProj,将临时目录中的/WEB-INF/lib/smartbi-FreeQuery.jar及其它依赖包添加为项目的依赖包
- 新建一个类com.proj.MyJavaQuery,并实现接口
IJavaQueryData
- 编译项目,将项目中生成的.class文件打包成myjava.jar
- 将myjava.jar复制到WAR包解压目录的/WEB-INF/lib目录
- 将项目所需要额外的配置文件复制到/WEB-INF目录,将额外需要的依赖包复制到/WEB-INF/lib目录
- 重新将临时目录打包成smartbi.war,并替换原始的smartbi.war
- 重启服务器
- 在【管理】→【系统管理】的“数据源”节点右键新建Java数据源
- “Java数据源”上右键“新建Java查询对象”在类名中输入正确的Java查询实现类全名(如com.proj.MyJavaQuery)并检测默认配置
- 点击获取参数与结果集并保存
- 保存后就可以在【定制】→【数据集定义】的“新建Java查询”中使用
这里是一个CSV文件查询的例子源码。
CSVQuery
package smartbi; import java.io.*; import java.util.*; import java.util.Map.Entry; import smartbi.net.sf.json.JSONObject; import smartbi.util.StringUtil; import smartbi.util.ValueType; import smartbi.freequery.metadata.*; import smartbi.freequery.querydata.CellData; import smartbi.freequery.querydata.GridData; /** * Java查询示例代码 */ public class CSVJavaQuery implements IJavaQueryData.ISimpleData { private Map<String, JavaQueryConfig> configs = new LinkedHashMap<String, JavaQueryConfig>(); private BufferedReader reader; private List<JavaQueryOutputField> outputFields; private int currentLine; public CSVJavaQuery() { //增加一个名称为FileName的配置项 addConfig("FileName", "文件名", "给定一个文件名", "test.csv", true); addConfig("Encoding", "编码", "编码方式", "GBK", true); } /** * 获取Java查询需要的配置信息 */ public List<JavaQueryConfig> getConfigs() { return new ArrayList<JavaQueryConfig>(configs.values()); } /** * 添加一个配置项 * @param name 名称 * @param alias 别名 * @param desc 描述 * @param defaultValue 默认值 * @param notNull 是否允许为空 */ private void addConfig(String name, String alias, String desc, String defaultValue, boolean notNull) { JavaQueryConfig p = new JavaQueryConfig(); p.setName(name); p.setAlias(alias); p.setDesc(desc); p.setValue(defaultValue); p.setNotNull(notNull); configs.put(name, p); } /** * 从保存的字符串中恢复配置信息 * @param configStr 配置字符串 */ public void loadConfigs(String configStr) { if(StringUtil.isNullOrEmpty(configStr)) return; JSONObject obj = JSONObject.fromString(configStr); configs.get("FileName").setValue(obj.has("FileName") ? obj.getString("FileName") : null); configs.get("Encoding").setValue(obj.has("Encoding") ? obj.getString("Encoding") : null); } /** * 保存配置信息 * @return 返回配置字符串 */ public String saveConfigs() { JSONObject json = new JSONObject(); for(JavaQueryConfig config : configs.values()) json.put(config.getName(), config.getValue()); return json.toString(); } /** * 设置配置信息 * @param key 名称 * @param value 配置值 */ public void setConfigValue(String key, String value) { configs.get(key).setValue(value); } /** * 设置配置信息 */ public void setConfigValues(Map<String, String> configValues) { for(Entry<String, String> config : configValues.entrySet()) configs.get(config.getKey()).setValue(config.getValue()); } /** * 根据配置信息初始化Java查询对象 */ public void init() { try { reader = new BufferedReader(new InputStreamReader(new FileInputStream(configs.get("FileName").getValue()), configs.get("Encoding").getValue())); String titleLine = reader.readLine(); String[] fields = titleLine.split(","); outputFields = new ArrayList<JavaQueryOutputField>(); for(String str : fields) { JavaQueryOutputField f = new JavaQueryOutputField(); f.setId(str); f.setName(str); f.setAlias(str); f.setDataType(ValueType.STRING); outputFields.add(f); } currentLine = 0; } catch (UnsupportedEncodingException e) { throw new IllegalArgumentException(e); } catch (FileNotFoundException e) { throw new IllegalArgumentException(e); } catch (IOException e) { throw new IllegalArgumentException(e); } } /** * 关闭Java查询对象,关闭必要的资源 */ public void close() { try { if(reader != null) { reader.close(); reader = null; } } catch (IOException e) { throw new IllegalArgumentException(e); } } /** * 返回参数对象 */ public List<JavaQueryParameter> getParameters() { return new ArrayList<JavaQueryParameter>(); } /** * 设置参数值 */ public void setParameterValue(String id, String value, String displayValue) { } /** * 返回Java查询的输出字段 */ public List<JavaQueryOutputField> getOutputFields() { return outputFields; } /** * 获取指定行的数据 */ public GridData getGridData(int from, int count) { try { if(currentLine > from) { reader.close(); reader = new BufferedReader(new InputStreamReader(new FileInputStream(configs.get("FileName").getValue()), configs.get("Encoding").getValue())); reader.readLine(); currentLine = 0; } while(currentLine < from) { reader.readLine(); currentLine++; } List<List<CellData>> datas = new ArrayList<List<CellData>>(); for(int i = 0; i < count; i++) { String line = reader.readLine(); if(line == null) break; currentLine++; String[] fs = line.split(","); List<CellData> row = new ArrayList<CellData>(); for(int j = 0; j < fs.length; j++) { CellData c = new CellData(); c.setStringValue(fs[j]); row.add(c); } datas.add(row); } GridData d = new GridData(); List<String> headers = new ArrayList<String>(); for(JavaQueryOutputField f : outputFields) headers.add(f.getName()); d.setStringHeaders(headers); d.setData(datas); return d; } catch (UnsupportedEncodingException e) { throw new IllegalArgumentException(e); } catch (FileNotFoundException e) { throw new IllegalArgumentException(e); } catch (IOException e) { throw new IllegalArgumentException(e); } } /** * 返回总行数,返回Integer.MAX_VALUE表示未知总行数 */ public int getRowCount() { return Integer.MAX_VALUE; } }