/*
* Copyright (C) 2010---2014 星星(wuweixing)<349446658@qq.com>
*
* This file is part of Wabacus
*
* Wabacus is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.wabacus.system.dataset.select.common;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.wabacus.config.component.application.report.ColBean;
import com.wabacus.config.component.application.report.ReportBean;
import com.wabacus.config.typeprompt.TypePromptBean;
import com.wabacus.config.typeprompt.TypePromptColBean;
import com.wabacus.config.xml.XmlElementBean;
import com.wabacus.exception.WabacusRuntimeException;
import com.wabacus.system.ReportRequest;
import com.wabacus.system.inputbox.TextBox;
import com.wabacus.system.inputbox.autocomplete.AutoCompleteBean;
import com.wabacus.system.inputbox.option.SelectboxOptionBean;
import com.wabacus.util.Tools;
public class RelationalDBCommonDataSetValueProvider extends AbsCommonDataSetValueProvider
{
protected String value;
public String getValue()
{
return value;
}
public List<Map<String,String>> getLstSelectBoxOptions(ReportRequest rrequest,Map<String,String> mParentInputboxValues)
{
return null;
}
public List<Map<String,String>> getLstTypePromptOptions(ReportRequest rrequest,String txtValue)
{
return null;
}
public Map<String,String> getAutoCompleteColumnsData(ReportRequest rrequest,Map<String,String> params)
{
return null;
}
public List<Map<String,String>> getDynamicColGroupDataSet(ReportRequest rrequest)
{
return null;
}
protected Map<String,String> getMSelectBoxColKeyAndColumns()
{
Map<String,String> mColKeyAndColumn=new HashMap<String,String>();
mColKeyAndColumn.put("label",((SelectboxOptionBean)this.ownerOptionBean).getLabel());
mColKeyAndColumn.put("value",((SelectboxOptionBean)this.ownerOptionBean).getValue());
return mColKeyAndColumn;
}
protected Map<String,String> getMTypePromptColKeyAndColumns()
{
TypePromptBean typePromptBean=((TextBox)this.ownerOptionBean.getOwnerInputboxObj()).getTypePromptBean();
List<TypePromptColBean> lstPColsBean=typePromptBean.getLstPColBeans();
if(lstPColsBean==null||lstPColsBean.size()==0) return null;
Map<String,String> mColKeyAndColumn=new HashMap<String,String>();
for(TypePromptColBean tpcbean:lstPColsBean)
{
mColKeyAndColumn.put(tpcbean.getLabel(),tpcbean.getLabel());
if(tpcbean.getValue()!=null&&!tpcbean.getValue().trim().equals("")&&!tpcbean.getValue().equals(tpcbean.getLabel()))
{
mColKeyAndColumn.put(tpcbean.getValue(),tpcbean.getValue());
}
}
return mColKeyAndColumn;
}
protected List<Map<String,String>> parseOptionsDataSet(Object optionsDataSet,Map<String,String> mColKeyAndColumns,int maxrecordcount)
{
List<Map<String,String>> lstResults=new ArrayList<Map<String,String>>();
int cnt=0;
if(optionsDataSet instanceof List)
{
for(Object itemTmp:(List)optionsDataSet)
{
if(itemTmp==null) continue;
if(!(itemTmp instanceof Map))
{
throw new WabacusRuntimeException("加载报表"+getReportBean().getPath()+"选项数据的拦截器返回的List对象中元素类型不对,必须为Map类型");
}
lstResults.add((Map<String,String>)itemTmp);
if(maxrecordcount>0&&++cnt==maxrecordcount) break;
}
}else if(optionsDataSet instanceof ResultSet)
{
ResultSet rs=(ResultSet)optionsDataSet;
Map<String,String> mOptionTmp;
try
{
while(rs.next())
{
mOptionTmp=new HashMap<String,String>();
for(Entry<String,String> entryColTmp:mColKeyAndColumns.entrySet())
{
String valueTmp=rs.getString(entryColTmp.getValue());
valueTmp=valueTmp==null?"":valueTmp.trim();
mOptionTmp.put(entryColTmp.getKey(),valueTmp);
}
lstResults.add(mOptionTmp);
if(maxrecordcount>0&&++cnt==maxrecordcount) break;
}
}catch(SQLException e)
{
throw new WabacusRuntimeException("加载报表"+getReportBean().getPath()+"的选项数据失败",e);
}finally
{
try
{
rs.close();
}catch(SQLException e)
{
e.printStackTrace();
}
}
}else if(optionsDataSet!=null)
{
throw new WabacusRuntimeException("加载报表"+getReportBean().getPath()+"的选项数据失败,在加载选项数据的拦截器中返回的对象类型"+optionsDataSet.getClass().getName()
+"不合法");
}
return lstResults;
}
protected Map<String,String> parseAutoCompleteDataSet(Object autoCompleteDataSet)
{
Map<String,String> mResults;
if(autoCompleteDataSet instanceof Map)
{//拦截器直接返回结果集
mResults=(Map<String,String>)autoCompleteDataSet;
}else if(autoCompleteDataSet instanceof ResultSet)
{
mResults=new HashMap<String,String>();
ResultSet rs=(ResultSet)autoCompleteDataSet;
try
{
String colValTmp;
while(rs.next())
{
if(mResults.size()>0)
{
if(AutoCompleteBean.MULTIPLE_FIRST.equals(this.ownerAutoCompleteBean.getMultiple())) return mResults;
if(AutoCompleteBean.MULTIPLE_NONE.equals(this.ownerAutoCompleteBean.getMultiple())) return null;
}
for(ColBean cbTmp:this.ownerAutoCompleteBean.getLstAutoCompleteColBeans())
{
colValTmp=rs.getString(cbTmp.getColumn());
if(colValTmp==null) colValTmp="";
mResults.put(cbTmp.getProperty(),colValTmp);
}
}
}catch(SQLException e)
{
throw new WabacusRuntimeException("获取报表"+this.getReportBean().getPath()+"的自动填充数据失败",e);
}finally
{
try
{
if(rs!=null) rs.close();
}catch(SQLException e)
{
e.printStackTrace();
}
}
}else
{
throw new WabacusRuntimeException("加载报表"+getReportBean().getPath()+"的自动填充数据失败,在加载选项数据的拦截器中返回的对象类型"
+autoCompleteDataSet.getClass().getName()+"不合法");
}
return mResults;
}
protected List<Map<String,String>> parseDynamicColGroupDataSet(Object colGroupDataSet)
{
if(colGroupDataSet==null) return null;
List<Map<String,String>> lstResults=null;
ReportBean rbean=this.getReportBean();
if(colGroupDataSet instanceof List)
{
lstResults=(List)colGroupDataSet;
if(lstResults.size()==0) return null;
if(!(lstResults.get(0) instanceof Map))
{
throw new WabacusRuntimeException("从数据库获取报表:"+rbean.getPath()+"的动态标题列数据失败,拦截器加载数据前置动作返回的List中没有存放Map类型的对象");
}
}else if(colGroupDataSet instanceof ResultSet)
{
ResultSet rs=(ResultSet)colGroupDataSet;
try
{
lstResults=new ArrayList<Map<String,String>>();
Map<String,String> mRowDataTmp;
while(rs.next())
{
mRowDataTmp=new HashMap<String,String>();
this.ownerCrossReportColAndGroupBean.getRealLabelValueFromResultset(rs,mRowDataTmp);
lstResults.add(mRowDataTmp);
}
}catch(SQLException e)
{
throw new WabacusRuntimeException("从数据库获取报表:"+rbean.getPath()+"的动态标题列失败",e);
}finally
{
try
{
rs.close();
}catch(SQLException e)
{
e.printStackTrace();
}
}
}else if(colGroupDataSet!=null)
{
throw new WabacusRuntimeException("获取报表:"+rbean.getPath()+"的动态标题列失败,在查询交叉统计报表的标题时在拦截器中返回无效的数据类型");
}
return lstResults;
}
public void loadConfig(XmlElementBean eleDatasetAttributeOwnerBean)
{
super.loadConfig(eleDatasetAttributeOwnerBean);
String dataset=eleDatasetAttributeOwnerBean.attributeValue("dataset");//取到配置的dataset
String[] providerDataset=parseDatsetProvider(dataset);
if(providerDataset==null||providerDataset.length!=2||Tools.isEmpty(providerDataset[1])) return;
this.value=providerDataset[1];
}
}