/* * 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.inputbox.validate; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.codehaus.jackson.map.ObjectMapper; import com.wabacus.config.Config; import com.wabacus.exception.WabacusConfigLoadingException; import com.wabacus.exception.WabacusRuntimeException; import com.wabacus.system.ReportRequest; import com.wabacus.system.inputbox.AbsInputBox; import com.wabacus.util.Consts; import com.wabacus.util.Tools; public class ServerValidateBean extends AbsValidateBean { private List<ServerValidateMethod> lstValidateMethods; private String servervalidateCallback; public ServerValidateBean(AbsInputBox owner) { super(owner); } public String getServervalidateCallback() { return servervalidateCallback; } public void setServervalidateCallback(String servervalidateCallback) { this.servervalidateCallback=servervalidateCallback; } public List<ServerValidateMethod> getLstValidateMethods() { return lstValidateMethods; } protected String getJsonStringQuote() { return "\""; } public void addServerValidateMethod(String methodname,String configParams) { if(methodname==null||methodname.trim().equals("")) return; if(lstValidateMethods==null) lstValidateMethods=new ArrayList<ServerValidateMethod>(); Object[] validateObjsArr=getServerValidateClassMethod(methodname); this.lstValidateMethods.add(new ServerValidateMethod((Class)validateObjsArr[0],(Method)validateObjsArr[1])); parseConfigValidateMethodParams(methodname,configParams); } private Object[] getServerValidateClassMethod(String methodname) { Object[] validateObjsArr=getServerValidateClassMethod(methodname,owner.getOwner().getReportBean().getLstServerValidateClasses()); if(validateObjsArr==null) validateObjsArr=getServerValidateClassMethod(methodname,Config.getInstance().getLstServerValidateClasses()); if(validateObjsArr==null) { throw new WabacusConfigLoadingException("加载报表"+this.owner.getOwner().getReportBean().getPath()+"失败,在所有服务器端校验类中没有找到服务器端校验方法:"+methodname +"(ReportRequest,String,Map,List)的定义"); } return validateObjsArr; } private Object[] getServerValidateClassMethod(String methodname,List<Class> lstServerValidateClasses) { if(Tools.isEmpty(methodname)||Tools.isEmpty(lstServerValidateClasses)) return null; Method mTmp; for(Class cTmp:lstServerValidateClasses) { try { mTmp=cTmp.getMethod(methodname,new Class[] { ReportRequest.class, String.class, Map.class, List.class }); }catch(NoSuchMethodException nse) { continue; } if(mTmp!=null) return new Object[] { cTmp, mTmp }; } return null; } public boolean validate(ReportRequest rrequest,String boxvalue,Map<String,String> mOtherValues,List<String> lstErrorMessages, StringBuilder oblurErrorPromptParamsBuf) { if(this.lstValidateMethods==null||this.lstValidateMethods.size()==0) return true; if(oblurErrorPromptParamsBuf!=null&&AbsInputBox.VALIDATE_TYPE_ONSUBMIT.equals(validatetype)||oblurErrorPromptParamsBuf==null&&AbsInputBox.VALIDATE_TYPE_ONBLUR.equals(validatetype)) { return true; } boolean isSuccess=true; ParamBean errormessParamBeanTmp, methodParamsBeanTmp; Map<String,Object> mParamValues=new HashMap<String,Object>(); mParamValues.putAll(mOtherValues); for(ServerValidateMethod validateMethodTmp:this.lstValidateMethods) { lstErrorMessages.clear();//清除掉以前校验方法的校验出错信息 errormessParamBeanTmp=mParamBeans!=null?mParamBeans.get(validateMethodTmp.getValidateMethod().getName()+"_errormessage"):null; if(errormessParamBeanTmp!=null) { String errormess=errormessParamBeanTmp.getRealParamValue(rrequest); if(!Tools.isEmpty(errormess)) { errormess=Tools.replaceAll(errormess,"#label#",owner.getOwner().getLabel(rrequest)); errormess=Tools.replaceAll(errormess,"#data#",boxvalue); lstErrorMessages.add(errormess); } } methodParamsBeanTmp=mParamBeans!=null?mParamBeans.get(validateMethodTmp.getValidateMethod().getName()+"_methodparams"):null; if(methodParamsBeanTmp!=null) { String methodParamsJson=methodParamsBeanTmp.getRealParamValue(rrequest); if(!Tools.isEmpty(methodParamsJson)) { ObjectMapper mapper=new ObjectMapper(); try { mParamValues.put(validateMethodTmp.getValidateMethod().getName()+"_methodparams",mapper.readValue(methodParamsJson,methodParamsJson .trim().startsWith("[")?List.class:Map.class)); }catch(Exception e) { throw new WabacusRuntimeException("对报表"+owner.getOwner().getReportBean().getPath()+"的输入框"+owner.getOwner().getInputBoxId() +"的数据"+boxvalue+"进行服务器端校验时失败,配置的json参数"+methodParamsJson+"不是有效格式的json字符串,无法转换成JAVA对象",e); } } } if(!validateMethodTmp.validate(rrequest,boxvalue,mParamValues,lstErrorMessages)) { isSuccess=false; ParamBean tiparamsBeanTmp=mParamBeans!=null?mParamBeans.get(validateMethodTmp.getValidateMethod().getName()+"_tiparams"):null; if(tiparamsBeanTmp!=null&&oblurErrorPromptParamsBuf!=null) { String tiparamValues=tiparamsBeanTmp.getRealParamValue(rrequest); if(!Tools.isEmpty(tiparamValues)) oblurErrorPromptParamsBuf.append(tiparamValues); } break; } } if(oblurErrorPromptParamsBuf==null&&!isSuccess) { StringBuilder errormsgBuf=new StringBuilder(); for(String errormsgTmp:lstErrorMessages) { if(errormsgTmp==null||errormsgTmp.trim().equals("")) continue; errormsgBuf.append(errormsgTmp).append(";"); } if(errormsgBuf.length()>0&&errormsgBuf.charAt(errormsgBuf.length()-1)==';') errormsgBuf.deleteCharAt(errormsgBuf.length()-1); if(this.servervalidateCallback!=null&&!this.servervalidateCallback.trim().equals("")) {//需要执行客户端回调函数 StringBuilder paramsBuf=new StringBuilder(); paramsBuf.append("{inputboxid:\"").append(this.owner.getOwner().getInputBoxId()).append("\""); paramsBuf.append(",value:\"").append(boxvalue).append("\""); paramsBuf.append(",errormess:\"").append(errormsgBuf.toString()).append("\""); paramsBuf.append(",validatetype:\"onsubmit\""); paramsBuf.append(",isSuccess:false"); paramsBuf.append(",serverDataObj:{"); if(rrequest.getMServerValidateDatas()!=null&&rrequest.getMServerValidateDatas().size()>0) { for(Entry<String,String> entryTmp:rrequest.getMServerValidateDatas().entrySet()) { paramsBuf.append(entryTmp.getKey()+":\""+entryTmp.getValue()+"\","); } if(paramsBuf.charAt(paramsBuf.length()-1)==',') paramsBuf.deleteCharAt(paramsBuf.length()-1); } paramsBuf.append("}}"); rrequest.getWResponse().addOnloadMethod(this.servervalidateCallback,paramsBuf.toString(),true,Consts.STATECODE_FAILED); } rrequest.getWResponse().setStatecode(Consts.STATECODE_FAILED); if(errormsgBuf.toString().trim().equals("")) { rrequest.getWResponse().terminateResponse(); }else { rrequest.getWResponse().getMessageCollector().warn(errormsgBuf.toString(),null,true); } } return isSuccess; } private class ServerValidateMethod { private Class validateClass; private Method validateMethod; public ServerValidateMethod(Class validateClass,Method validateMethod) { this.validateClass=validateClass; this.validateMethod=validateMethod; } public Method getValidateMethod() { return validateMethod; } public boolean validate(ReportRequest rrequest,String boxvalue,Map<String,Object> mParamValues,List<String> lstErrorMessages) { try { return (Boolean)this.validateMethod.invoke(this.validateClass,new Object[] { rrequest, boxvalue, mParamValues, lstErrorMessages }); }catch(Exception e) { throw new WabacusRuntimeException("对报表"+owner.getOwner().getReportBean().getPath()+"的输入框"+owner.getOwner().getInputBoxId()+"的数据" +boxvalue+"进行服务器端校验时失败",e); } } } }