/*
* 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.container.page;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import com.wabacus.config.Config;
import com.wabacus.config.OnloadMethodBean;
import com.wabacus.config.component.IComponentConfigBean;
import com.wabacus.config.component.application.report.ColBean;
import com.wabacus.config.component.application.report.ConditionBean;
import com.wabacus.config.component.application.report.ReportBean;
import com.wabacus.config.component.container.AbsContainerConfigBean;
import com.wabacus.config.other.JavascriptFileBean;
import com.wabacus.config.print.AbsPrintProviderConfigBean;
import com.wabacus.exception.WabacusConfigLoadingException;
import com.wabacus.system.ReportRequest;
import com.wabacus.system.assistant.JavaScriptAssistant;
import com.wabacus.system.commoninterface.IPagePersonalizePersistence;
import com.wabacus.system.component.IComponentType;
import com.wabacus.system.component.application.report.abstractreport.AbsListReportType;
import com.wabacus.system.component.application.report.abstractreport.configbean.AbsListReportBean;
import com.wabacus.system.component.application.report.abstractreport.configbean.AbsListReportColBean;
import com.wabacus.system.component.container.AbsContainerType;
import com.wabacus.system.component.container.page.PageType;
import com.wabacus.system.intercept.AbsPageInterceptor;
import com.wabacus.util.Consts;
import com.wabacus.util.Consts_Private;
import com.wabacus.util.Tools;
import com.wabacus.util.UniqueArrayList;
public class PageBean extends AbsContainerConfigBean
{
private boolean isCheckPermission;
private List<String> ulstMyCss=null;
private List<JavascriptFileBean> lstMyJavascriptFiles=null;
private JavascriptFileBean jsFileForConfigFile;
private String jsFilePath="";//为此页面上所有报表自动生成的javascript函数所在js文件的绝对路径(即物理路径)
private String reportfile_key;
private List<ReportBean> lstRelateReports;
private Map<ReportBean,ReportBean> mRelateReports;
// private PageTemplate templateObj;//当前页面所用的模板对象
private List<AbsPageInterceptor> lstInterceptors;
private boolean shouldProvideEncodePageUrl;//在运行时决定本页面是否需要提供编码后的URL,目前只有当本页面通过rrequest.forwardPageWithBack()方法跳转到其它页面后需要返回时,才需要编码本页面的URL,以便返回
private boolean shouldIncludeAutoCreatedJs;
private IPagePersonalizePersistence personalizeObj=null;
private List<AbsPrintProviderConfigBean> lstPrintBeans;
public PageBean(AbsContainerConfigBean parent,String tagname)
{//<page/>一定是最顶层的容器
super(null,tagname);
}
public List<String> getUlstMyCss()
{
return ulstMyCss;
}
public List<String> getUlstSystemCss()
{
List<String> lstResults=new UniqueArrayList<String>();
List<String> lstCss=Config.getInstance().getUlstGlobalCss();
if(lstCss!=null) lstResults.addAll(lstCss);
lstCss=Config.getInstance().getUlstLocalCss(this);
if(lstCss!=null) lstResults.addAll(lstCss);
return lstResults;
}
public List<JavascriptFileBean> getLstMyJavascriptFiles()
{
return this.lstMyJavascriptFiles;
}
public List<JavascriptFileBean> getLstSystemJavascriptFiles()
{
List<JavascriptFileBean> lstResult=new UniqueArrayList<JavascriptFileBean>();
List<JavascriptFileBean> lstJsTmp=Config.getInstance().getLstDefaultGlobalJavascriptFiles();
if(lstJsTmp!=null) lstResult.addAll(lstJsTmp);
lstJsTmp=Config.getInstance().getLstGlobalJavascriptFiles();
if(lstJsTmp!=null) lstResult.addAll(lstJsTmp);
lstJsTmp=Config.getInstance().getLstLocalJavascript(this);
if(lstJsTmp!=null) lstResult.addAll(lstJsTmp);
if(shouldIncludeAutoCreatedJs&&this.jsFileForConfigFile!=null) lstResult.add(this.jsFileForConfigFile);
return lstResult;
}
public void addMyCss(String css)
{
if(ulstMyCss==null) ulstMyCss=new UniqueArrayList<String>();
ulstMyCss.add(css);
}
public void addMyCss(List<String> lstcss)
{
if(ulstMyCss==null) ulstMyCss=new UniqueArrayList<String>();
ulstMyCss.addAll(lstcss);
}
public void addMyJavascriptFile(String jsfileUrl,int loadorder)
{
if(this.lstMyJavascriptFiles==null) this.lstMyJavascriptFiles=new UniqueArrayList<JavascriptFileBean>();
this.lstMyJavascriptFiles.add(new JavascriptFileBean(jsfileUrl,loadorder));
}
public void setShouldIncludeAutoCreatedJs(boolean shouldIncludeAutoCreatedJs)
{
this.shouldIncludeAutoCreatedJs=shouldIncludeAutoCreatedJs;
}
public boolean isCheckPermission()
{
return isCheckPermission;
}
public void setCheckPermission(boolean isCheckPermission)
{
this.isCheckPermission=isCheckPermission;
}
public void setJsFileUrl(String jsFileUrl)
{
if(jsFileUrl==null||jsFileUrl.trim().equals(""))
{
this.jsFileForConfigFile=null;
}else
{
this.jsFileForConfigFile=new JavascriptFileBean(jsFileUrl.trim(),0);
}
}
public String getJsFilePath()
{
return this.jsFilePath;
}
public void setJsFilePath(String jsFilePath)
{
this.jsFilePath=jsFilePath;
}
public String getReportfile_key()
{
return reportfile_key;
}
public void setReportfile_key(String reportfile_key)
{
this.reportfile_key=reportfile_key;
}
public void addInterceptor(AbsPageInterceptor interceptor)
{
if(interceptor==null) return;
if(this.lstInterceptors==null) this.lstInterceptors=new ArrayList<AbsPageInterceptor>();
this.lstInterceptors.add(interceptor);
}
public List<AbsPageInterceptor> getLstInterceptors()
{
if(lstInterceptors==null) return new ArrayList<AbsPageInterceptor>();
return lstInterceptors;
}
public void setLstRelateReports(List<ReportBean> lstRelateReports)
{
this.lstRelateReports=lstRelateReports;
}
public void setMRelateReports(Map<ReportBean,ReportBean> relateReports)
{
mRelateReports=relateReports;
}
public void addRelateReports(ReportBean rbean)
{
if(lstRelateReports==null)
{
lstRelateReports=new ArrayList<ReportBean>();
}
lstRelateReports.add(rbean);
}
public Map<ReportBean,ReportBean> getMRelateReports()
{
return mRelateReports;
}
public ReportBean getDependParentReportBean(ReportBean rbean)
{
if(this.mRelateReports==null) return null;
return this.mRelateReports.get(rbean);
}
public boolean isShouldProvideEncodePageUrl()
{
return shouldProvideEncodePageUrl;
}
public void setShouldProvideEncodePageUrl(boolean shouldProvideEncodePageUrl)
{
this.shouldProvideEncodePageUrl=shouldProvideEncodePageUrl;
}
public IPagePersonalizePersistence getPersonalizeObj()
{
return personalizeObj;
}
public void setPersonalizeObj(IPagePersonalizePersistence personalizeObj)
{
this.personalizeObj=personalizeObj;
}
public List<AbsPrintProviderConfigBean> getLstPrintBeans()
{
return lstPrintBeans;
}
public void addPrintBean(AbsPrintProviderConfigBean printBean)
{
if(this.lstPrintBeans==null) this.lstPrintBeans=new ArrayList<AbsPrintProviderConfigBean>();
this.lstPrintBeans.add(printBean);
}
public ReportBean getSlaveReportBean(String reportid)
{
if(reportid==null||reportid.equals("")) return null;
if(this.mRelateReports==null||this.mRelateReports.size()==0) return null;
for(ReportBean rbean:this.mRelateReports.keySet())
{
if(reportid.equals(rbean.getId()))
{
return rbean;
}
}
return null;
}
public PageBean clone(AbsContainerConfigBean parent)
{
PageBean pbNew=(PageBean)super.clone(parent);
if(this.lstRelateReports!=null)
{
pbNew.setLstRelateReports(new ArrayList<ReportBean>());
}
if(this.mRelateReports!=null)
{
pbNew.setMRelateReports(new HashMap<ReportBean,ReportBean>());
}
return pbNew;
}
public void doPostLoad()
{
this.refreshid=this.id;
processRelateReports();
processRelateConditions();
if(ulstMyCss!=null&&ulstMyCss.size()==0) ulstMyCss=null;
if(this.lstMyJavascriptFiles!=null&&lstMyJavascriptFiles.size()==0) lstMyJavascriptFiles=null;
super.doPostLoad();
}
private void processRelateReports()
{
if(this.lstRelateReports==null||this.lstRelateReports.size()==0) return;
this.mRelateReports=new HashMap<ReportBean,ReportBean>();
for(ReportBean rbeanSlave:lstRelateReports)
{
ReportBean rbeanMaster=this.getReportChild(rbeanSlave.getDependParentId(),true);
if(rbeanMaster==null)
{
throw new WabacusConfigLoadingException("加载页面"+this.getPath()+"失败,其下的报表"
+rbeanSlave.getId()+"依赖的报表"+rbeanSlave.getDependParentId()+"不存在");
}
if(rbeanMaster.isListReportType())
{//如果主报表是列表报表,则子报表不能配置refreshid为其它容器,因为它们是在客户端单独加载的,不能和其它报表绑定加载
if(rbeanSlave.getRefreshid()!=null&&!rbeanSlave.getRefreshid().trim().equals("")
&&!rbeanSlave.getRefreshid().trim().equals(rbeanSlave.getId()))
{
throw new WabacusConfigLoadingException("报表"+rbeanSlave.getPath()+"失败,它是依赖其它报表的从报表,因此不能为它配置refreshid属性");
}
}
processDependParams(rbeanSlave,rbeanMaster);
if(rbeanMaster.isListReportType())
{
AbsListReportBean alrbean=(AbsListReportBean)rbeanMaster.getExtendConfigDataForReportType(AbsListReportType.KEY);
if(alrbean.getRowSelectType()==null||alrbean.getRowSelectType().trim().equals("")
||alrbean.getRowSelectType().trim().equals(Consts.ROWSELECT_NONE))
{
alrbean.setRowSelectType(Consts.ROWSELECT_SINGLE);
}
}
this.mRelateReports.put(rbeanSlave,rbeanMaster);
}
validRelateReports();
ReportBean rbeanTempMaster;
AbsListReportBean alrbean;
List<ReportBean> lstCreatedListReportBeans=new ArrayList<ReportBean>();
for(Entry<ReportBean,ReportBean> rbeanEntries:this.mRelateReports.entrySet())
{
rbeanTempMaster=rbeanEntries.getValue();
if(rbeanTempMaster.isListReportType())
{
if(lstCreatedListReportBeans.contains(rbeanTempMaster)) continue;//已经为此报表生成过js
lstCreatedListReportBeans.add(rbeanTempMaster);
alrbean=(AbsListReportBean)rbeanTempMaster.getExtendConfigDataForReportType(AbsListReportType.KEY);
if(alrbean==null)
{
alrbean=new AbsListReportBean(rbeanTempMaster);
rbeanTempMaster.setExtendConfigDataForReportType(AbsListReportType.KEY,alrbean);
}
alrbean.addRowSelectCallBackFunc(rbeanTempMaster.getRefreshSlaveReportsCallBackMethodName());
rbeanTempMaster.addOnloadMethod(new OnloadMethodBean(Consts_Private.ONLOAD_REFRESHSLAVE,rbeanTempMaster
.getRefreshSlaveReportsCallBackMethodName()));
}else
{
String masterReportRefreshId=rbeanTempMaster.getRefreshid();
if(masterReportRefreshId==null||masterReportRefreshId.trim().equals(""))
{
masterReportRefreshId=rbeanTempMaster.getId();
}
rbeanTempMaster.setRefreshid(getParentContainerObjOfComponents(masterReportRefreshId,rbeanEntries.getKey().getId()).getId());
}
}
for(ReportBean rbTmp:lstCreatedListReportBeans)
{
JavaScriptAssistant.getInstance().createRefreshSlaveReportsDataScript(rbTmp);
}
this.lstRelateReports=null;
}
private void processDependParams(ReportBean rbeanSlave,ReportBean rbeanMaster)
{
Map<String,Map<String,String>> mDependParams=rbeanMaster.getMDependChilds();
if(mDependParams==null)
{
mDependParams=new HashMap<String,Map<String,String>>();
rbeanMaster.setMDependChilds(mDependParams);
}
if(rbeanSlave.getDependparams()==null||rbeanSlave.getDependparams().trim().equals(""))
{
throw new WabacusConfigLoadingException("加载页面"+this.getPath()+"失败,其下的报表"
+rbeanSlave.getId()+"依赖其它报表,但不存在依赖的动态参数,无法完成依赖操作");
}
List<String> lstParams=Tools.parseStringToList(rbeanSlave.getDependparams(),";",false);
List<String> lstTemp;
Map<String,String> mParams=new HashMap<String,String>();
mDependParams.put(rbeanSlave.getId(),mParams);
if(rbeanMaster.isDetailReportType()) rbeanSlave.setMDependsDetailReportParams(mParams);//如果主报表是细览报表,则存放其所用到的参数,以便加载此从报表数据时可以知道要取哪些参数
for(String param:lstParams)
{
lstTemp=Tools.parseStringToList(param,"=",false);
String paramname=lstTemp.get(0).trim();
String paramvalue="";
if(lstTemp.size()==2)
{
paramvalue=lstTemp.get(1).trim();
}else if(lstTemp.size()>2)
{
throw new WabacusConfigLoadingException("加载页面"+this.getPath()+"失败,其下报表"
+rbeanSlave.getId()+"配置的dependsparams:"+rbeanSlave.getDependparams()+"不合法,出现多个=号");
}
if(paramname.equals(""))
{//每个从报表的动态参数必须定义成@{<col/>的property}格式
throw new WabacusConfigLoadingException("加载页面"+this.getPath()+"失败,其下报表"+rbeanSlave.getId()+"配置的dependsparams:"
+rbeanSlave.getDependparams()+"不合法,参数名不能为空");
}
ConditionBean conbeanTmp=rbeanSlave.getSbean().getConditionBeanByName(paramname);
if(conbeanTmp!=null)
{
if(!conbeanTmp.isConditionValueFromUrl())
{
throw new WabacusConfigLoadingException("加载从报表"+rbeanSlave.getPath()+"失败,在dependsparams中配置的"+paramname
+"对应的查询条件<condition/>不是从URL中获取条件数据");
}
}
mParams.put(paramname,paramvalue);
if(Tools.isDefineKey("@",paramvalue))
{
paramvalue=Tools.getRealKeyByDefine("@",paramvalue);//父报表的某个<col/>的property
ColBean cb=rbeanMaster.getDbean().getColBeanByColProperty(paramvalue);
if(cb==null)
{
throw new WabacusConfigLoadingException("加载页面"+this.getPath()+"失败,其下报表"
+rbeanSlave.getId()+"配置的dependsparams:"+rbeanSlave.getDependparams()+"中动态参数"
+paramvalue+"在被依赖的父报表中不存在property为此值的<col/>");
}
if(rbeanMaster.isListReportType())
{
AbsListReportColBean alrcean=(AbsListReportColBean)cb.getExtendConfigDataForReportType(AbsListReportType.KEY);
if(alrcean==null)
{
alrcean=new AbsListReportColBean(cb);
cb.setExtendConfigDataForReportType(AbsListReportType.KEY,alrcean);
}
alrcean.setSlaveReportParamName(paramname);//将此ColBean标识为参与刷新从报表的参数,并记下对应的参数名
rbeanSlave.addParamNameFromURL(paramname);
cb.setDisplayNameValueProperty(true);
}
}
}
}
private void validRelateReports()
{
List<ReportBean> lstValidedMasterReport=new ArrayList<ReportBean>();
List<String> lstDetailReportidDependingListReports=new ArrayList<String>();
for(ReportBean rbeanSlave:this.mRelateReports.keySet())
{
if(rbeanSlave==null||!rbeanSlave.isSlaveReport()) continue;
ReportBean rbeanMaster=this.mRelateReports.get(rbeanSlave);
if(!lstValidedMasterReport.contains(rbeanMaster))
{
Map<String,Map<String,String>> mDependChildsTmp=rbeanMaster.getMDependChilds();
Map<String,String> mDynParamsValueAndName=new HashMap<String,String>();
for(Entry<String,Map<String,String>> entryTmp:mDependChildsTmp.entrySet())
{//循环所有依赖此主报表的从报表
Map<String,String> mParams=entryTmp.getValue();
if(mParams.size()==0)
{
throw new WabacusConfigLoadingException("加载页面"+this.getPath()+"失败,依赖主报表"+rbeanMaster.getPath()+"的从报表"+entryTmp.getKey()
+"没有配置dependsparams参数");
}
boolean existDynParams=false;
for(Entry<String,String> entryParams:mParams.entrySet())
{
if(Tools.isDefineKey("@",entryParams.getValue()))
{
existDynParams=true;
if(mDynParamsValueAndName.containsKey(entryParams.getValue())
&&!entryParams.getKey().equals(mDynParamsValueAndName.get(entryParams.getValue())))
{
throw new WabacusConfigLoadingException("加载页面"+this.getPath()+"失败,依赖主报表"+rbeanMaster.getPath()+"的从报表存在多个参数名从本主报表的列"
+entryParams.getValue()+"中取参数值,必须保持相同的参数名");
}
mDynParamsValueAndName.put(entryParams.getValue(),entryParams.getKey());
}
}
if(!existDynParams)
{
throw new WabacusConfigLoadingException("加载页面"+this.getPath()+"失败,依赖主报表"+rbeanMaster.getPath()+"的从报表"+entryTmp.getKey()
+"在dependsparams中没有配置动态参数");
}
}
lstValidedMasterReport.add(rbeanMaster);
}
if(rbeanMaster.isListReportType()&&rbeanSlave.isDetailReportType())
{
lstDetailReportidDependingListReports.add(rbeanSlave.getId());
}
while(rbeanMaster!=null)
{
if(rbeanMaster.getId().equals(rbeanSlave.getId()))
{//存在循环依赖
throw new WabacusConfigLoadingException("加载页面"+this.getPath()+"失败,其下报表存在循环依赖");
}
rbeanMaster=this.mRelateReports.get(rbeanMaster);
}
}
for(ReportBean rbeanSlave:this.mRelateReports.keySet())
{
if(rbeanSlave==null||!rbeanSlave.isSlaveReport()) continue;
ReportBean rbeanMaster=this.mRelateReports.get(rbeanSlave);
if(lstDetailReportidDependingListReports.contains(rbeanMaster.getId()))
{
throw new WabacusConfigLoadingException("加载页面"+this.getPath()+"失败,细览报表"+rbeanMaster.getPath()+"依赖于数据自动列表报表,因此不能再被其它报表依赖");
}
}
}
private void processRelateConditions()
{
List<String> lstAllConditionNames=new ArrayList<String>();
Set<String> sRelateConditionNames=new HashSet<String>();
getAllRelateConditions(this,lstAllConditionNames,sRelateConditionNames);
if(sRelateConditionNames.size()==0) return;
Map<String,List<ReportBean>> mRelateConReportBeans=new HashMap<String,List<ReportBean>>();
getAllRelateConditionReportBeans(this,sRelateConditionNames,mRelateConReportBeans);
for(Entry<String,List<ReportBean>> entryTmp:mRelateConReportBeans.entrySet())
{//处理每个关联查询条件对应的报表
updateRefreshContaineridForReportBeans(entryTmp.getValue());
updateRelateReportidsForReportBeans(entryTmp.getValue());
}
}
private void getAllRelateConditions(AbsContainerConfigBean containerBean,
List<String> lstAllConditionNames,Set<String> sRelateConditionNames)
{
List<String> lstConNames;
for(Entry<String,IComponentConfigBean> entryTmp:containerBean.getMChildren().entrySet())
{
if(entryTmp.getValue() instanceof ReportBean)
{
ReportBean rbeanTmp=(ReportBean)entryTmp.getValue();
if(rbeanTmp.getSbean()==null||rbeanTmp.getSbean().getLstConditions()==null)
continue;
List<ConditionBean> lstConditions=rbeanTmp.getSbean().getLstConditions();
lstConNames=new ArrayList<String>();
for(ConditionBean cbean:lstConditions)
{
if(cbean==null) continue;
if(lstConNames.contains(cbean.getName()))
{
throw new WabacusConfigLoadingException("报表"+rbeanTmp.getPath()+"中存在多个name属性为"+cbean.getName()
+"的查询条件,同一个报表下的所有<condition/>的name属性必须唯一");
}
lstConNames.add(cbean.getName());
if(!cbean.isConditionValueFromUrl()) continue;
if(lstAllConditionNames.contains(cbean.getName()))
{
sRelateConditionNames.add(cbean.getName());
}else
{
lstAllConditionNames.add(cbean.getName());
}
}
}else if(entryTmp.getValue() instanceof AbsContainerConfigBean)
{
getAllRelateConditions((AbsContainerConfigBean)entryTmp.getValue(),
lstAllConditionNames,sRelateConditionNames);
}
}
}
private void getAllRelateConditionReportBeans(AbsContainerConfigBean containerBean,
Set<String> sRelateConditionNames,Map<String,List<ReportBean>> mRelateConReportBeans)
{
IComponentConfigBean childBeanTmp;
for(Entry<String,IComponentConfigBean> entryTmp:containerBean.getMChildren().entrySet())
{
childBeanTmp=entryTmp.getValue();
if(childBeanTmp instanceof ReportBean)
{
for(String relateconname:sRelateConditionNames)
{
ReportBean rbeanTmp=(ReportBean)entryTmp.getValue();
if(rbeanTmp.getSbean()==null||rbeanTmp.getSbean().getLstConditions()==null) continue;
if(rbeanTmp.isSlaveReportDependsonListReport()) continue;//从报表不存在查询条件关联的情况
List<ConditionBean> lstConditions=rbeanTmp.getSbean().getLstConditions();
for(ConditionBean cbean:lstConditions)
{
if(cbean==null||!cbean.isConditionValueFromUrl()) continue;
if(relateconname.equals(cbean.getName()))
{
List<ReportBean> lst=mRelateConReportBeans.get(relateconname);
if(lst==null)
{
lst=new ArrayList<ReportBean>();
mRelateConReportBeans.put(relateconname,lst);
}
lst.add(rbeanTmp);
}
}
}
}else if(childBeanTmp instanceof AbsContainerConfigBean)
{
getAllRelateConditionReportBeans((AbsContainerConfigBean)childBeanTmp,sRelateConditionNames,mRelateConReportBeans);
}
}
}
private void updateRefreshContaineridForReportBeans(List<ReportBean> lstReportBeans)
{
if(lstReportBeans==null||lstReportBeans.size()<2) return;
ReportBean rbean=lstReportBeans.get(0);
String containerid=null;
AbsContainerConfigBean parentContainer=rbean.getParentContainer();
while(parentContainer!=null)
{
int i=1;
for(;i<lstReportBeans.size();i++)
{
if(parentContainer.getReportChild(lstReportBeans.get(i).getId(),true)==null)
{
parentContainer=parentContainer.getParentContainer();
break;
}
}
if(i==lstReportBeans.size())
{
containerid=parentContainer.getId();
break;
}
}
for(ReportBean rbeanTmp:lstReportBeans)
{
if(rbeanTmp.getRefreshid()==null||rbeanTmp.getRefreshid().trim().equals(""))
{
rbeanTmp.setRefreshid(containerid);
}else
{
rbeanTmp.setRefreshid(getCommonRefreshIdOfComponents(containerid,rbeanTmp.getRefreshid()));
}
}
}
public String getCommonRefreshIdOfComponents(String componentId1,String componentId2)
{
componentId1=componentId1==null?"":componentId1.trim();
componentId2=componentId2==null?"":componentId2.trim();
if(componentId2.equals("")||componentId1.equals("")) return null;
if(componentId1.equals(componentId2))
{//两个id是同一个组件的ID,则refreshid就是它们的id
if(!this.id.equals(componentId1)&&getChildComponentBean(componentId1,true)==null)
{
throw new WabacusConfigLoadingException("页面"+this.id+"下面不存在id属性为"+componentId1+"的子组件");
}
return componentId1;
}
AbsContainerConfigBean commonParentContainerObj=getParentContainerObjOfComponents(componentId1,componentId2);
if(commonParentContainerObj==null) return null;
return commonParentContainerObj.getId();
}
public AbsContainerConfigBean getParentContainerObjOfComponents(String componentId1,String componentId2)
{
componentId1=componentId1==null?"":componentId1.trim();
componentId2=componentId2==null?"":componentId2.trim();
if(componentId1.equals("")||componentId2.equals("")) return null;
if(id.equals(componentId1)&&id.equals(componentId2))
{//两个都是<page/>的id
return this;
}
IComponentConfigBean obj1=null;
IComponentConfigBean obj2=null;
if(id.equals(componentId1))
{
obj1=this;
}else
{
obj1=this.getChildComponentBean(componentId1,true);
}
if(id.equals(componentId2))
{
obj2=this;
}else
{
obj2=this.getChildComponentBean(componentId2,true);
}
if(obj1==null)
{
throw new WabacusConfigLoadingException("页面"+this.id+"下面不存在id属性为"+componentId1+"的子组件");
}
if(obj2==null)
{
throw new WabacusConfigLoadingException("页面"+this.id+"下面不存在id属性为"+componentId2+"的子组件");
}
if(componentId1.equals(componentId2))
{
if(obj1 instanceof AbsContainerConfigBean)
{
return (AbsContainerConfigBean)obj1;
}else
{
return ((IComponentConfigBean)obj1).getParentContainer();
}
}
if(obj1 instanceof AbsContainerConfigBean)
{
if(((AbsContainerConfigBean)obj1).getChildComponentBean(componentId2,true)!=null)
{
return (AbsContainerConfigBean)obj1;
}
}
if(obj2 instanceof AbsContainerConfigBean)
{
if(((AbsContainerConfigBean)obj2).getChildComponentBean(componentId1,true)!=null)
{
return (AbsContainerConfigBean)obj2;
}
}
AbsContainerConfigBean parentContainer1=((IComponentConfigBean)obj1).getParentContainer();
while(parentContainer1!=null)
{
if(parentContainer1.getChildComponentBean(componentId2,true)!=null)
{
return parentContainer1;
}
parentContainer1=parentContainer1.getParentContainer();
}
return null;
}
private void updateRelateReportidsForReportBeans(List<ReportBean> lstReportBeans)
{
for(ReportBean rbeanTmp:lstReportBeans)
{
for(ReportBean rbeanTmp2:lstReportBeans)
{
rbeanTmp.addRelateConditionReportid(rbeanTmp2.getId());
}
}
}
public IComponentType createComponentTypeObj(ReportRequest rrequest,AbsContainerType parentContainer)
{
return new PageType(parentContainer,this,rrequest);
}
}