/*
* 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.util.List;
import javassist.CannotCompileException;
import javassist.ClassClassPath;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.NotFoundException;
import com.wabacus.config.Config;
import com.wabacus.config.ConfigLoadManager;
import com.wabacus.config.OnloadMethodBean;
import com.wabacus.config.component.IComponentConfigBean;
import com.wabacus.config.component.application.report.ReportBean;
import com.wabacus.config.component.container.page.PageBean;
import com.wabacus.config.template.TemplateBean;
import com.wabacus.config.template.tags.AbsTagInTemplate;
import com.wabacus.exception.WabacusConfigLoadingException;
import com.wabacus.system.ReportRequest;
import com.wabacus.system.buttons.AbsButtonType;
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 ComponentAssistant
{
private final static ComponentAssistant instance=new ComponentAssistant();
protected ComponentAssistant()
{}
public static ComponentAssistant getInstance()
{
return instance;
}
public void validComponentHeaderTpl(IComponentConfigBean ccbean,TemplateBean tplBean)
{
if(tplBean==null) return;
if(tplBean.getLstTagChildren()==null) return;
for(AbsTagInTemplate tagObjTmp:tplBean.getLstTagChildren())
{
if(Consts_Private.TAGNAME_HEADER.equals(tagObjTmp.getTagname()))
{//如果是用在header中的模板,不能在模板内容中出现<wx:header/>
throw new WabacusConfigLoadingException("报表"+ccbean.getPath()+"的header的模板内容包括<wx:header/>,导致死循环");
}
}
}
public void validComponentFooterTpl(IComponentConfigBean ccbean,TemplateBean tplBean)
{
if(tplBean==null) return;
if(tplBean.getLstTagChildren()==null) return;
for(AbsTagInTemplate tagObjTmp:tplBean.getLstTagChildren())
{
if(Consts_Private.TAGNAME_FOOTER.equals(tagObjTmp.getTagname()))
{//如果是用在footer中的模板,不能在模板内容中出现<wx:footer/>
throw new WabacusConfigLoadingException("组件"+ccbean.getPath()+"的footer的模板内容包括<wx:footer/>,导致死循环");
}
}
}
public void doPostLoadForComponentScroll(IComponentConfigBean ccbean,boolean showScrollX,boolean showScrollY,String scrollWidth,String scrollHeight,
String scrollstyle)
{
if(!Consts_Private.SCROLLSTYLE_IMAGE.equals(scrollstyle)) return;
if(!showScrollX&&!showScrollY) return;
String scrolljs="/webresources/script/wabacus_scroll.js";
// {
// scrolljs="/webresources/script/wabacus_scroll.js";
// {
// scrolljs="/webresources/script/"+encode.toLowerCase()+"/wabacus_scroll.js";
scrolljs=Config.webroot+"/"+scrolljs;
scrolljs=Tools.replaceAll(scrolljs,"//","/");
ccbean.getPageBean().addMyJavascriptFile(scrolljs,-1);
String css=Config.webroot+"/webresources/skin/"+Consts_Private.SKIN_PLACEHOLDER+"/wabacus_scroll.css";
css=Tools.replaceAll(css,"//","/");
ccbean.getPageBean().addMyCss(css);
if(showScrollX&&showScrollY)
{//显示纵横滚动条
ccbean.addOnloadMethod(new OnloadMethodBean(Consts_Private.ONlOAD_IMGSCROLL,"showComponentScroll('"+ccbean.getGuid()+"','"+scrollHeight
+"',23)"));
}else if(showScrollX)
{
ccbean.addOnloadMethod(new OnloadMethodBean(Consts_Private.ONlOAD_IMGSCROLL,"showComponentScroll('"+ccbean.getGuid()+"','-1',22)"));
}else if(showScrollY)
{
ccbean.addOnloadMethod(new OnloadMethodBean(Consts_Private.ONlOAD_IMGSCROLL,"showComponentScroll('"+ccbean.getGuid()+"','"+scrollHeight
+"',21)"));
}
}
public String showComponentScrollStartPart(IComponentConfigBean ccbean,boolean showScrollX,boolean showScrollY,String scrollWidth,String scrollHeight,
String scrollstyle)
{
if(!showScrollX&&!showScrollY) return "";
StringBuffer resultBuf=new StringBuffer();
if(Consts_Private.SCROLLSTYLE_NORMAL.equals(scrollstyle))
{
resultBuf.append("<div><div onmouseover=\"this.style.height='100%'\" style=\"margin:0;");
if(showScrollX)
{//要显示横向滚动条
resultBuf.append("width:").append(scrollWidth).append(";overflow-x:auto;");
}else
{
resultBuf.append("width:100%;overflow-x:hidden;");
}
if(showScrollY)
{
resultBuf.append("max-height:").append(scrollHeight).append(";overflow-y:auto;");
resultBuf.append("height:expression(this.scrollHeight>parseInt('").append(scrollHeight).append("')?'").append(scrollHeight).append(
"':'auto');");
}else
{
resultBuf.append("overflow-y:hidden;");
}
resultBuf.append("\">");
}else
{
resultBuf.append("<div id=\"scroll_").append(ccbean.getGuid()).append("\"");
resultBuf.append(" style=\"overflow-x:hidden;overflow-y:hidden;margin:0;");
if(showScrollX)
{
resultBuf.append("width:").append(scrollWidth).append(";");
}
resultBuf.append("\">");
}
return resultBuf.toString();
}
public String showComponentScrollEndPart(String scrollstyle,boolean showScrollX,boolean showScrollY)
{
if(!showScrollX&&!showScrollY) return "";
if(Consts_Private.SCROLLSTYLE_NORMAL.equals(scrollstyle))
{//显示普通滚动条
return "</div></div>";
}else
{
return "</div>";
}
}
public Class buildPageInterceptorClass(PageBean pbean,List<String> lstImports,String preaction,String beforesaveaction,String aftersaveaction,String postaction)
{
try
{
ClassPool pool=new ClassPool();
pool.appendSystemPath();
pool.insertClassPath(new ClassClassPath(ComponentAssistant.class));
String classname=Consts.BASE_PACKAGE_NAME+".Page_"+pbean.getId()+"_Interceptor";
CtClass pt=pool.makeClass(classname);
if(lstImports==null) lstImports=new UniqueArrayList<String>();
lstImports.add("com.wabacus.system.intercept");
ClassPoolAssistant.getInstance().addImportPackages(pool,lstImports);
pt.setSuperclass(pool.get(AbsPageInterceptor.class.getName()));
preaction=preaction==null?"":preaction.trim();
postaction=postaction==null?"":postaction.trim();
beforesaveaction=beforesaveaction==null?"":beforesaveaction.trim();
aftersaveaction=aftersaveaction==null?"":aftersaveaction.trim();
StringBuffer sbuffer=new StringBuffer();
sbuffer.append("public void doStart("+ReportRequest.class.getName()+" rrequest) {").append(preaction).append(" \n}");
CtMethod preMethod=CtNewMethod.make(sbuffer.toString(),pt);
pt.addMethod(preMethod);
sbuffer=new StringBuffer();
sbuffer.append("public void doStartSave("+ReportRequest.class.getName()+" rrequest,"+List.class.getName()+" lstSaveReportBeans) {").append(beforesaveaction).append(" \n}");
CtMethod beforeSaveMethod=CtNewMethod.make(sbuffer.toString(),pt);
pt.addMethod(beforeSaveMethod);
sbuffer=new StringBuffer();
sbuffer.append("public void doEndSave("+ReportRequest.class.getName()+" rrequest,"+List.class.getName()+" lstSaveReportBeans) {").append(aftersaveaction).append(" \n}");
CtMethod afterSaveMethod=CtNewMethod.make(sbuffer.toString(),pt);
pt.addMethod(afterSaveMethod);
sbuffer=new StringBuffer();
sbuffer.append("public void doEnd("+ReportRequest.class.getName()+" rrequest) {").append(postaction).append(" \n}");
CtMethod postMethod=CtNewMethod.make(sbuffer.toString(),pt);
pt.addMethod(postMethod);
Class c=ConfigLoadManager.currentDynClassLoader.loadClass(classname,pt.toBytecode());
pt.detach();
pool.clearImportedPackages();
pool=null;
return c;
}catch(NotFoundException e)
{
throw new WabacusConfigLoadingException("为页面"+pbean.getId()+"生成拦截器字节码时,执行pool.get()失败",e);
}catch(CannotCompileException e)
{
throw new WabacusConfigLoadingException("为页面"+pbean.getId()+"生成拦截器字节码时无法编译",e);
}catch(IOException ioe)
{
throw new WabacusConfigLoadingException("为页面"+pbean.getId()+"生成拦截器字节码时无法将生成的字节码写到本地文件系统",ioe);
}
}
public List<String> initDisplayCss(ReportRequest rrequest)
{
List<String> lstCsses=new UniqueArrayList<String>();
String css=rrequest.getStringAttribute("CSS","");
if(!css.equals(""))
{
css=Tools.htmlEncode(css);
List<String> lstCssesTmp=Tools.parseStringToList(css,",",false);
String[] cssArray=lstCssesTmp.toArray(new String[lstCssesTmp.size()]);
for(int k=0;k<cssArray.length;k++)
{
if(cssArray[k]==null||cssArray[k].trim().equals("")) continue;
cssArray[k]=Config.webroot+"/"+cssArray[k];
cssArray[k]=Tools.replaceAll(cssArray[k],"//","/");
lstCsses.add(Tools.replaceAll(cssArray[k],Consts_Private.SKIN_PLACEHOLDER,rrequest.getPageskin()));
}
}
if(lstCsses.size()==0&&rrequest.getPagebean().getUlstMyCss()!=null)
{
for(String cssTmp:rrequest.getPagebean().getUlstMyCss())
{
lstCsses.add(Tools.replaceAll(cssTmp,Consts_Private.SKIN_PLACEHOLDER,rrequest.getPageskin()));
}
}
List<String> lstSystemCss=rrequest.getPagebean().getUlstSystemCss();
if(lstSystemCss!=null)
{
for(String cssTmp:lstSystemCss)
{
lstCsses.add(Tools.replaceAll(cssTmp,Consts_Private.SKIN_PLACEHOLDER,rrequest.getPageskin()));
}
}
return lstCsses;
}
public String showButton(IComponentConfigBean ccbean,AbsButtonType buttonObj,ReportRequest rrequest,String dynclickevent)
{
if(ccbean instanceof ReportBean && buttonObj.isReferedHiddenButton()) return "";
if(buttonObj.getReferedButtonObj()==null) return buttonObj.showButton(rrequest,dynclickevent);
return buttonObj.getReferedButtonObj().showButton(rrequest,dynclickevent);
}
public String showButton(IComponentConfigBean ccbean,AbsButtonType buttonObj,ReportRequest rrequest,String dynclickevent,String button)
{
if(ccbean instanceof ReportBean && buttonObj.isReferedHiddenButton()) return "";//如果当前按钮属于报表,且被容器引用显示,并不在源报表处显示
if(buttonObj.getReferedButtonObj()==null) return buttonObj.showButton(rrequest,dynclickevent,button);
return buttonObj.getReferedButtonObj().showButton(rrequest,dynclickevent,button);
}
public String showButtonMenu(IComponentConfigBean ccbean,AbsButtonType buttonObj,ReportRequest rrequest,String dynclickevent)
{
if(ccbean instanceof ReportBean && buttonObj.isReferedHiddenButton()) return "";
if(buttonObj.getReferedButtonObj()==null) return buttonObj.showMenu(rrequest,dynclickevent);
return buttonObj.getReferedButtonObj().showMenu(rrequest,dynclickevent);
}
public String getDataExportTypeByShowType(int showtype)
{
if(showtype==Consts.DISPLAY_ON_PLAINEXCEL) return Consts.DATAEXPORT_PLAINEXCEL;
if(showtype==Consts.DISPLAY_ON_RICHEXCEL) return Consts.DATAEXPORT_RICHEXCEL;
if(showtype==Consts.DISPLAY_ON_WORD) return Consts.DATAEXPORT_WORD;
if(showtype==Consts.DISPLAY_ON_PDF) return Consts.DATAEXPORT_PDF;
return null;
}
}