⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 basedatasource.java

📁 Excel Report是一款基于Excel的报表生成工具
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
 * Created on 2006-6-8
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package net.excel.report.datasource;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.excel.report.IQueryDataListener;
import net.excel.report.Logger;
import net.excel.report.base.element.Variable;
import net.excel.report.config.DataSourceConfig;


/**
 * 数据源基类, 实现一些数据源的基本功能, 如数据集的遍历,
 * 事件监听器的设置和触发等如查询监听器的设置和触发等功能.
 * @author juny
 */
public abstract class BaseDataSource implements IDataSource, IDataSourceListener{
    private static Logger log = Logger.getLogger(BaseDataSource.class);
    private String name;
    /**
     * 
     */
    public BaseDataSource(){
        params = new HashMap();
    }
    
    /**
     * 根据指定配置信息,和数据源名称构造一个数据源对象。
     * @param config 数据源配置信息。
     * @param name 数据源名称
     */
    public BaseDataSource(DataSourceConfig config, String name){
        setConfigInfo(config, name);
        params = new HashMap();
    }
    
    /*
     *  (non-Javadoc)
     * @see excel.report.datasource.IDataSource#setConfigInfo(excel.report.config.DataSourceConfig, java.lang.String)
     */
    public void setConfigInfo(DataSourceConfig config, String name){
        this.config = config;
        this.name = name;
    }
    
    /*
     *  (non-Javadoc)
     * @see excel.report.datasource.IDataSource#getName()
     */
    public String getName(){
        return this.name;
    }
    
    /*
     *  (non-Javadoc)
     * @see excel.report.datasource.IDataSource#getConfig()
     */
    public DataSourceConfig getConfig(){
        return this.config;
    }
    
    /*
     *  (non-Javadoc)
     * @see excel.report.datasource.IDataSource#setParameter(java.lang.String, java.lang.Object)
     */
    public void setParameter(String param, Object value){
        params.put(param, value);
    }
    
    /*
     *  (non-Javadoc)
     * @see excel.report.datasource.IDataSource#queryData()
     */
    public final int queryData() throws Exception {
        //装载输入参数
        loadInitParams();
        
        boolean needQuery = true;
        int queryResult = IDataSource.QUERY_FAILURE;
        if(null != queryListener){
            //调用查询监听器检索数据
            if(queryListener.beforeQuery(this)){
                //如果查询监听器返回值跳过默认查询则直接返回
                needQuery = false;
            }
        }
        
        //调用实现类检索数据
        if(needQuery){
            queryResult = query(params);
        }
        
        if(null != queryListener){
            //调用查询后处理监听器
            queryListener.afterQuery(this);
        }
        
        return queryResult;
    }
    
    /**
     * 继承类重载该函数来实现数据源数据的检索, 所有继承至BaseDataBase的数据源都必须
     * 重载该函数,来实现数据检索工作。
     * @param param
     * @return
     * @throws Exception
     */
    public int query(Map param)throws Exception {
        //返回检索数据失败, 因此继承函数必须重载该
        //函数否则数据检索不会成功.
        return IDataSource.QUERY_FAILURE;
    }
    
    /**
     * 初始化,并取得数据源的输入参数. 该输入参数可能是一个字段变量,也可能是一个
     * 输入参数,还有可能是一个常量
     * @throws Exception
     */
    private void loadInitParams() throws Exception{
        Object variable = null, tempObj = null;
        boolean resetParam = false;

        String temp = "", value = "";
        Map paramsInit = getParamInit();
        List configParams = getConfig().getParams();
        
        if(null != paramsInit && null != params){
            //已经配置配置过参数则清除掉原来的参数
            if(params.size() > 0){
                params.clear();
            }
            
            if(paramsInit.size() != configParams.size()){
                log.warn("The initialial parameters are not equal the datasource config parameters! 2");
            }
            
            //取得配置输入参数的值,该输入参数可能是一个字段变量,也可能是一个
            //输入参数,还有可能是一个常量
            for(int i=0; i<configParams.size(); i++){
                variable = paramsInit.get((String)configParams.get(i));
	            if(null != variable){
	                String fieldValue = null;
	                if(variable instanceof Variable){
	                    tempObj = ((Variable)variable).getString();
	                    if(null != tempObj){
	                        fieldValue = tempObj.toString();
	                    }
	                }else{
	                    log.error("Error: In BaseDataSource.getParam();");
	                }
	                
	                if(null != fieldValue){
	                    this.setParameter((String)configParams.get(i), fieldValue);
	                }
	            }
            }
        }
    }
    
