/*
* 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.config.component.application.report;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.wabacus.config.component.application.report.condition.ConditionExpressionBean;
import com.wabacus.config.component.application.report.condition.ConditionSelectItemBean;
import com.wabacus.config.component.application.report.condition.ConditionSelectorBean;
import com.wabacus.config.component.application.report.condition.ConditionValueSelectItemBean;
import com.wabacus.exception.WabacusConfigLoadingException;
import com.wabacus.exception.WabacusRuntimeException;
import com.wabacus.system.ReportRequest;
import com.wabacus.system.assistant.ReportAssistant;
import com.wabacus.system.assistant.WabacusAssistant;
import com.wabacus.system.datatype.IDataType;
import com.wabacus.system.datatype.VarcharType;
import com.wabacus.system.inputbox.AbsInputBox;
import com.wabacus.system.inputbox.CustomizedBox;
import com.wabacus.system.inputbox.IInputBoxOwnerBean;
import com.wabacus.system.inputbox.validate.ServerValidateBean;
import com.wabacus.util.Consts;
import com.wabacus.util.Tools;
public class ConditionBean extends AbsConfigBean implements IInputBoxOwnerBean
{
private static Log log=LogFactory.getLog(ConditionBean.class);
public final static String SELECTTYPE_INNERLOGIC="innerlogic";
public final static String SELECTORTYPE_COLUMNS="columns";
public final static String SELECTORTYPE_VALUES="values";
public final static String LABELPOSITION_INNER="inner";
public final static String LABELPOSITION_LEFT="left";//查询条件label显示在输入框左侧
public final static String LABELPOSITION_RIGHT="right";
private IDataType datatypeObj;
private AbsInputBox inputbox;
private String name="";
private String label;
private Map<String,String> mDynLableParts;
private String labelposition=LABELPOSITION_INNER;//显示查询条件label的位置类型
private String defaultvalue=null;
private boolean keepkeywords;
private String logic=" and ";
private String tip="";
private boolean hidden;//是否在前台显示
private boolean constant;
private boolean br;
private int left=3;
private int right=0;//距离右边元素的位置
// private String relatetab="";//当在同一页面横向以tab形式显示多个报表时,如果某个条件输入框的值要在点击其它tab切换到其它报表时
private String splitlike="0";
private String source;
private ConditionExpressionBean conditionExpression;//此查询条件只有一个表达式,配置查询条件表达式
private int iterator;//当前查询条件重复显示的个数,只有有多个<value/>或<columns/>时才有意义。
private String innerlogic;//加载时暂存用户在<condition/>中配置的innerlogic属性,当不需提供逻辑关系的选择,且不需在前面显示逻辑关系的label时,可以直接在<condition/>的innerlogic属性中配置
private ConditionSelectorBean cinnerlogicbean;//存放逻辑关系选择信息,如果要提供多个逻辑关系进行选择,或者需要在输入框前面显示逻辑关系label,则可以通过配置<innerlogic/>子标签进行配置
private ConditionSelectorBean ccolumnsbean;
private ConditionSelectorBean cvaluesbean;
private List<String> lstChildDisplayOrder;//当前查询条件如果要显示这几个子元素时,它们的显示顺序,由它们配置在<condition/>中的次序决定
private List<String[]> lstBelongto;
private ServerValidateBean serverValidateBean;
private String onsetvalueMethod;
private String ongetvalueMethod;//获取此条件值时的客户端回调函数
public ConditionBean(AbsConfigBean parent)
{
super(parent);
}
public String getDefaultvalue()
{
return this.defaultvalue;
}
public void setDefaultvalue(String defaultvalue)
{
this.defaultvalue=defaultvalue;
}
public void setName(String name)
{
this.name=name;
}
public void setServerValidateBean(ServerValidateBean svbean)
{
this.serverValidateBean=svbean;
}
public void setLabel(String label)
{
Object[] objArr=WabacusAssistant.getInstance().parseStringWithDynPart(this.getPageBean(),label);
this.label=(String)objArr[0];
this.mDynLableParts=(Map<String,String>)objArr[1];
}
public String getLabel()
{
return this.label;
}
public Map<String, String> getMDynLableParts()
{
return this.mDynLableParts;
}
public String getLabel(ReportRequest rrequest)
{
return WabacusAssistant.getInstance().getStringValueWithDynPart(rrequest,this.label,this.mDynLableParts,"");
}
public String getTip()
{
return tip;
}
public void setTip(String tip)
{
this.tip=tip;
}
public String getName()
{
return this.name;
}
public String getLabelposition()
{
return labelposition;
}
public void setLabelposition(String labelposition)
{
this.labelposition=labelposition;
}
public String getLogic()
{
return this.logic;
}
public IDataType getDatatypeObj()
{
return datatypeObj;
}
public void setDatatypeObj(IDataType datatypeObj)
{
this.datatypeObj=datatypeObj;
}
public boolean isHidden()
{
return hidden;
}
public void setHidden(boolean hidden)
{
this.hidden=hidden;
}
public boolean isKeepkeywords()
{
return keepkeywords;
}
public void setKeepkeywords(boolean keepkeywords)
{
this.keepkeywords=keepkeywords;
}
public AbsInputBox getInputbox()
{
return inputbox;
}
public void setInputbox(AbsInputBox inputbox)
{
this.inputbox=inputbox;
}
public boolean isBr()
{
return br;
}
public void setBr(boolean br)
{
this.br=br;
}
public boolean isConstant()
{
return constant;
}
public void setConstant(boolean constant)
{
this.constant=constant;
}
public String getSplitlike()
{
return splitlike;
}
public void setSplitlike(String splitlike)
{
this.splitlike=splitlike;
}
public String getOnsetvalueMethod()
{
return onsetvalueMethod;
}
public void setOnsetvalueMethod(String onsetvalueMethod)
{
this.onsetvalueMethod=onsetvalueMethod;
}
public String getOngetvalueMethod()
{
return ongetvalueMethod;
}
public void setOngetvalueMethod(String ongetvalueMethod)
{
this.ongetvalueMethod=ongetvalueMethod;
}
public String getSource()
{
return source;
}
public void setSource(String source)
{
if(source!=null&&!source.trim().equals(""))
{
String reportpath="";
if(this.getReportBean()!=null) reportpath=this.getReportBean().getPath();
if(Tools.isDefineKey("request",source))
{
if(Tools.getRealKeyByDefine("request",source).trim().equals(""))
{
throw new WabacusConfigLoadingException("加载报表"+reportpath+"的name为"+this.name+"的条件失败,source配置值:"+source+"指定的从request取数据的key为空");
}
}else if(Tools.isDefineKey("session",source))
{
if(Tools.getRealKeyByDefine("session",source).trim().equals(""))
{
throw new WabacusConfigLoadingException("加载报表"+reportpath+"的name为"+this.name+"的条件失败,source配置值:"+source+"指定的从session取数据的key为空");
}
}else
{
throw new WabacusConfigLoadingException("加载报表"+reportpath+"的name为"+this.name+"的条件失败,source属性值"+source+"不是request{...}或session{...}格式");
}
this.source=source;
this.hidden=true;
this.constant=false;
}else
{
this.source=null;
}
}
public String getOwnerId()
{
return name;
}
public String getInputBoxId()
{
return this.getReportBean().getGuid()+"_wxcondition_"+name.trim();
}
public boolean isConditionWithInputbox()
{
if(this.isHidden()||this.isConstant()) return false;
if(Tools.isDefineKey("request",this.source)||Tools.isDefineKey("session",this.source)) return false;
return true;
}
public boolean isConditionValueFromUrl()
{
if(this.isConstant()) return false;
if(Tools.isDefineKey("request",this.source)||Tools.isDefineKey("session",this.source)) return false;
return true;
}
public boolean isConditionValueFromSession()
{
if(this.isConstant()) return false;
return Tools.isDefineKey("session",this.source);
}
public int getLeft()
{
return left;
}
public void setLeft(int left)
{
this.left=left;
}
public int getRight()
{
return right;
}
public void setRight(int right)
{
this.right=right;
}
public ConditionExpressionBean getConditionExpression()
{
return conditionExpression;
}
public void setConditionExpression(ConditionExpressionBean conditionExpression)
{
this.conditionExpression=conditionExpression;
}
public int getIterator()
{
return iterator;
}
public void setIterator(int iterator)
{
this.iterator=iterator;
}
public String getInnerlogic()
{
return innerlogic;
}
public void setInnerlogic(String innerlogic)
{
if(innerlogic==null||innerlogic.trim().equals(""))
{
this.innerlogic=null;
}else
{
if(!innerlogic.toLowerCase().trim().equals("and")&&!innerlogic.toLowerCase().trim().equals("or"))
{
throw new WabacusConfigLoadingException("加载报表"+this.getReportBean().getPath()+"的查询条件"+this.getName()+"失败,配置的innerlogic必须为and或or");
}
this.innerlogic=innerlogic.trim();
}
}
public ConditionSelectorBean getCinnerlogicbean()
{
return cinnerlogicbean;
}
public void setCinnerlogicbean(ConditionSelectorBean cinnerlogicbean)
{
this.cinnerlogicbean=cinnerlogicbean;
}
public ConditionSelectorBean getCcolumnsbean()
{
return ccolumnsbean;
}
public void setCcolumnsbean(ConditionSelectorBean ccolumnsbean)
{
this.ccolumnsbean=ccolumnsbean;
}
public ConditionSelectorBean getCvaluesbean()
{
return cvaluesbean;
}
public void setCvaluesbean(ConditionSelectorBean cvaluesbean)
{
this.cvaluesbean=cvaluesbean;
}
public List<String> getLstChildDisplayOrder()
{
return lstChildDisplayOrder;
}
public void setLstChildDisplayOrder(List<String> lstChildDisplayOrder)
{
this.lstChildDisplayOrder=lstChildDisplayOrder;
}
public void setBelongto(String belongto)
{
if(belongto!=null)
{
belongto=belongto.trim();
if(belongto.equals("")||belongto.equals("*.*"))
{
this.lstBelongto=null;
}else
{
this.lstBelongto=new ArrayList<String[]>();
List<String> lstTmp=Tools.parseStringToList(belongto,";",false);
String[] strArr;
for(String strTmp:lstTmp)
{
if(strTmp.trim().equals("")) continue;
int idx=strTmp.indexOf(".");
if(idx<=0)
{
throw new WabacusConfigLoadingException("加载报表"+this.getReportBean().getPath()+"的name为"+this.name
+"的查询条件失败,其配置的belongto没有用.符号分隔所属<dataset/>和<value/>的ID");
}
strArr=new String[] { strTmp.substring(0,idx).trim(), strTmp.substring(idx+1).trim() };
if(strArr[0].equals("*")) strArr[0]=null;
if(strArr[1].equals("*")) strArr[1]=null;
this.lstBelongto.add(strArr);
}
}
}
}
public boolean isBelongTo(ReportDataSetValueBean svbean)
{
if(this.lstBelongto==null||this.lstBelongto.size()==0) return true;
String datasetid=((ReportDataSetBean)svbean.getParent()).getId();
for(String[] belongtoArrTmp:this.lstBelongto)
{
if((belongtoArrTmp[0]==null||datasetid.equals(belongtoArrTmp[0]))&&(belongtoArrTmp[1]==null||svbean.getId().equals(belongtoArrTmp[1])))
return true;
}
return false;
}
public boolean isExistConditionExpression(boolean inherit)
{
if(this.conditionExpression!=null&&this.conditionExpression.getValue()!=null&&!this.conditionExpression.getValue().trim().equals(""))
return true;
if(!inherit) return false;
if(this.cvaluesbean==null||this.cvaluesbean.isEmpty()) return false;
ConditionValueSelectItemBean cvbTmp=(ConditionValueSelectItemBean)this.cvaluesbean.getLstSelectItemBeans().get(0);
if(cvbTmp.getConditionExpression()!=null&&cvbTmp.getConditionExpression().getValue()!=null
&&!cvbTmp.getConditionExpression().getValue().trim().equals(""))
{
return true;
}
if(cvbTmp.getLstColumnsBean()==null||cvbTmp.getLstColumnsBean().size()==0) return false;
ConditionSelectItemBean ccbeanTmp=cvbTmp.getLstColumnsBean().get(0);
if(ccbeanTmp.getConditionExpression()!=null&&ccbeanTmp.getConditionExpression().getValue()!=null
&&!ccbeanTmp.getConditionExpression().getValue().trim().equals(""))
{
return true;
}
return false;
}
public void initConditionValueByInitUrlMethod(ReportRequest rrequest)
{
if(!this.isConditionValueFromUrl()) return;
if(this.conditionExpression!=null)
{
rrequest.addParamToUrl(name,"rrequest{"+name+"}",false);
}else
{
String colselectedInputboxidTmp;
String valueselectedInputboxidTmp;
String innerlogicSelectedInputboxidTmp;
if(this.iterator>1)
{//此查询条件要显示多套条件框
for(int i=0;i<iterator;i++)
{
if(this.ccolumnsbean!=null&&!this.ccolumnsbean.isEmpty())
{
colselectedInputboxidTmp=this.ccolumnsbean.getSelectedInputboxId(i);
rrequest.addParamToUrl(colselectedInputboxidTmp,"rrequest{"+colselectedInputboxidTmp+"}",true);
}
if(this.cinnerlogicbean!=null&&!this.cinnerlogicbean.isEmpty()&&this.cinnerlogicbean.getLstSelectItemBeans().size()>1)
{//如果配置了<innerlogic/>且配置了多个<logic/>子标签
innerlogicSelectedInputboxidTmp=this.cinnerlogicbean.getSelectedInputboxId(i);
rrequest.addParamToUrl(innerlogicSelectedInputboxidTmp,"rrequest{"+innerlogicSelectedInputboxidTmp+"}",true);
}
valueselectedInputboxidTmp=this.cvaluesbean.getSelectedInputboxId(i);
rrequest.addParamToUrl(valueselectedInputboxidTmp,"rrequest{"+valueselectedInputboxidTmp+"}",true);
rrequest.addParamToUrl(name+"_"+i,"rrequest{"+name+"_"+i+"}",false);
}
}else
{
if(this.ccolumnsbean!=null&&!this.ccolumnsbean.isEmpty())
{
colselectedInputboxidTmp=this.ccolumnsbean.getSelectedInputboxId(-1);
rrequest.addParamToUrl(colselectedInputboxidTmp,"rrequest{"+colselectedInputboxidTmp+"}",true);
}
if(this.cvaluesbean!=null&&!this.cvaluesbean.isEmpty())
{
valueselectedInputboxidTmp=this.cvaluesbean.getSelectedInputboxId(-1);
rrequest.addParamToUrl(valueselectedInputboxidTmp,"rrequest{"+valueselectedInputboxidTmp+"}",true);
}
rrequest.addParamToUrl(name,"rrequest{"+name+"}",false);
}
}
}
public void initConditionValueByInitMethod(ReportRequest rrequest,Map<String,String> mConditionValues)
{
if(!this.isConditionValueFromUrl())
{
mConditionValues.put(this.name,getConditionValue(rrequest,-1));
}else if(this.conditionExpression!=null||this.iterator<=1)
{
mConditionValues.put(this.name,getConditionValue(rrequest,name));
}else
{
for(int i=0;i<iterator;i++)
{
mConditionValues.put(name+"_"+i,getConditionValue(rrequest,name+"_"+i));
}
}
}
private String getConditionValue(ReportRequest rrequest,String conditionname)
{
String conditionvalue=rrequest.getStringAttribute(conditionname,"");
if((LABELPOSITION_INNER.equals(this.labelposition)&&conditionvalue.equals(this.getLabel(rrequest)))
||conditionvalue.equals("(ALL_DATA)"))
{
conditionvalue="";
}
if(conditionvalue.equals("")&&this.defaultvalue!=null)
{//没有条件值,则取默认值,如果配置了的话
conditionvalue=ReportAssistant.getInstance().getColAndConditionDefaultValue(rrequest,this.defaultvalue);
}
rrequest.getAttributes().put(conditionname,conditionvalue);
rrequest.addParamToUrl(conditionname,conditionvalue,true);
return conditionvalue;
}
public void validateConditionValue(ReportRequest rrequest,Map<String,String> mConditionValues)
{
if(this.serverValidateBean==null) return;
if(!this.isConditionValueFromUrl()||this.conditionExpression!=null||this.iterator<=1)
{
this.serverValidateBean.validate(rrequest,mConditionValues.get(this.name),mConditionValues,new ArrayList<String>(),null);
}else
{//此查询条件要显示多套条件框
for(int i=0;i<iterator;i++)
{
this.serverValidateBean.validate(rrequest,mConditionValues.get(this.name+"_"+i),mConditionValues,new ArrayList<String>(),null);
}
}
}
public String getConditionValueForSP(ReportRequest rrequest)
{
if(this.isConstant()) return conditionExpression.getValue();
StringBuffer conditionValueBuf=new StringBuffer();
if(this.iterator<2)
{
conditionValueBuf.append(getRuntimeConditionExpressionForSP(rrequest,-1));
String conditionvalue=getDynamicConditionvalueForSql(rrequest,-1);
if(conditionValueBuf.length()>0)
{
conditionValueBuf.append("value=").append(conditionvalue);
}else
{
conditionValueBuf.append(conditionvalue);
}
}else
{
String conditionvalueTmp;
for(int i=0;i<this.iterator;i++)
{
conditionvalueTmp=getDynamicConditionvalueForSql(rrequest,i);
if(conditionvalueTmp.equals("")) continue;
conditionValueBuf.append(getRuntimeConditionExpressionForSP(rrequest,i));
String innerlogicTmp=getInnerLogicValue(rrequest,i);
conditionValueBuf.append("innerlogic["+i+"]="+innerlogicTmp).append(";");
conditionValueBuf.append("value["+i+"]="+conditionvalueTmp).append(";");
}
}
return conditionValueBuf.toString();
}
private String getRuntimeConditionExpressionForSP(ReportRequest rrequest,int index)
{
StringBuffer conditionValueBuf=new StringBuffer();
if(this.cvaluesbean!=null)
{
String valueid=rrequest.getStringAttribute(this.cvaluesbean.getSelectedInputboxId(index),"");//选中的表达式ID
ConditionSelectItemBean cvbean=this.cvaluesbean.getSelectItemBeanById(valueid);
if(cvbean==null)
{
if(valueid.equals(""))
{
throw new WabacusRuntimeException("没有为报表"+this.getReportBean().getPath()+"的查询条件"+name+"配置<value/>子标签");
}else
{
throw new WabacusRuntimeException("没有为报表"+this.getReportBean().getPath()+"的查询条件"+name+"配置id为"+valueid+"的<value/>子标签");
}
}
conditionValueBuf.append("expressionid");
if(index>=0) conditionValueBuf.append("["+index+"]");
conditionValueBuf.append("=").append(cvbean.getId()).append(";");
}
if(this.ccolumnsbean!=null)
{
String columnid=rrequest.getStringAttribute(this.ccolumnsbean.getSelectedInputboxId(index),"");
ConditionSelectItemBean ccbean=this.ccolumnsbean.getSelectItemBeanById(columnid);
if(ccbean==null)
{
if(columnid.equals(""))
{
throw new WabacusRuntimeException("没有为报表"+this.getReportBean().getPath()+"的查询条件"+name+"配置<column/>子标签");
}else
{
throw new WabacusRuntimeException("没有为报表"+this.getReportBean().getPath()+"的查询条件"+name+"配置id为"+columnid+"的<column/>子标签");
}
}
conditionValueBuf.append("columnid");
if(index>=0) conditionValueBuf.append("["+index+"]");
conditionValueBuf.append("=").append(ccbean.getId()).append(";");
}
return conditionValueBuf.toString();
}
public String getConditionExpressionAndParams(ReportRequest rrequest,List<String> lstConditions,List<IDataType> lstConditionsTypes)
{
if(!this.isExistConditionExpression(true)) return null;//如果当前查询条件没有在<condition/>中的任意层级子标签中配置条件表达式,则说明它可能是直接通过#name#的形式在sql语句中指定条件,所以不在这里为它构造条件表达式
if(this.isConstant()) return conditionExpression.getValue();
if(this.iterator<2)
{
String conditionvalue=getDynamicConditionvalueForSql(rrequest,-1);
if(conditionvalue.equals("")) return "";
ConditionExpressionBean cexpressionbean=getConditionRuntimeExpressionBean(rrequest,-1);
return cexpressionbean.getRuntimeConditionExpressionValue(this,conditionvalue,lstConditions,lstConditionsTypes);
}else
{
String conditionvalueTmp;
StringBuffer andExpressionBuf=new StringBuffer();
StringBuffer orExpressionBuf=new StringBuffer();//所有or逻辑关系的条件表达式
List<String> lstAndConditions=null;
List<IDataType> lstAndConditionsType=null;new ArrayList<IDataType>();
List<String> lstOrConditions=null;new ArrayList<String>();
List<IDataType> lstOrConditionsType=null;
if(lstConditions!=null&&lstConditionsTypes!=null)
{
lstAndConditions=new ArrayList<String>();
lstAndConditionsType=new ArrayList<IDataType>();
lstOrConditions=new ArrayList<String>();
lstOrConditionsType=new ArrayList<IDataType>();
}
for(int i=0;i<this.iterator;i++)
{
conditionvalueTmp=getDynamicConditionvalueForSql(rrequest,i);
if(conditionvalueTmp.equals("")) continue;
String innerlogicTmp=getInnerLogicValue(rrequest,i);
ConditionExpressionBean cexpressionbean=getConditionRuntimeExpressionBean(rrequest,i);
if(!innerlogicTmp.equalsIgnoreCase("or"))
{
andExpressionBuf.append(cexpressionbean.getRuntimeConditionExpressionValue(this,conditionvalueTmp,lstAndConditions,
lstAndConditionsType));
andExpressionBuf.append(" and ");
}else
{
orExpressionBuf.append(cexpressionbean.getRuntimeConditionExpressionValue(this,conditionvalueTmp,lstOrConditions,
lstOrConditionsType));
orExpressionBuf.append(" or ");
}
}
if(andExpressionBuf.toString().endsWith(" and "))
{
andExpressionBuf.delete(andExpressionBuf.length()-" and ".length(),andExpressionBuf.length());
}
if(orExpressionBuf.toString().endsWith(" or "))
{
orExpressionBuf.delete(orExpressionBuf.length()-" or ".length(),orExpressionBuf.length());
}
if(andExpressionBuf.length()==0&&orExpressionBuf.length()==0) return "";
if(lstConditions!=null&&lstConditionsTypes!=null)
{
//先and
if(lstAndConditions.size()>0) lstConditions.addAll(lstAndConditions);
if(lstAndConditionsType.size()>0) lstConditionsTypes.addAll(lstAndConditionsType);
if(lstOrConditions.size()>0) lstConditions.addAll(lstOrConditions);
if(lstOrConditionsType.size()>0) lstConditionsTypes.addAll(lstOrConditionsType);
}
String conditionexpression="";
if(!andExpressionBuf.toString().trim().equals(""))
{
conditionexpression="("+andExpressionBuf.toString()+")";
}
if(!orExpressionBuf.toString().trim().equals(""))
{
if(conditionexpression.equals(""))
{
conditionexpression="("+orExpressionBuf.toString()+")";
}else
{
conditionexpression=conditionexpression+" or ("+orExpressionBuf.toString()+")";
}
}
if(!conditionexpression.trim().equals("")) conditionexpression="("+conditionexpression+")";
return conditionexpression;
}
}
private String getInnerLogicValue(ReportRequest rrequest,int iteratorindex)
{
if((this.innerlogic==null||this.innerlogic.trim().equals(""))&&(this.cinnerlogicbean==null||this.cinnerlogicbean.isEmpty())) return "and";
if(this.innerlogic!=null&&!this.innerlogic.trim().equals("")) return this.innerlogic;//配置了<condition/>的innerlogic属性
if(this.cinnerlogicbean.getLstSelectItemBeans().size()==1) return this.cinnerlogicbean.getLstSelectItemBeans().get(0).getId();//在<innerlogic/>中只配置了一个<logic/>
String innerlogicTmp=rrequest.getStringAttribute(this.cinnerlogicbean.getSelectedInputboxId(iteratorindex),"");
if(innerlogicTmp.equals("")) return this.cinnerlogicbean.getLstSelectItemBeans().get(0).getId();//如果用户还没有选择逻辑关系,则用配置的第一个
return innerlogicTmp;
}
public String getDynamicConditionvalueForSql(ReportRequest rrequest,int iteratorindex)
{
String conditionvalue=getConditionValue(rrequest,iteratorindex);
if(conditionvalue==null||conditionvalue.trim().equals("")) return "";
if((this.datatypeObj instanceof VarcharType)&&!this.splitlike.equals("0"))
{
conditionvalue=ReportAssistant.getInstance().formatCondition(conditionvalue.trim(),this.splitlike);
}
return conditionvalue;
}
public String getConditionValue(ReportRequest rrequest,int iteratorindex)
{
if(this.isConstant())
{
if(this.getConditionExpression()==null) return "";
return this.getConditionExpression().getValue();
}
String conditionvalue;
if(Tools.isDefineKey("request",this.source)||Tools.isDefineKey("session",this.source))
{
conditionvalue=WabacusAssistant.getInstance().getRequestContextStringValue(rrequest,this.source,"");
if(conditionvalue.equals("")&&this.defaultvalue!=null)
{
conditionvalue=ReportAssistant.getInstance().getColAndConditionDefaultValue(rrequest,this.defaultvalue);
}
}else
{
if(this.isHidden())
{
conditionvalue=rrequest.getStringAttribute(name,"");
}else
{//这里不用考虑defaultvalue,在初始化时即处理好了
String conditionname=name;
if(iteratorindex>=0) conditionname=conditionname+"_"+iteratorindex;
conditionvalue=rrequest.getStringAttribute(conditionname,"");
}
}
return conditionvalue;
}
private ConditionExpressionBean getConditionRuntimeExpressionBean(ReportRequest rrequest,int index)
{
if(this.conditionExpression!=null) return conditionExpression;
String valueid=rrequest.getStringAttribute(this.cvaluesbean.getSelectedInputboxId(index),"");
ConditionSelectItemBean cvbean=this.cvaluesbean.getSelectItemBeanById(valueid);
if(cvbean==null)
{
if(valueid.equals(""))
{
throw new WabacusRuntimeException("没有为报表"+this.getReportBean().getPath()+"的查询条件"+name+"配置<value/>子标签");
}else
{
throw new WabacusRuntimeException("没有为报表"+this.getReportBean().getPath()+"的查询条件"+name+"配置id为"+valueid+"的<value/>子标签");
}
}
if(cvbean.getConditionExpression()!=null) return cvbean.getConditionExpression();//在<value/>中配置的是条件表达式
//在<value/>中配置的是<column/>
String columnid=rrequest.getStringAttribute(this.ccolumnsbean.getSelectedInputboxId(index),"");
ConditionSelectItemBean ccbean=((ConditionValueSelectItemBean)cvbean).getColumnBeanById(columnid);
if(ccbean==null)
{
if(columnid.equals(""))
{
throw new WabacusRuntimeException("没有为报表"+this.getReportBean().getPath()+"的查询条件"+name+"配置<column/>子标签");
}else
{
throw new WabacusRuntimeException("没有为报表"+this.getReportBean().getPath()+"的查询条件"+name+"配置id为"+columnid+"的<column/>子标签");
}
}
return ccbean.getConditionExpression();
}
public String getDisplayString(ReportRequest rrequest,String dynstyleproperty,int iteratorindex)
{
if(!this.isConditionWithInputbox()) return "";
ReportBean rbean=this.getReportBean();
if(!rrequest.checkPermission(rbean.getId(),Consts.SEARCH_PART,name,Consts.PERMISSION_TYPE_DISPLAY)) return "";
if(this.iterator<=1&&iteratorindex>=0)
{
throw new WabacusRuntimeException("报表"+rbean.getPath()+"的查询条件"+this.name+"的iterator属性为"+this.iterator
+",显示时不能指定iteratorindex为大于等于0的数,即只能为它显示一套输入框");
}else if(this.iterator>1&&(iteratorindex<0||iteratorindex>this.iterator))
{
throw new WabacusRuntimeException("报表"+rbean.getPath()+"的查询条件"+this.name+"的iterator属性为"+this.iterator
+",即显示多套输入框,因此必须指定当前显示的下标iteratorindex,且不能超过iterator配置值:"+this.iterator);
}
StringBuilder resultBuf=new StringBuilder();
resultBuf.append("<font id=\"font_").append(rbean.getGuid()+"_conditions\"");
resultBuf.append(" name=\"font_").append(rbean.getGuid()+"_conditions\"");
resultBuf.append(" value_name=\"").append(this.name).append("\"");
resultBuf.append(" inputboxid=\""+this.getInputBoxId()+"\"");//后面根据此ID取相应的<span/>,如果取到了就是可编辑列,没有取到就是不可编辑列
resultBuf.append(" value=\""+Tools.htmlEncode(getConditionValue(rrequest,iteratorindex))+"\"");
if(!(this.inputbox instanceof CustomizedBox))
{
if(this.cinnerlogicbean!=null&&!this.cinnerlogicbean.isEmpty()&&this.cinnerlogicbean.getLstSelectItemBeans().size()>1)
{
resultBuf.append(" innerlogicid=\"").append(this.cinnerlogicbean.getSelectedInputboxId(iteratorindex)).append("\"");
resultBuf.append(" innerlogicinputboxtype=\"").append(cinnerlogicbean.getInputbox()==null?"":cinnerlogicbean.getInputbox()).append("\"");//逻辑关系选择框类型
}
if(iteratorindex>=0)
{
resultBuf.append(" iteratorindex=\"").append(iteratorindex).append("\"");
}
if(this.ccolumnsbean!=null&&!this.ccolumnsbean.isEmpty()&&this.ccolumnsbean.getLstSelectItemBeans().size()>1)
{
resultBuf.append(" columnid=\"").append(this.ccolumnsbean.getSelectedInputboxId(iteratorindex)).append("\"");
resultBuf.append(" columninputboxtype=\"").append(ccolumnsbean.getInputbox()==null?"":ccolumnsbean.getInputbox()).append("\"");
}
if(this.cvaluesbean!=null&&!this.cvaluesbean.isEmpty()&&this.cvaluesbean.getLstSelectItemBeans().size()>1)
{//有多个条件表达式
resultBuf.append(" valueid=\"").append(this.cvaluesbean.getSelectedInputboxId(iteratorindex)).append("\"");
resultBuf.append(" valueinputboxtype=\"").append(cvaluesbean.getInputbox()==null?"":cvaluesbean.getInputbox()).append("\"");
}
resultBuf.append(">");
resultBuf.append(showConditionAllTypeBoxes(rrequest,dynstyleproperty,iteratorindex));
resultBuf.append("</font>");
}else
{
if(this.iterator>1)
{
throw new WabacusRuntimeException("显示报表"+this.getReportBean().getPath()+"的查询条件"+this.name+"失败,此查询条件的iterator大于1,不能为它提供条件输入框");
}
resultBuf.append(">");
}
return resultBuf.toString();
}
private String showConditionAllTypeBoxes(ReportRequest rrequest,String dynstyleproperty,int iteratorindex)
{
StringBuilder resultBuf=new StringBuilder();
boolean isReadonlyPermission=rrequest.checkPermission(this.getReportBean().getId(),Consts.SEARCH_PART,this.name,Consts.PERMISSION_TYPE_READONLY);
for(String childtype:this.lstChildDisplayOrder)
{//按照配置顺序依次显示本查询条件的各类型输入框
if(childtype.equals("values")&&this.cvaluesbean!=null)
{
resultBuf.append(this.cvaluesbean.showSelectedInputbox(rrequest,isReadonlyPermission,iteratorindex));
}else if(childtype.equals("columns")&&this.ccolumnsbean!=null)
{
resultBuf.append(this.ccolumnsbean.showSelectedInputbox(rrequest,isReadonlyPermission,iteratorindex));
}else if(childtype.equals("inputbox"))
{
resultBuf.append(showConditionInputbox(rrequest,isReadonlyPermission,dynstyleproperty,iteratorindex));
}else if(childtype.equals("innerlogic")&&this.cinnerlogicbean!=null&&!this.cinnerlogicbean.isEmpty())
{//只有由框架显示输入框,才有可能配置iterator>1,才会用到<innerlogic/>,所以这个时候才需显示这种输入框
if(this.cinnerlogicbean.getLstSelectItemBeans().size()==1)
{//如果通过<innerlogic/>只配置了一个<logic/>,则只显示它的label
String reallabel=cinnerlogicbean.getLstSelectItemBeans().get(0).getLabel();
if(reallabel!=null&&!reallabel.trim().equals(""))
{//显示标题
resultBuf.append(WabacusAssistant.getInstance().getSpacingDisplayString(cinnerlogicbean.getLeft()));
reallabel=rrequest.getI18NStringValue(reallabel);
resultBuf.append(reallabel);
resultBuf.append(WabacusAssistant.getInstance().getSpacingDisplayString(cinnerlogicbean.getRight()));
}
}else
{
resultBuf.append(this.cinnerlogicbean.showSelectedInputbox(rrequest,isReadonlyPermission,iteratorindex));
}
}
}
return resultBuf.toString();
}
private String showConditionInputbox(ReportRequest rrequest,boolean isReadonlyPermission,String dynstyleproperty,int iteratorindex)
{
StringBuilder resultBuf=new StringBuilder();
String reallabel=getLabel(rrequest);
String conditionname=this.name;
if(iteratorindex>=0)
{
conditionname=conditionname+"_"+iteratorindex;
}
String conditionvalue=rrequest.getStringAttribute(conditionname,"");
conditionvalue=conditionvalue==null?"":conditionvalue.trim();
if(reallabel!=null&&!reallabel.trim().equals(""))
{
if(LABELPOSITION_LEFT.equals(this.labelposition))
{//如果是标题显示在输入框左侧
resultBuf.append("<span class=\"cls-search-label\">"+reallabel+"</span> ");
}else if(LABELPOSITION_INNER.equals(this.labelposition)&&conditionvalue.equals(""))
{
conditionvalue=reallabel;
}
}
if(iteratorindex>=0) rrequest.getAttributes().put("DYN_INPUTBOX_ID",this.getInputBoxId()+"__"+iteratorindex);
resultBuf.append(this.inputbox.getDisplayStringValue(rrequest,conditionvalue,dynstyleproperty,isReadonlyPermission));
if(reallabel!=null&&!reallabel.trim().equals("")&&this.LABELPOSITION_RIGHT.equals(this.labelposition))
{
resultBuf.append("<span class=\"cls-search-label\">"+reallabel+"</span> ");
}
if(iteratorindex>=0) rrequest.getAttributes().remove("DYN_INPUTBOX_ID");
return resultBuf.toString();
}
public void doPostLoad()
{
SqlBean sbean=(SqlBean)this.getParent();
validateConfig(sbean);
processInnerlogic();
if(sbean.isSelectPreparedStatement()) processConditionExpression();
// {
// {//只要有一个数据集采用preparedstatement方式执行,则解析此条件的参数化形式(在运行时是采用参数化形式还是普通形式由使用它的数据集决定)
// break;
if(this.isConditionWithInputbox()&&this.iterator>1)
{
if(this.conditionExpression!=null)
{
throw new WabacusConfigLoadingException("加载报表"+this.getReportBean().getPath()+"的name属性为"+this.name
+"的查询条件失败,只为它配置了一个条件表达式,不能将iterator属性配置为大于1的数");
}
}
this.ongetvalueMethod=parseOnGetSetValueMethod(this.ongetvalueMethod);
this.onsetvalueMethod=parseOnGetSetValueMethod(this.onsetvalueMethod);
// if(this.lstBelongto!=null&&this.lstBelongto.size()>0)
// if(sbean.getDatasetBeanById(belongtoIdTmp.trim())==null)
// +"的查询条件配置的belongto错误,没有找到其所属的<value/>的id:"+belongtoIdTmp);
// }
if(this.inputbox!=null) this.inputbox.doPostLoad();
}
private String parseOnGetSetValueMethod(String method)
{
if(Tools.isEmpty(method)) return null;
List<String> lstMethods=Tools.parseStringToList(method,";",false);
StringBuilder bufTmp=new StringBuilder();
for(String methodTmp:lstMethods)
{
bufTmp.append("{method:"+methodTmp+"},");
}
method=bufTmp.toString();
if(method.endsWith(",")) method=method.substring(0,method.length()-1);
if(!method.trim().equals("")) method="["+method+"]";
return method;
}
private void processConditionExpression()
{
if(this.conditionExpression==null&&this.cvaluesbean==null) return;
if(this.conditionExpression!=null&&this.conditionExpression.getValue()!=null&&!this.conditionExpression.getValue().trim().equals(""))
{//直接在<conditon/>的<value/>子标签中配置了一个条件表达式
conditionExpression.parseConditionExpression();
}else
{
conditionExpression=null;
List<ConditionSelectItemBean> lstValueBeans=cvaluesbean.getLstSelectItemBeans();
for(ConditionSelectItemBean cvbTmp:lstValueBeans)
{
if(cvbTmp.getConditionExpression()!=null&&cvbTmp.getConditionExpression().getValue()!=null
&&!cvbTmp.getConditionExpression().getValue().trim().equals(""))
{//在<values/>的<value/>中配置了条件表达式
cvbTmp.getConditionExpression().parseConditionExpression();
}else
{//在<values/>的<value/>的<column/>中配置了条件表达式
cvbTmp.setConditionExpression(null);
List<ConditionSelectItemBean> lstCcbeans=((ConditionValueSelectItemBean)cvbTmp).getLstColumnsBean();
for(ConditionSelectItemBean ccbeanTmp:lstCcbeans)
{
if(ccbeanTmp.getConditionExpression()==null||ccbeanTmp.getConditionExpression().getValue()==null
||ccbeanTmp.getConditionExpression().getValue().trim().equals(""))
{
throw new WabacusConfigLoadingException("加载报表"+this.getReportBean().getPath()+"的name属性为"+this.name
+"的查询条件失败,没有为它配置条件表达式");
}
ccbeanTmp.getConditionExpression().parseConditionExpression();
}
}
}
}
}
private void validateConfig(SqlBean sbean)
{
if(this.ccolumnsbean!=null&&this.ccolumnsbean.isEmpty()) this.ccolumnsbean=null;
if(this.cvaluesbean!=null&&this.cvaluesbean.isEmpty()) this.cvaluesbean=null;
if(!isConditionWithInputbox())
{
if(this.ccolumnsbean!=null||this.cvaluesbean!=null)
{
throw new WabacusConfigLoadingException("加载报表"+this.getReportBean().getPath()+"的name属性为"+this.name
+"的查询条件失败,此查询条件是隐藏查询条件,不能为其配置<values/>和<columns/>");
}
if(this.iterator>1)
{
throw new WabacusConfigLoadingException("加载报表"+this.getReportBean().getPath()+"的name属性为"+this.name
+"的查询条件失败,此查询条件是隐藏查询条件,不能将<condition/>的iterator配置为大于1");
}
if(this.innerlogic!=null&&!this.innerlogic.trim().equals("")||this.cinnerlogicbean!=null&&!this.cinnerlogicbean.isEmpty())
{
log.warn("报表"+this.getReportBean().getPath()+"的name属性为"+this.name+"的查询条件不显示输入框,因此对它配置innerlogic属性或<innerlogic/>子标签没有任何意义");
this.innerlogic=null;
this.cinnerlogicbean=null;
}
}else
{
/*if(!sbean.isStoreProcedure())
{
if(this.ccolumnsbean!=null&&this.cvaluesbean==null)
{//配置了<columns/>,但没有为它们在<value/>中配置条件表达式
throw new WabacusConfigLoadingException("加载报表"+this.getReportBean().getPath()+"的name为"+this.name
+"的查询条件失败,没有为<columns/>中配置的<column/>在<value/>标签中配置条件表达式");
}
if(this.iterator>1&&this.cvaluesbean==null)
{
throw new WabacusConfigLoadingException("加载报表"+this.getReportBean().getPath()+"的name为"+this.name
+"的查询条件失败,此查询条件没有提供比较列选择功能和条件表达式选择功能,不能将其iterator属性配置为大于1的数");
}
}*/
if(cvaluesbean!=null)
{
List<ConditionSelectItemBean> lstValueBeans=cvaluesbean.getLstSelectItemBeans();
if(lstValueBeans.size()==1&&lstValueBeans.get(0).getConditionExpression()!=null)
{//当前<values/>下只有一个<value/>,此<value/>只有一个条件表达式,则相当于直接在<condition/>下配置<value/>
this.cvaluesbean=null;
this.conditionExpression=lstValueBeans.get(0).getConditionExpression();
/*if(this.ccolumnsbean!=null&&!sbean.isStoreProcedure())
{
throw new WabacusConfigLoadingException("加载报表"+this.getReportBean().getPath()+"的name为"+this.name
+"的查询条件失败,没有为<columns/>中配置的<column/>在<value/>标签中配置条件表达式");
}*/
return;
}
/*int valuecolumncnt=-1;
ConditionValueSelectItemBean cvsibeanTmp;
for(ConditionSelectItemBean csibeanTmp:lstValueBeans)
{//依次处理每个<value/>
cvsibeanTmp=(ConditionValueSelectItemBean)csibeanTmp;
if(cvsibeanTmp.getConditionExpression()!=null&&cvsibeanTmp.getLstColumnsBean()!=null&&cvsibeanTmp.getLstColumnsBean().size()>0)
{
throw new WabacusConfigLoadingException("加载报表"+this.getReportBean().getPath()+"的name为"+this.name
+"的查询条件失败,不能在其<values/>的<value/>子标签中即配置<column/>又配置条件表达式");
}
if(cvsibeanTmp.getConditionExpression()!=null||sbean.isStoreProcedure())
{//此<value/>是直接配置的条件表达式,或者是存储过程查询报表数据
if(valuecolumncnt>0)
{//已经有其它<value/>配置了<column/>
if(sbean.isStoreProcedure())
{
throw new WabacusConfigLoadingException("加载报表"+this.getReportBean().getPath()+"的name为"+this.name
+"的查询条件失败,此报表是使用存储过程查询报表数据,因此不能在<value/>中配置<conlumn/>子标签");
}else
{
throw new WabacusConfigLoadingException("加载报表"+this.getReportBean().getPath()+"的name为"+this.name
+"的查询条件失败,其<values/>的<value/>子标签有的直接配置条件表达式,有的配置<conlumn/>子标签");
}
}
valuecolumncnt=0;
}else
{
if(valuecolumncnt==0)
{
throw new WabacusConfigLoadingException("加载报表"+this.getReportBean().getPath()+"的name为"+this.name
+"的查询条件失败,其<values/>的<value/>子标签有的直接配置条件表达式,有的配置<conlumn/>子标签");
}else if(valuecolumncnt>0&&valuecolumncnt!=cvsibeanTmp.getLstColumnsBean().size())
{
throw new WabacusConfigLoadingException("加载报表"+this.getReportBean().getPath()+"的name为"+this.name
+"的查询条件失败,其<values/>的<value/>子标签之间配置的<conlumn/>子标签个数不一致");
}
valuecolumncnt=cvsibeanTmp.getLstColumnsBean().size();
if(valuecolumncnt<2)
{
throw new WabacusConfigLoadingException("加载报表"+this.getReportBean().getPath()+"的name为"+this.name
+"的查询条件失败,不能在<value/>中只配置一个<column/>,如果不提供比较列的选择功能,请直接在<value/>中配置条件表达式");
}
for(ConditionSelectItemBean ccbeanTmp:cvsibeanTmp.getLstColumnsBean())
{
if(this.ccolumnsbean==null||this.ccolumnsbean.getSelectItemBeanById(ccbeanTmp.getId())==null)
{//在配置的<columns/>中没有取到对应id的<column/>
throw new WabacusConfigLoadingException("加载报表"+this.getReportBean().getPath()
+"的<condition/>下<values/>的子标签<value/>失败,其下的<column/>子标签配置的refid:"+ccbeanTmp.getId()+"在<columns/>中不存在");
}
}
}
}
if(!sbean.isStoreProcedure())
{
if(valuecolumncnt>0&&(this.ccolumnsbean==null||this.ccolumnsbean.getLstSelectItemBeans().size()!=valuecolumncnt))
{
throw new WabacusConfigLoadingException("加载报表"+this.getReportBean().getPath()+"的name为"+this.name
+"的查询条件失败,其<values/>的<value/>子标签配置的<conlumn/>子标签个数与<columns/>配置的<column/>子标签个数不一致");
}else if(valuecolumncnt==0&&this.ccolumnsbean!=null)
{//所有<value/>配置的都是条件表达式,没有配置<column/>,则配置了<columns/>也无效,所以置空
log.warn("报表"+this.getReportBean().getPath()+"的查询条件<condition/>配置的<columns/>子标签无效,因为没有在<values/>标签中使用它们");
this.ccolumnsbean=null;
}
}*/
}
}
}
private void processInnerlogic()
{
if(this.cinnerlogicbean!=null&&!this.cinnerlogicbean.isEmpty())
{//通过<innerlogic/>子标签配置了条件逻辑关系
String idTmp;
for(ConditionSelectItemBean csibeanTmp:this.cinnerlogicbean.getLstSelectItemBeans())
{
idTmp=csibeanTmp.getId().toLowerCase().trim();
if(!idTmp.equals("and")&&!idTmp.equals("or"))
{
throw new WabacusConfigLoadingException("加载报表"+this.getReportBean().getPath()+"的name属性为"+this.name
+"的查询条件失败,配置的<innerlogic/>的<logic/>的id必须是and或or之一");
}
}
}
if(this.iterator<2&&cinnerlogicbean!=null&&!cinnerlogicbean.isEmpty()&&cinnerlogicbean.getLstSelectItemBeans().size()>1)
{
throw new WabacusConfigLoadingException("加载报表"+this.getReportBean().getPath()+"的name属性为"+this.name
+"的查询条件失败,没有配置iterator属性或配置的值小于2时,不能将<innerlogic/>标签配置多个<logic/>子标签");
}
}
public AbsConfigBean clone(AbsConfigBean parent)
{
ConditionBean cbNew=(ConditionBean)super.clone(parent);
if(inputbox!=null)
{
cbNew.setInputbox((AbsInputBox)inputbox.clone(cbNew));
}
if(cinnerlogicbean!=null)
{
cbNew.setCinnerlogicbean(cinnerlogicbean.clone(cbNew));
}
if(ccolumnsbean!=null)
{
cbNew.setCcolumnsbean(ccolumnsbean.clone(cbNew));
}
if(cvaluesbean!=null)
{
cbNew.setCvaluesbean(cvaluesbean.clone(cbNew));
}
if(conditionExpression!=null)
{
cbNew.setConditionExpression(conditionExpression.clone());
}
if(lstChildDisplayOrder!=null)
{
cbNew.setLstChildDisplayOrder((List<String>)((ArrayList<String>)lstChildDisplayOrder).clone());
}
cloneExtendConfig(cbNew);
return cbNew;
}
}