/* * 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.assistant; import java.io.IOException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import javassist.CannotCompileException; import javassist.ClassClassPath; import javassist.ClassPool; import javassist.CtClass; import javassist.CtField; import javassist.CtMethod; import javassist.CtNewMethod; import javassist.Modifier; import javassist.NotFoundException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.wabacus.config.Config; import com.wabacus.config.ConfigLoadManager; import com.wabacus.config.component.IComponentConfigBean; import com.wabacus.config.component.application.report.AbsReportDataPojo; import com.wabacus.config.component.application.report.ColBean; import com.wabacus.config.component.application.report.ConditionBean; import com.wabacus.config.component.application.report.DisplayBean; import com.wabacus.config.component.application.report.ReportBean; import com.wabacus.config.component.application.report.ReportDataSetValueBean; import com.wabacus.config.component.application.report.SqlBean; import com.wabacus.config.component.container.AbsContainerConfigBean; import com.wabacus.exception.WabacusConfigLoadingException; import com.wabacus.exception.WabacusRuntimeException; import com.wabacus.system.CacheDataBean; import com.wabacus.system.ReportRequest; import com.wabacus.system.buttons.AbsButtonType; import com.wabacus.system.buttons.IButtonClickeventGenerate; import com.wabacus.system.component.application.report.CrossListReportType; import com.wabacus.system.component.application.report.EditableDetailReportType; import com.wabacus.system.component.application.report.EditableListFormReportType; import com.wabacus.system.component.application.report.abstractreport.AbsListReportType; import com.wabacus.system.component.application.report.abstractreport.AbsReportType; import com.wabacus.system.component.application.report.abstractreport.IEditableReportType; 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.application.report.configbean.crosslist.CrossListReportColBean; import com.wabacus.system.component.application.report.configbean.editablereport.AbsEditableReportEditDataBean; import com.wabacus.system.dataset.select.report.AbsReportDataSetType; import com.wabacus.system.dataset.select.report.HorizontalReportDataSet; import com.wabacus.system.dataset.select.report.VerticalReportDataSet; import com.wabacus.system.dataset.update.action.AbsUpdateAction; import com.wabacus.system.datatype.IDataType; import com.wabacus.system.inputbox.AbsInputBox; import com.wabacus.system.inputbox.SelectBox; import com.wabacus.system.inputbox.TextBox; import com.wabacus.system.intercept.AbsInterceptorDefaultAdapter; import com.wabacus.system.intercept.ColDataBean; import com.wabacus.system.intercept.ReportDataBean; import com.wabacus.system.intercept.RowDataBean; import com.wabacus.util.Consts; import com.wabacus.util.Consts_Private; import com.wabacus.util.Tools; import com.wabacus.util.UniqueArrayList; public class ReportAssistant { private static Log log=LogFactory.getLog(ReportAssistant.class); private final static ReportAssistant instance=new ReportAssistant(); protected ReportAssistant() {} public static ReportAssistant getInstance() { return instance; } public List<AbsReportDataPojo> loadReportDataSet(ReportRequest rrequest,AbsReportType reportObj,boolean isLoadAllDataMandatory) { SqlBean sbean=reportObj.getReportBean().getSbean(); if(sbean==null||sbean.getLstDatasetBeans()==null||sbean.getLstDatasetBeans().size()==0) return null; AbsReportDataSetType reportDataSetObj=sbean.isHorizontalDataset()?new HorizontalReportDataSet(reportObj):new VerticalReportDataSet(reportObj); List<AbsReportDataPojo> lstData=reportDataSetObj.loadReportAllRowDatas(isLoadAllDataMandatory); if(lstData!=null&&lstData.size()>0) { List<AbsReportDataPojo> lstDataTmp=(List<AbsReportDataPojo>)((ArrayList<AbsReportDataPojo>)lstData).clone(); for(AbsReportDataPojo dataObjTmp:lstDataTmp) { dataObjTmp.format(); } } CacheDataBean cdb=rrequest.getCdb(reportObj.getReportBean().getId()); if(!sbean.isHorizontalDataset()&&cdb.isLoadAllReportData()) { if(!reportObj.getReportBean().isLazyLoadReportData(rrequest)) { cdb.setRecordcount(lstData==null?0:lstData.size()); } if(cdb.getRecordcount()>0) cdb.setPagecount(1); } return lstData; } public String addDynamicConditionExpressionsToSql(ReportRequest rrequest,IComponentConfigBean ccbean,ReportDataSetValueBean dsvbean,String sql, List<ConditionBean> lstConditionBeans,List<String> lstConditionValues,List<IDataType> lstConditionTypes) { if(lstConditionBeans==null||lstConditionBeans.size()==0) return replaceSQLConditionPlaceHolderByRealValue(ccbean,sql,"{#condition#}",null); StringBuffer dynConditionsBuf=new StringBuffer(); String conditionExpressionTmp; for(ConditionBean conbean:lstConditionBeans) { if(dsvbean!=null&&!conbean.isBelongTo(dsvbean)) continue; conditionExpressionTmp=conbean.getConditionExpressionAndParams(rrequest,lstConditionValues,lstConditionTypes); if(conditionExpressionTmp==null||conditionExpressionTmp.trim().equals("")) continue;//没有在<condition/>中配置条件表达式(可能是通过#name#的形式直接在sql语句中指定条件) if(dynConditionsBuf.length()==0) {//第一个条件 dynConditionsBuf.append(conditionExpressionTmp); }else { dynConditionsBuf.append(" and ").append(conditionExpressionTmp); } } return replaceSQLConditionPlaceHolderByRealValue(ccbean,sql,"{#condition#}",dynConditionsBuf.toString()); } public String replaceSQLConditionPlaceHolderByRealValue(IComponentConfigBean ccbean,String sql,String placeholder,String realvalue) { int idx=sql.indexOf(placeholder); if(idx<0) return sql; if(!Tools.isEmpty(realvalue)) return Tools.replaceAll(sql,placeholder,realvalue); String sql1=sql.substring(0,idx).trim(); String sql2=sql.substring(idx+placeholder.length()).trim(); while(sql1.endsWith("(")&&sql2.startsWith(")")) { sql1=sql1.substring(0,sql1.length()-1).trim(); sql2=sql2.substring(1).trim(); } if(sql1.endsWith("(")) {//sql为select xxx where 条件1 and/or ({当前条件} and/or 其它条件) ...形式,此时{当前条件}后面只有可能是and或or if(!sql2.toLowerCase().startsWith("and ")&&!sql2.toLowerCase().startsWith("or ")||sql2.indexOf(")")<0) { throw new WabacusRuntimeException("报表"+ccbean.getPath()+"中的sql语句"+sql+"格式不对,"+placeholder+"所在位置不合法"); } if(sql2.toLowerCase().startsWith("and ")) { sql2=sql2.substring(3); }else if(sql2.toLowerCase().startsWith("or ")) { sql2=sql2.substring(2); } }else if(sql2.startsWith(")")) {//sql为select xxx where 条件1 and/or (其它条件 and/or {当前条件}) ...形式或者select * from table where id in(select id from table2 where {当前条件})形式 if(!sql1.toLowerCase().endsWith(" and")&&!sql1.toLowerCase().endsWith(" or")&&!sql1.toLowerCase().endsWith(" where")||sql1.indexOf("(")<0) { throw new WabacusRuntimeException("报表"+ccbean.getPath()+"中的sql语句"+sql+"格式不对,"+placeholder+"所在位置不合法"); } if(sql1.toLowerCase().endsWith(" and")) { sql1=sql1.substring(0,sql1.length()-3); }else if(sql1.toLowerCase().endsWith(" or")) { sql1=sql1.substring(0,sql1.length()-2); }else if(sql1.toLowerCase().endsWith(" where")) { sql1=sql1.substring(0,sql1.length()-5); } }else {//sql为select xxx where/and/or {当前条件} and/or/其它非条件值或空 if(sql1.toLowerCase().endsWith(" where")) {//sql为select xxx where {当前条件} and/or/其它非条件值或空 if(sql2.toLowerCase().startsWith("or ")) { sql2=sql2.substring(2); }else if(sql2.toLowerCase().startsWith("and ")) { sql2=sql2.substring(3); }else {//后面已经没有条件了,则去掉where sql1=sql1.substring(0,sql1.length()-5); } }else if(sql1.toLowerCase().endsWith(" and")) {//sql为select xxx where 其它条件 and {当前条件} and/or/其它非条件值或空 sql1=sql1.substring(0,sql1.length()-3); }else if(sql1.toLowerCase().endsWith(" or")) {//sql为select xxx where 其它条件 or {当前条件} and/or/其它非条件值或空 if(sql2.toLowerCase().startsWith("and ")) { sql2=sql2.substring(3); }else { sql1=sql1.substring(0,sql1.length()-2); } } } return sql1+" "+sql2; } public Object getPropertyValue(Object dataobj,String property) { if(dataobj==null||property==null||property.trim().equals("")) { return null; } String getMethodName="get"+property.substring(0,1).toUpperCase()+property.substring(1); try { Method getMethod=dataobj.getClass().getMethod(getMethodName,new Class[] {}); return getMethod.invoke(dataobj,new Object[] {}); }catch(Exception e) { throw new WabacusRuntimeException("获取属性:"+property+"数据失败",e); } } public String getPropertyValueAsString(Object dataobj,String property,IDataType datatypeObj) { if(dataobj==null||property==null||property.trim().equals("")) { return null; } String getMethodName="get"+property.substring(0,1).toUpperCase()+property.substring(1); try { Method getMethod=dataobj.getClass().getMethod(getMethodName,new Class[] {}); Object value=getMethod.invoke(dataobj,new Object[] {}); if(value==null) return null; if(datatypeObj==null) return value.toString(); return datatypeObj.value2label(value); }catch(Exception e) { throw new WabacusRuntimeException("获取属性:"+property+"数据失败",e); } } public int calPageCount(int ipagesize,int irecordcount) { int ipagecount=0; if(irecordcount%ipagesize==0) { ipagecount=irecordcount/ipagesize; }else { ipagecount=irecordcount/ipagesize+1; } return ipagecount; } public String formatCondition(String src,String token) { if(src==null||src.trim().length()<2||token==null||token.trim().equals("")) { return src; } src=src.trim(); String dest=""; if(token.equals("2")) { dest=src.substring(0,1); for(int i=1;i<src.length()-1;i++) { if(src.charAt(i)!=' ') { dest=dest+"%"+src.charAt(i); } } dest=dest+"%"+src.substring(src.length()-1); }else { if(token.equals("1")) { token=" "; } while(src.indexOf(token)==0) { src=src.substring(1); src=src.trim(); } while(src.endsWith(token)) { src=src.substring(0,src.length()-1); src=src.trim(); } StringTokenizer st=new StringTokenizer(src,token); while(st.hasMoreElements()) { dest=dest+((String)st.nextElement()).trim()+"%"; // System.out.println(dest); } if(dest.endsWith("%")) { dest=dest.substring(0,dest.length()-1); } } log.debug("条件值:"+src+"在经过splitlike转换后,变为"+dest); return dest; } public Class buildReportPOJOClass(ReportBean rbean) { DisplayBean dbean=rbean.getDbean(); if(dbean==null) return null; List<String> lstImports=null; String format=null; if(rbean.getFbean()!=null) { format=rbean.getFbean().getFormatContent(); lstImports=rbean.getFbean().getLstImports(); } format=format==null?"":format.trim(); return buildPOJOClass(rbean,dbean.getLstCols(),lstImports,format,"Pojo_"+rbean.getPageBean().getId()+rbean.getId()); } public Class buildPOJOClass(ReportBean rbean,List<ColBean> lstColBeans,List<String> lstImports,String formatMethod,String className) { if(formatMethod==null) formatMethod=""; try { ClassPool pool=ClassPoolAssistant.getInstance().createClassPool(); CtClass cclass=pool.makeClass(Consts.BASE_PACKAGE_NAME+"."+className); if(lstImports==null) lstImports=new ArrayList<String>(); if(!lstImports.contains("com.wabacus.config.component.application.report")) { lstImports.add("com.wabacus.config.component.application.report"); } if(!lstImports.contains("com.wabacus.util")) { lstImports.add("com.wabacus.util"); } if(!lstImports.contains("com.wabacus.system")) { lstImports.add("com.wabacus.system"); } ClassPoolAssistant.getInstance().addImportPackages(pool,lstImports); cclass.setSuperclass(pool.get(AbsReportDataPojo.class.getName())); ClassPoolAssistant.getInstance() .addConstructor( cclass, "public "+className+"("+ReportRequest.class.getName()+" rrequest,"+ReportBean.class.getName() +" rbean){super(rrequest,rbean);\n}"); if(lstColBeans!=null) { for(ColBean cbean:lstColBeans) { buildFieldAndGetSetMethodForColBean(rbean,cbean,pool,cclass); } } if(!formatMethod.equals("")) { ClassPoolAssistant.getInstance().addMethod(cclass,"public void format(){"+formatMethod+" \n}"); } if(!rbean.isPojoClassCache()) { cclass.writeFile(Config.homeAbsPath+"WEB-INF/classes"); } Class c=ConfigLoadManager.currentDynClassLoader.loadClass(Consts.BASE_PACKAGE_NAME+"."+className,cclass.toBytecode()); cclass.detach(); pool.clearImportedPackages(); pool=null; return c; }catch(Exception e) { throw new WabacusConfigLoadingException("为报表"+rbean.getPath()+"生成类"+className+"时失败,<format/>代码为:"+formatMethod,e); } } public void buildFieldAndGetSetMethodForColBean(ReportBean rbean,ColBean cbean,ClassPool pool,CtClass cclass) throws CannotCompileException { if(cbean==null) return; String property=cbean.getProperty(); if(property==null||property.trim().equals("")) return; if(cbean.isNonValueCol()|| cbean.isSequenceCol()||cbean.isControlCol()) { return; } CtField cfield=ClassPoolAssistant.getInstance().addField(cclass,property,cbean.getDatatypeObj().getCreatedClass(pool),Modifier.PRIVATE); CtMethod setMethod=ClassPoolAssistant.getInstance().addSetMethod(cclass,cfield,property); ClassPoolAssistant.getInstance().addGetMethod(cclass,cfield,property); if(isNeedOriginalColValue(rbean,cbean)) { String propertyOld=property+"_old"; CtField cfieldOld=ClassPoolAssistant.getInstance().addField(cclass,propertyOld,cbean.getDatatypeObj().getCreatedClass(pool), Modifier.PRIVATE); ClassPoolAssistant.getInstance().addGetMethod(cclass,cfieldOld,propertyOld); setMethod.insertBefore("if($0."+propertyOld+"==null) $0."+propertyOld+"=$1;"); } } public void setMethodInfoToColBean(ReportBean rbean) { if(rbean.getPojoClassObj()==null) return; List<ColBean> lstColBeans=rbean.getDbean().getLstCols(); if(lstColBeans==null||lstColBeans.size()==0) return; Class pojoclass=rbean.getPojoClassObj(); String propertyTmp=null; CrossListReportColBean clrcbeanTmp; for(ColBean cbeanTmp:lstColBeans) { try { if(cbeanTmp==null) continue; propertyTmp=cbeanTmp.getProperty(); if(propertyTmp==null||propertyTmp.trim().equals("")) continue; if(cbeanTmp.isNonValueCol()||cbeanTmp.isSequenceCol()||cbeanTmp.isControlCol()) continue; clrcbeanTmp=(CrossListReportColBean)cbeanTmp.getExtendConfigDataForReportType(CrossListReportType.KEY); if(clrcbeanTmp!=null&&clrcbeanTmp.isDynamicColGroup()) continue;//动态生成列 String setMethodName="set"+propertyTmp.substring(0,1).toUpperCase()+propertyTmp.substring(1); Method setMethod=pojoclass.getMethod(setMethodName,new Class[] { cbeanTmp.getDatatypeObj().getJavaTypeClass() }); cbeanTmp.setSetMethod(setMethod); String getMethodName="get"+propertyTmp.substring(0,1).toUpperCase()+propertyTmp.substring(1); Method getMethod=pojoclass.getMethod(getMethodName,new Class[] {}); cbeanTmp.setGetMethod(getMethod); }catch(Exception e) { throw new WabacusConfigLoadingException("从POJO类"+pojoclass.getClass().getName()+"获取报表"+rbean.getPath()+"的列" +propertyTmp+"的get/set方法失败",e); } } } private boolean isNeedOriginalColValue(ReportBean rbean,ColBean cbean) { AbsReportType reportTypeObj=Config.getInstance().getReportType(rbean.getType()); if((reportTypeObj instanceof IEditableReportType) &&!(reportTypeObj instanceof EditableDetailReportType||reportTypeObj instanceof EditableListFormReportType)) { return true; } // {//如果当前报表需要提供纯数据的Excel下载 AbsListReportColBean alrcbean=(AbsListReportColBean)cbean.getExtendConfigDataForReportType(AbsListReportType.KEY); if(alrcbean!=null&&alrcbean.isRowgroup()) {//如果当前cbean是数据自动列表报表的列,且参与了行分组 AbsListReportBean alrbean=(AbsListReportBean)rbean.getExtendConfigDataForReportType(AbsListReportType.KEY); if(alrbean!=null&&alrbean.getSubdisplaybean()!=null&&alrbean.getSubdisplaybean().getMRowGroupSubDisplayRowBeans()!=null &&alrbean.getSubdisplaybean().getMRowGroupSubDisplayRowBeans().size()>0) { return true; } } return false; } public AbsReportDataPojo getPojoClassInstance(ReportRequest rrequest,ReportBean rbean,Class pojoClassObj) { try { if(pojoClassObj==null) return null; return (AbsReportDataPojo)pojoClassObj.getConstructor(new Class[] { ReportRequest.class, ReportBean.class }).newInstance( new Object[] { rrequest, rbean }); }catch(Exception e) { throw new WabacusRuntimeException("存放报表"+rbean.getPath()+"数据的类"+pojoClassObj.getClass().getName()+"无法实例化",e); } } public IButtonClickeventGenerate createButtonEventGeneratorObject(String classname,String clickevent,List<String> lstImports) { try { if(clickevent==null||clickevent.trim().equals("")) return null; clickevent=clickevent.trim(); ClassPool pool=new ClassPool(); pool.appendSystemPath(); pool.insertClassPath(new ClassClassPath(ReportAssistant.class)); CtClass cclass=pool.makeClass(Consts.BASE_PACKAGE_NAME+"."+classname+"_Event"); if(lstImports==null) lstImports=new UniqueArrayList<String>(); lstImports.add("com.wabacus.system.buttons"); ClassPoolAssistant.getInstance().addImportPackages(pool,lstImports); cclass.setInterfaces(new CtClass[] { pool.get(IButtonClickeventGenerate.class.getName()) }); CtMethod generateMethod=CtNewMethod.make("public String generateClickEvent("+ReportRequest.class.getName()+" rrequest," +AbsButtonType.class.getName()+" buttonObj){"+clickevent+" \n}",cclass); cclass.addMethod(generateMethod); Class cls=ConfigLoadManager.currentDynClassLoader.loadClass(Consts.BASE_PACKAGE_NAME+"."+classname+"_Event",cclass.toBytecode()); return (IButtonClickeventGenerate)cls.newInstance(); }catch(Exception e) { throw new WabacusConfigLoadingException("生成"+classname+"按钮事件类失败",e); } } public Class buildInterceptorClass(String className,List<String> lstImports,String preaction,String postaction,String saveaction, String saverowaction,String savesqlaction,String beforeloaddata,String afterloaddata,String beforedisplay,String displayperrow, String displaypercol) { try { ClassPool pool=ClassPoolAssistant.getInstance().createClassPool(); CtClass cclass=pool.makeClass(Consts.BASE_PACKAGE_NAME+"."+className+"_Interceptor"); List<String> lstImportsLocal=new UniqueArrayList<String>(); if(lstImports!=null) lstImportsLocal.addAll(lstImports); lstImportsLocal.add("com.wabacus.util"); lstImportsLocal.add("com.wabacus.system"); lstImportsLocal.add("com.wabacus.system.intercept"); lstImportsLocal.add("com.wabacus.config.component.application.report"); lstImportsLocal.add("com.wabacus.system.component.application.report.configbean.editablereport"); lstImportsLocal.add("com.wabacus.system.dataset.update.action.rationaldb"); lstImportsLocal.add("com.wabacus.system.dataset.update.action"); ClassPoolAssistant.getInstance().addImportPackages(pool,lstImportsLocal); cclass.setSuperclass(pool.get(AbsInterceptorDefaultAdapter.class.getName())); StringBuffer tmpBuf=null; if(preaction!=null&&!preaction.trim().equals("")) { tmpBuf=new StringBuffer(); tmpBuf.append("public void doStart("+ReportRequest.class.getName()+" rrequest,"+ReportBean.class.getName()+" rbean) {"); tmpBuf.append(preaction.trim()).append(" \n}"); ClassPoolAssistant.getInstance().addMethod(cclass,tmpBuf.toString()); } if(saveaction!=null&&!saveaction.trim().equals("")) { tmpBuf=new StringBuffer(); tmpBuf.append("public int doSave("+ReportRequest.class.getName()+" rrequest,"+ReportBean.class.getName()+" rbean," +AbsEditableReportEditDataBean.class.getName()+" editbean){"); tmpBuf.append(saveaction.trim()).append(" \n}"); ClassPoolAssistant.getInstance().addMethod(cclass,tmpBuf.toString()); } if(saverowaction!=null&&!saverowaction.trim().equals("")) { tmpBuf=new StringBuffer(); tmpBuf.append("public int doSavePerRow("+ReportRequest.class.getName()+" rrequest,"+ReportBean.class.getName()+" rbean," +Map.class.getName()+" mRowData,"+Map.class.getName()+" mParamValues,"+AbsEditableReportEditDataBean.class.getName() +" editbean){"); tmpBuf.append(saverowaction.trim()).append(" \n}"); ClassPoolAssistant.getInstance().addMethod(cclass,tmpBuf.toString()); } if(savesqlaction!=null&&!savesqlaction.trim().equals("")) { tmpBuf=new StringBuffer(); tmpBuf.append("public int doSavePerAction ("+ReportRequest.class.getName()+" rrequest,"+ReportBean.class.getName()+" rbean," +Map.class.getName()+" mRowData,"+Map.class.getName()+" mParamValues,"+AbsUpdateAction.class.getName()+" action," +AbsEditableReportEditDataBean.class.getName()+" editbean){"); tmpBuf.append(savesqlaction.trim()).append(" \n}"); ClassPoolAssistant.getInstance().addMethod(cclass,tmpBuf.toString()); } if(beforeloaddata!=null&&!beforeloaddata.trim().equals("")) { tmpBuf=new StringBuffer(); tmpBuf.append("public Object beforeLoadData("+ReportRequest.class.getName()+" rrequest,"+ReportBean.class.getName()+" rbean,").append( Object.class.getName()+" typeObj,").append(String.class.getName()).append(" sql){"); tmpBuf.append(beforeloaddata.trim()).append(" \n}"); ClassPoolAssistant.getInstance().addMethod(cclass,tmpBuf.toString()); } if(afterloaddata!=null&&!afterloaddata.trim().equals("")) { tmpBuf=new StringBuffer(); tmpBuf.append("public Object afterLoadData("+ReportRequest.class.getName()+" rrequest,"+ReportBean.class.getName()+" rbean,").append( Object.class.getName()+" typeObj,").append(Object.class.getName()).append(" dataObj){"); tmpBuf.append(afterloaddata.trim()).append(" \n}"); ClassPoolAssistant.getInstance().addMethod(cclass,tmpBuf.toString()); } if(beforedisplay!=null&&!beforedisplay.trim().equals("")) { tmpBuf=new StringBuffer(); tmpBuf.append("public void beforeDisplayReportData("+ReportRequest.class.getName()+" rrequest,"+ReportBean.class.getName()+" rbean," +ReportDataBean.class.getName()+" reportDataBean){"); tmpBuf.append(beforedisplay.trim()).append(" \n}"); ClassPoolAssistant.getInstance().addMethod(cclass,tmpBuf.toString()); } if(displayperrow!=null&&!displayperrow.trim().equals("")) { tmpBuf=new StringBuffer(); tmpBuf.append("public void beforeDisplayReportDataPerRow("+ReportRequest.class.getName()+" rrequest,"+ReportBean.class.getName()+" rbean," +RowDataBean.class.getName()+" rowDataBean){"); tmpBuf.append(displayperrow.trim()).append(" \n}"); ClassPoolAssistant.getInstance().addMethod(cclass,tmpBuf.toString()); } if(displaypercol!=null&&!displaypercol.trim().equals("")) { tmpBuf=new StringBuffer(); tmpBuf.append("public void beforeDisplayReportDataPerCol("+ReportRequest.class.getName()+" rrequest,"+ReportBean.class.getName()+" rbean," +ColDataBean.class.getName()+" colDataBean){"); tmpBuf.append(displaypercol.trim()).append(" \n}"); ClassPoolAssistant.getInstance().addMethod(cclass,tmpBuf.toString()); } if(postaction!=null&&!postaction.equals("")) { tmpBuf=new StringBuffer(); tmpBuf.append("public void doEnd("+ReportRequest.class.getName()+" rrequest,"+ReportBean.class.getName()+" rbean) {"); tmpBuf.append(postaction.trim()).append(" \n}"); ClassPoolAssistant.getInstance().addMethod(cclass,tmpBuf.toString()); } Class c=ConfigLoadManager.currentDynClassLoader.loadClass(Consts.BASE_PACKAGE_NAME+"."+className+"_Interceptor",cclass.toBytecode()); cclass.detach(); pool.clearImportedPackages(); pool=null; return c; }catch(NotFoundException e) { throw new WabacusConfigLoadingException("生成"+className+"拦截器字节码时,执行pool.get()失败",e); }catch(CannotCompileException e) { throw new WabacusConfigLoadingException("生成拦截器"+className+"字节码时无法编译",e); }catch(IOException ioe) { throw new WabacusConfigLoadingException("生成拦截器"+className+"字节码时无法将生成的字节码写到本地文件系统",ioe); } } // /** // * @param sqlbean // */ // List<String> lstCbPropertytemp, String whereclause) // { // whereclause = whereclause.substring("where ".length()); // String conval; // if (val.toLowerCase().equals("and") || val.toLowerCase().equals("or")) // while (val.indexOf("(") == 0) // int idxequals = val.indexOf("="); // + sqlbean.getReportBean().getPath() + "失败,在<update/>中配置的更新语句中条件子句不对"); // conname = val.substring(0,idxequals); // buftmp.append(")"); // whereBuffer.append(conname + "=?"); // if (updatebean != null) // {//条件值为常量,则不用解决此条件子句,直接附在后面即可。 // } // } // whereclause = whereclause.trim(); // tmpval = lst.get(i); // } else // return sbuffer.toString().trim(); public boolean shouldShowThisApplication(IComponentConfigBean applicationBean,ReportRequest rrequest) { if(applicationBean instanceof AbsContainerConfigBean) { throw new WabacusRuntimeException("此方法只能传入应用进行判断,不能传入容器"); } if(applicationBean==null) return false; if(rrequest.getSlaveReportBean()!=null) { if(applicationBean==rrequest.getSlaveReportBean()) return true; return false; } if(applicationBean==rrequest.getRefreshComponentBean()) return true; if(rrequest.getRefreshComponentBean() instanceof AbsContainerConfigBean) { if(((AbsContainerConfigBean)rrequest.getRefreshComponentBean()).isExistChildId(applicationBean.getId(),false,true)) {//如果applicationBean属于这个被刷新的容器,则显示它(即使它是从报表且当前不显示从报表,也要为它显示占位符) return true; } } return false; } public String getColAndConditionDefaultValue(ReportRequest rrequest,String defaultvalue) { if(defaultvalue==null||defaultvalue.trim().equals("")) return ""; if(WabacusAssistant.getInstance().isGetRequestContextValue(defaultvalue)) { return WabacusAssistant.getInstance().getRequestContextStringValue(rrequest,defaultvalue,""); } return defaultvalue.trim(); } // PageBean pbean=rrequest.getPagebean(); //// CacheDataBean cdb=null; // {//只下载一个报表 // if(rbean==null) throw new WabacusRuntimeException("页面"+pbean.getId()+"下不存在id为"+lstExportReportids.get(0)+"的报表,无法为其导出数据"); //// IComponentType typeObjTmp=rrequest.getComponentTypeObj(rbean,null,false); //// if(typeObjTmp!=null) cdb=rrequest.getCdb(rbean.getId());//如果本报表参与了本次显示 // /** // */ // boolean isAllNonDisplayPermission=true;//本次导出的所有报表是否都没有相应类型的导出链接的显示权限 // { // if(!rrequest.checkPermission(reportidTmp,Consts.BUTTON_PART,"type{"+exporttype+"}",Consts.PERMISSION_TYPE_DISPLAY)) continue;//没有显示权限 // {//此报表的此权限不是禁用 // } // if(isAllNonDisplayPermission) return "";//如果本次导出的所有报表都没有显示此类型数据导出功能的权限 // {//不是所有报表都禁用这种类型的导出 // String exporturl=null; // { // {//Consts.DATAEXPORT_RICHEXCEL // if(rbean!=null&&rbean.getDbean().isColselect()) // {//当前只下载一个参与本次显示的报表,且此报表需要提供列动态选择框 // String width=rbean.getDbean().getColselectwidth(); // if(!width.equals("")) // paramsBuf.append(",showreport_dataexport_url:\"").append(exporturl).append("\""); // clickevent="createTreeObjHtml(this,'"+Tools.jsParamEncode(paramsBuf.toString())+"',event);";//注意这个方法的第二个参数pageid必须为空,因为在此方法中要据此判断当前是在做下载Excel还是刷新页面的操作 // {//下载多个报表,或下载的一个报表不参与本次显示,或虽参与本次显示,但不需要提供动态列选择框,直接下载当前页面显示的数据 // //clickevent="postlinkurl('"+url+"',true);"; // } // {//客户端提供了显示的label // resultBuf.append(label); // resultBuf.append("</a>"); // label=rrequest.getI18NStringValue((Config.getInstance().getResources() // .getString(pbean,Consts.RICHEXCEL_LABEL,true)).trim()); // }else // .append("\""); // public String getDataImportLinkAndLabel(ReportRequest rrequest,ReportBean rbean,String label) // if(!rrequest.checkPermission(rbean.getId(),Consts.BUTTON_PART,"type{"+Consts.IMPORT_DATA+"}",Consts.PERMISSION_TYPE_DISABLED)) // {//如果不是禁用 // int winwidth=rbean.getDataimportwidth(); // int winheight=rbean.getDataimportheight(); // clickevent="ymPrompt.win('"+serverurl+"',"+winwidth+","+winheight+",'上传数据文件',null,null,null,true);"; // {//客户端提供了显示的label // resultBuf.append(label); // resultBuf.append("</a>"); // resultBuf.append("<input type=\"button\" class=\"cls-button2\" onClick=\"try{"+clickevent+"}catch(e){logErrorsAsJsFileLoad(e);}\""); // /** // * 获取某报表的点击搜索按钮时的提交URL // */ // List<ConditionBean> lstConditions=rbean.getSbean().getLstConditions(); // /** // */ // boolean hasCondtionWithInputBox=false;//是否有带输入框的查询条件 // resultBuf.append(",conditions:["); // resultBuf.append("{conname:\"").append(cbeanTmp.getName()).append("\","); // /**************临时删除*************if(cbeanTmp.getLstConditionValuesBean().size()>1) // {//此条件有多个条件表达式供选择 // }*********************/ // if(resultBuf.charAt(resultBuf.length()-1)==',') // hasCondtionWithInputBox=true; // resultBuf.deleteCharAt(resultBuf.length()-1); public String getColSelectedLabelAndEvent(ReportRequest rrequest,ReportBean rbean,boolean isListReport,String position) { StringBuilder paramsBuf=new StringBuilder(); paramsBuf.append("{reportguid:\"").append(rbean.getGuid()).append("\""); paramsBuf.append(",skin:\"").append(rrequest.getPageskin()).append("\""); paramsBuf.append(",webroot:\"").append(Config.webroot).append("\""); paramsBuf.append(",width:").append(rbean.getDbean().getColselectwidth()); paramsBuf.append(",maxheight:").append(rbean.getDbean().getColselectmaxheight()); paramsBuf.append("}"); StringBuilder resultBuf=new StringBuilder(); String imgname=DisplayBean.COLSELECT_LEFT.equalsIgnoreCase(position)?"selectcolsleft.gif":"selectcols.gif"; resultBuf.append("<img src=\""+Config.webroot+"webresources/skin/"+rrequest.getPageskin()+"/images/coltitle_selected/"+imgname+"\""); if(isListReport) { resultBuf.append(" class=\"" +(DisplayBean.COLSELECT_LEFT.equalsIgnoreCase(position)?"colSelectedLabel_leftimg":"colSelectedLabel_rightimg")+"\"");//这种报表类型的列选择框是浮在最右边的,所以要加上此样式 }else { resultBuf.append(" style=\"cursor:pointer;\""); } resultBuf.append(" onclick=\""); resultBuf.append("try{createTreeObjHtml(this,'"+Tools.jsParamEncode(paramsBuf.toString())+"',event);}catch(e){logErrorsAsJsFileLoad(e);}\">"); return resultBuf.toString(); } public String getNavigatePagenoWithEvent(ReportRequest rrequest,ReportBean rbean,int pageno,String label) { StringBuilder resultBuf=new StringBuilder(); resultBuf.append("<span class=\"cls-navigate-label\" onmouseover=\"this.style.cursor='pointer';\" onclick=\"try{navigateReportPage('"); resultBuf.append(rbean.getPageBean().getId()).append("','"); resultBuf.append(rbean.getId()).append("','"); resultBuf.append(pageno).append("');}catch(e){logErrorsAsJsFileLoad(e);}"); resultBuf.append("\">").append(label).append("</span>"); return resultBuf.toString(); } public String getNavigateTextBox(ReportRequest rrequest,ReportBean rbean) { CacheDataBean cdb=rrequest.getCdb(rbean.getId()); int pagecount=cdb.getPagecount(); int pageno=cdb.getFinalPageno(); boolean isReadonly=false; if(rrequest.checkPermission(rbean.getId(),Consts.NAVIGATE_PART,Consts_Private.NAVIGATE_PAGENO,Consts.PERMISSION_TYPE_DISABLED)) { isReadonly=true; } String strpageno=String.valueOf(pagecount).trim(); int width=strpageno.length()*10; if(width<30) width=30; String dynstyleproperty="style=\"width:"+width+"px;\""; if(!isReadonly&&pagecount>1) { StringBuffer blurEventBuf=new StringBuffer(); blurEventBuf.append("if(isPositiveInteger(this.value)&&parseInt(this.value,10)!=").append(pageno).append("){"); blurEventBuf.append("if(parseInt(this.value,10)>").append(pagecount).append(") this.value='").append(pagecount).append("';"); blurEventBuf.append("try{navigateReportPage('"); blurEventBuf.append(rbean.getPageBean().getId()).append("','"); blurEventBuf.append(rbean.getId()).append("',this.value);}catch(e){logErrorsAsJsFileLoad(e);}"); blurEventBuf.append("}"); dynstyleproperty=dynstyleproperty+" onblur=\""+blurEventBuf.toString()+"\""; } AbsInputBox box=Config.getInstance().getInputBoxByType(TextBox.class); return box.getIndependentDisplayString(rrequest,String.valueOf(pageno),dynstyleproperty,null,isReadonly); } public String getNavigateSelectBox(ReportRequest rrequest,ReportBean rbean) { CacheDataBean cdb=rrequest.getCdb(rbean.getId()); int pagecount=cdb.getPagecount(); int pageno=cdb.getFinalPageno(); boolean isDisabled=false; if(rrequest.checkPermission(rbean.getId(),Consts.NAVIGATE_PART,Consts_Private.NAVIGATE_PAGENO,Consts.PERMISSION_TYPE_DISABLED)) {//如果是禁用 isDisabled=true; } String dynstyleproperty="name=\""+rbean.getGuid()+"_SELEPAGENUM\""; if(!isDisabled&&pagecount>1) { StringBuffer onchangeEventBuf=new StringBuffer(); onchangeEventBuf.append("try{navigateReportPage('"); onchangeEventBuf.append(rbean.getPageBean().getId()).append("','"); onchangeEventBuf.append(rbean.getId()).append("',this.options[this.options.selectedIndex].value);}catch(e){logErrorsAsJsFileLoad(e);}"); dynstyleproperty=dynstyleproperty+" onchange=\""+onchangeEventBuf.toString()+"\""; } List<String[]> lstOptionsResult=new ArrayList<String[]>(); if(pagecount<=0) { lstOptionsResult.add(new String[] { String.valueOf(0), String.valueOf(0) }); }else { for(int j=1;j<=pagecount;j++) { lstOptionsResult.add(new String[] { String.valueOf(j), String.valueOf(j) }); } } AbsInputBox box=Config.getInstance().getInputBoxByType(SelectBox.class); return box.getIndependentDisplayString(rrequest,String.valueOf(pageno),dynstyleproperty,lstOptionsResult,isDisabled); } public String getNavigateSelectBoxForPagesizeConvert(ReportRequest rrequest, ReportBean rbean) { AbsListReportBean alrbean=(AbsListReportBean)rbean.getExtendConfigDataForReportType(AbsListReportType.KEY); if(alrbean==null) return ""; CacheDataBean cdb=rrequest.getCdb(rbean.getId()); int currentpagesize=cdb.getPagesize(); boolean isDisabled=false; if(rrequest.checkPermission(rbean.getId(),Consts.NAVIGATE_PART,Consts_Private.NAVIGATE_PAGESIZE,Consts.PERMISSION_TYPE_DISABLED)) { isDisabled=true; } StringBuffer onchangeEventBuf=new StringBuffer(); onchangeEventBuf.append("var url=getComponentUrl('").append(rbean.getPageBean().getId()).append("','"); onchangeEventBuf.append(rbean.getRefreshGuid()).append("','"); if(rbean.isSlaveReportDependsonListReport()) { onchangeEventBuf.append(rbean.getId()); } onchangeEventBuf.append("');"); onchangeEventBuf.append("url=replaceUrlParamValue(url,'").append(rbean.getId()).append("_PREV_PAGESIZE','"+currentpagesize+"');"); onchangeEventBuf.append("url=replaceUrlParamValue(url,'").append(rbean.getId()).append( "_PAGESIZE',this.options[this.options.selectedIndex].value);"); onchangeEventBuf.append("refreshComponent(url);"); List<String[]> lstOptionsResult=new ArrayList<String[]>(); List<Integer> lstPagesizeTmp=rbean.getLstPagesize(); String alldata_label="";//不分页时页大小切换下拉框显示的label if(lstPagesizeTmp.contains(-1)) { alldata_label=rrequest.getI18NStringValue((Config.getInstance().getResources().getString(rrequest,rbean.getPageBean(), Consts.NAVIGATE_ALLDATA_LABEL,true)).trim()); } boolean isExistCurrentPagesizeOption=false; String labelTmp; for(int i=0;i<lstPagesizeTmp.size();i++) { labelTmp=lstPagesizeTmp.get(i)==-1?alldata_label:String.valueOf(lstPagesizeTmp.get(i)); lstOptionsResult.add(new String[] { labelTmp, String.valueOf(lstPagesizeTmp.get(i)) }); if(currentpagesize==lstPagesizeTmp.get(i)) isExistCurrentPagesizeOption=true; } if(!isExistCurrentPagesizeOption) lstOptionsResult.add(0,new String[] { String.valueOf(currentpagesize), String.valueOf(currentpagesize) }); AbsInputBox box=Config.getInstance().getInputBoxByType(SelectBox.class); return box.getIndependentDisplayString(rrequest,String.valueOf(currentpagesize),"onchange=\""+onchangeEventBuf.toString()+"\"", lstOptionsResult,isDisabled); } }