    /**
     * 设置该数据源实例的输入参数取值配置信息。信息保存方式为:(key=数据源对应的输入参数名称, value=参数值取值配置)
     * <br>因为如果某个数据源在其定义过程中如果配置了相应的参数信息,
     * 当系统在生成具体的某个报表时使用到了该数据源,这是候必须在配置文件中引用该数据源,同时也必须配置
     * 该数据源实例的输入参数配置信息,即告诉该数据源实例,当它需要输入参数时应该去从那获得参数的值。
     * 该配置通过< param-init >节点来定义,例如:<br>
     * < datasource name="s5" source="testDataSource2"><br>
     * < param-init name="arg1" value="$P{argumentName}"/ ><br>
     * < /datasource><br>
     * 在上面的配子文件中配置了一个名为s5的数据源的输入参数的配置信息,
     * 其表示数据源其有一个名为arg1的输入参数应该去用户请求报表参数列表中取名称为
     * argumentName的参数值。
     * @param paramInit 初始化输入参数配置信息。
     */
    public void setParamInit(Map paramInit){
        //拷贝参数到本地,不能直接引用,应为在具体的数据源中会修改
        //paramsInit中保存的初始化参数信息,会将初始化变量替换成相应的
        //变量对象
        if(null != paramInit){
            this.paramsInit = new HashMap(paramInit);
        }
    }
    
    /**
     * 取得数据输入参数参数配置信息。在<param-init>节点配置
     * @return 返回配置信息列表,
     */
    public Map getParamInit(){
        return paramsInit;
    }
    
    /*
     *  (non-Javadoc)
     * @see excel.report.datasource.IDataSource#moveToFirst()
     */
    public boolean moveToFirst(){
        if(null != recordList && recordList.size() > 0){
            index = 0;
            return true;
        }
        return false;
    }
    
    /*
     *  (non-Javadoc)
     * @see excel.report.datasource.IDataSource#next()
     */
    public Map next(){
        if(null == recordList) return null;
        
        if(index + 1 < recordList.size() && recordList.size() > 0){
            return (Map)recordList.get(++index);
        }else{
            //modified by ajun 2006-07-10 修改查询会漏掉一条记录的问题。
            index++;
            return null;
    	}
    }
    
    /*
     *  (non-Javadoc)
     * @see excel.report.datasource.IDataSource#hasNext()
     */
    public boolean hasNext() {
        if(null == recordList || index == -1){
            return false;
        }
        //modified by ajun 2006-07-10 修改查询会漏掉一条记录的问题。
        //这里不好改MoveToFirst()函数,因为系统要求默认就在第一条记录。
        //return ((index + 1) < data.size()) ? true : false;
        return ((index + 1) <= recordList.size()) ? true : false;
    }
    
    /*
     *  (non-Javadoc)
     * @see excel.report.datasource.IDataSource#undoNext()
     */
    public void undoNext(){
        if(index > 0){
            index--;
        }else{
            //throw new Exception(Out of rang of the datasoure);
        }
    }
    
    /*
     *  (non-Javadoc)
     * @see excel.report.datasource.IDataSource#getString(java.lang.String)
     */
    public String getString(String fieldName){
        if(null == recordList) return "";
        
        Object value = this.getValue(fieldName);
        if(null != value){

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -