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

        此文档说明如何在Smartbi中实现Java查询。


   在项目的使用过程中,有一些数据不能直接从关系或者多维数据库中获取,可能需要从另外一些途径获取又或者需要一些特殊的处理。
Smartbi中的查询和多维分析无法完成此功能,因此提供了Java查询二次开发接口允许项目进行定制性的开发。 为了应对这种需求,Smartbi
提供了一个可以根据需要扩充的Java查询方式,可以根据实际情况开发来满足您的需求。

  本方案是在Smartbi中添加自定义的Java查询类,并使Smartbi正确的展示数据的过程。 下面讲解一下具体的实现步骤:

  1. 解压smartbi.war到临时目录
  2. 新建Java项目MyAuthProj,将临时目录中的/WEB-INF/lib/smartbi-FreeQuery.jar及其它依赖包添加为项目的依赖包
  3. 新建一个类com.proj.MyJavaQuery,并实现接口IJavaQueryData
  4. 编译项目,将项目中生成的.class文件打包成myjava.jar
  5. 将myjava.jar复制到WAR包解压目录的/WEB-INF/lib目录
  6. 将项目所需要额外的配置文件复制到/WEB-INF目录,将额外需要的依赖包复制到/WEB-INF/lib目录
  7. 重新将临时目录打包成smartbi.war,并替换原始的smartbi.war
  8. 重启服务器
  9. 在【管理】→【系统管理】的“数据源”节点右键新建Java数据源
  10. “Java数据源”上右键“新建Java查询对象”在类名中输入正确的Java查询实现类全名(如com.proj.MyJavaQuery)并检测默认配置
  11. 点击获取参数与结果集并保存
  12. 保存后就可以在【定制】→【数据集定义】的“新建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;
 }
}

 

 

  • 无标签

评论

  1. 周艳 发表:

    /**   *   * @param id id   * @param name 名称   * @param alias 别名   * @param desc 描述   * @param dataType 类型   * @param nullable 是否为空   */  public JavaQueryParameter(String id, String name, String alias, String desc,    ValueType dataType, boolean nullable)

    //建多个参数 public List<JavaQueryParameter> getParameters() {   List<JavaQueryParameter> params = new ArrayList<JavaQueryParameter>();   JavaQueryParameter param = new JavaQueryParameter("parama", "parama", "parama", "parama",     ValueType.STRING, true);   params.add(param);   JavaQueryParameter param2 = new JavaQueryParameter("parama", "parama", "parama", "parama",     ValueType.STRING, true);   params.add(param2);   return params;  }

     

    /**

      * 设置参数值

      */

     public void setParameterValue(String id, String value, String displayValue) {

     }

    //这个是获取参数值再存到JAVA中的,这个方法由第三方自行实现

    public void setParameterValue(参数ID, 参数真实值, 参数显示值) {

    }