/*
* 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;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Map.Entry;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import com.wabacus.config.component.ComponentConfigLoadManager;
import com.wabacus.config.component.application.report.ReportBean;
import com.wabacus.config.component.container.page.PageBean;
import com.wabacus.config.database.datasource.AbsDataSource;
import com.wabacus.config.database.datasource.DriverManagerDataSource;
import com.wabacus.config.other.JavascriptFileBean;
import com.wabacus.config.resource.AbsResource;
import com.wabacus.config.resource.Resources;
import com.wabacus.config.resource.StringRes;
import com.wabacus.config.xml.XmlAssistant;
import com.wabacus.config.xml.XmlElementBean;
import com.wabacus.exception.WabacusConfigLoadingException;
import com.wabacus.system.assistant.FilePathAssistant;
import com.wabacus.system.assistant.JavaScriptAssistant;
import com.wabacus.system.assistant.WabacusAssistant;
import com.wabacus.system.commoninterface.IListReportRoworderPersistence;
import com.wabacus.system.commoninterface.IPagePersonalizePersistence;
import com.wabacus.system.commoninterface.IReportPersonalizePersistence;
import com.wabacus.system.component.AbsComponentType;
import com.wabacus.system.component.application.report.abstractreport.AbsReportType;
import com.wabacus.system.component.application.report.abstractreport.IReportType;
import com.wabacus.system.component.container.AbsContainerType;
import com.wabacus.system.dataset.select.common.AbsCommonDataSetValueProvider;
import com.wabacus.system.dataset.select.report.value.AbsReportDataSetValueProvider;
import com.wabacus.system.dataset.update.AbsUpdateActionProvider;
import com.wabacus.system.datatype.IDataType;
import com.wabacus.system.inputbox.AbsInputBox;
import com.wabacus.system.intercept.AbsPageInterceptor;
import com.wabacus.util.Consts;
import com.wabacus.util.DesEncryptTools;
import com.wabacus.util.Tools;
import com.wabacus.util.UniqueArrayList;
import com.wabacus.util.WabacusClassLoader;
public class ConfigLoadManager
{
private static Log log=LogFactory.getLog(ConfigLoadManager.class);
public static WabacusClassLoader currentDynClassLoader;
public static Map<String,PageBean> mAllPagesConfig;
public static Map<String,List<String>> mAllPageChildIds;//加载配置文件时,存放每个<page/>中的所有子组件ID,以便校验每个<page/>中是否存在重复ID的组件
public static List<ReportBean> lstExtendReports;
public static Map<String,XmlElementBean> mAllXmlTagObjects;//存放所有<report/>及以下标签配置对象对应的配置标签
public static int loadAllReportSystemConfigs()
{
try
{
Config.getInstance().initConfigLoad();
loadSystemItemConfig();//加载wabacus.cfg.default.xml/wabacus.cfg.xml中<system/>所有<item/>的配置
DesEncryptTools.initEncryptKey();
encryptDatasourcePassword();
loadBuildInDefaultSystemConfig();//加载内置的系统配置
Document doc=XmlAssistant.getInstance().loadXmlDocument("wabacus.cfg.xml");
Element root=doc.getRootElement();
if(root==null) return 0;
Element eleDatasources=XmlAssistant.getInstance().getSingleElementByName(root,"datasources");
if(eleDatasources==null)
{
throw new WabacusConfigLoadingException("没有配置报表数据源<datasources/>");
}
loadDataSources(eleDatasources);
loadBuildInDefaultResources();
loadGlobalPageInterceptors(root.element("global-interceptors"));
Element eleI18nResources=root.element("i18n-resources");
if(eleI18nResources!=null)
{
loadI18nResources(eleI18nResources);
}
loadGlobeResources(root);
Config.getInstance().getResources().replacePlaceHolderInStringRes();
Config.getInstance().addGlobalCss(loadCssfiles(root.element("global-cssfiles")));
List<JavascriptFileBean> lstJsFiles=new UniqueArrayList<JavascriptFileBean>();
lstJsFiles.addAll(loadJsfiles(root.element("global-jsfiles")));
lstJsFiles.addAll(ConfigLoadAssistant.getInstance().getLstPopupComponentJs());
lstJsFiles.add(new JavascriptFileBean(Tools.replaceAll(Config.webroot+"/wxtmpfiles/js/generate_system.js","//","/"),0));
Config.getInstance().setLstGlobalJavascriptFiles(lstJsFiles);
Config.getInstance().addGlobalCss(ConfigLoadAssistant.getInstance().getLstPopupComponentCss());
Config.getInstance().setMLocalCss(new HashMap<String,List<String>>());
Config.getInstance().setMLocalJavascriptFiles(new HashMap<String,List<JavascriptFileBean>>());
loadInputBoxTypesConfig(root);
loadDataTypesConfig(root);
loadContainerTypesConfig(root);
loadReportTypesConfig(root);//加载报表配置文件
loadReportDatasetvalueProviders(root);
loadCommonDatasetvalueProviders(root);
loadUpdateDatasetvalueProviders(root);
createSystemJS();
mAllXmlTagObjects=new HashMap<String,XmlElementBean>();
mAllPagesConfig=new HashMap<String,PageBean>();
mAllPageChildIds=new HashMap<String,List<String>>();
lstExtendReports=new ArrayList<ReportBean>();
loadReportConfigFiles(root);
if(lstExtendReports!=null&&lstExtendReports.size()>0)
{
while(lstExtendReports.size()>0)
{
List<ReportBean> lstTemp=new ArrayList<ReportBean>();
ReportBean rbeanTemp;
ReportBean rbeanParent;
for(int i=0;i<lstExtendReports.size();i++)
{
rbeanTemp=lstExtendReports.get(i);
if(rbeanTemp==null) continue;
XmlElementBean eleReportBean=rbeanTemp.getEleReportBean();
if(eleReportBean==null)
{
throw new WabacusConfigLoadingException("加载报表"+rbeanTemp.getPath()+"失败");
}
String reportextends=eleReportBean.attributeValue("extends");
rbeanParent=ComponentConfigLoadManager.getReportBeanByPath(reportextends);
if(rbeanParent==null)
{
throw new WabacusConfigLoadingException("报表"+rbeanTemp.getPath()+"配置"+"继承的报表"+reportextends+"不存在");
}
if(rbeanParent.getEleReportBean()!=null)
{
lstTemp.add(rbeanTemp);
continue;
}
ReportBean rbTemp=(ReportBean)rbeanParent.clone(rbeanTemp.getId(),rbeanTemp.getParentContainer());
rbTemp.setEleReportBean(null);
rbTemp.getParentContainer().getMChildren().put(rbTemp.getId(),rbTemp);
ComponentConfigLoadManager.loadReportInfo(rbTemp,eleReportBean,rbeanParent);
}
if(lstTemp.size()==lstExtendReports.size())
{
throw new WabacusConfigLoadingException("报表"+lstTemp+"无法加载,可能存在相互继承关系");
}
lstExtendReports=lstTemp;
}
}
Config.getInstance().setMReportStructureInfo(mAllPagesConfig);
log.info("成功加载完所有报表配置文件,开始执行所有页面加载后置动作...");
if(mAllPagesConfig!=null&&mAllPagesConfig.size()>0)
{
for(Entry<String,PageBean> entryTmp:mAllPagesConfig.entrySet())
{
if(entryTmp.getValue()==null) continue;
try
{
entryTmp.getValue().doPostLoad();
}catch(Exception e)
{
log.error("执行页面"+entryTmp.getValue().getPath()+"加载后置动作失败",e);
return -1;
}
}
for(Entry<String,PageBean> entryTmp:mAllPagesConfig.entrySet())
{
if(entryTmp.getValue()==null) continue;
try
{
entryTmp.getValue().doPostLoadFinally();
}catch(Exception e)
{
log.error("执行页面"+entryTmp.getValue().getPath()+"加载后置动作失败",e);
return -1;
}
}
}
loadAllSkinConfigProperties();
mAllPagesConfig=null;
mAllPageChildIds=null;
lstExtendReports=null;
mAllXmlTagObjects=null;
log.info("wabacus应用启动完成!");
return 1;
}catch(Exception e)
{
log.error("加载报表配置文件失败",e);
return -1;
}
}
private static void loadReportConfigFiles(Element root)
{
Element eleReport=root.element("report-files");
if(eleReport==null)
{
throw new WabacusConfigLoadingException("没有配置报表配置文件");
}
List lstReport=eleReport.elements("report-file");
List<String> lstReportConfigFiles=getListConfigFilePaths(lstReport);//获取到所有配置文件路径
if(lstReportConfigFiles==null||lstReportConfigFiles.size()<=0)
{
throw new WabacusConfigLoadingException("没有配置报表配置文件");
}
Map<String,Map> mLocalResourcesTemp=new HashMap<String,Map>();
boolean isClasspathTmp;
BufferedInputStream bisTmp;
for(String fileTmp:lstReportConfigFiles)
{
if(fileTmp==null||fileTmp.trim().equals("")) continue;
isClasspathTmp=Tools.isDefineKey("classpath",fileTmp);
if(isClasspathTmp) fileTmp=Tools.getRealKeyByDefine("classpath",fileTmp);
String jsFileName=convertFileNameByPath(fileTmp)+".js";
String jsFilePath=FilePathAssistant.getInstance().standardFilePath(Config.webroot_abspath+"\\wxtmpfiles\\js\\"+jsFileName);
String jsFileUrl=Config.webroot+"/wxtmpfiles/js/"+jsFileName;
jsFileUrl=Tools.replaceAll(jsFileUrl,"//","/");
if(!fileTmp.toLowerCase().endsWith(".xml"))
{
log.warn("没有加载报表配置文件"+fileTmp+",因为不是xml格式");
continue;
}
log.info("正在加载配置文件:"+fileTmp+"...");
bisTmp=null;
try
{
bisTmp=getConfigFileInputStream(fileTmp,isClasspathTmp);
ComponentConfigLoadManager.loadApplicationsConfigFiles(bisTmp,jsFileUrl,jsFilePath,mLocalResourcesTemp);
}catch(Exception e)
{
throw new WabacusConfigLoadingException("加载报表配置文件"+fileTmp+"失败",e);
}finally
{
try
{
if(bisTmp!=null) bisTmp.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
}
private static String convertFileNameByPath(String path)
{
if(path==null) return path;
String path2=path.trim();
path2=Tools.replaceAll(path2,"\\","");
path2=Tools.replaceAll(path2,".","");
path2=Tools.replaceAll(path2,"/","");
path2=Tools.replaceAll(path2,":","");
path2=Tools.replaceAll(path2,"-","");
return path2;
}
private static void encryptDatasourcePassword()
{
if(DesEncryptTools.KEY_OBJ==null)
{
return;
}
Document doc=XmlAssistant.getInstance().loadXmlDocument("wabacus.cfg.xml");
String xpath=XmlAssistant.getInstance().addNamespaceToXpath("//datasources/datasource/property[@name='password']");
List lstPasswords=doc.selectNodes(xpath);
if(lstPasswords==null||lstPasswords.size()==0) return;
Element elePasswordTmp;
String passwordTmp;
boolean hasEncrypted=false;
for(int i=0;i<lstPasswords.size();i++)
{
elePasswordTmp=(Element)lstPasswords.get(i);
passwordTmp=elePasswordTmp.getText();
passwordTmp=passwordTmp==null?"":passwordTmp.trim();
if(passwordTmp.equals("")) continue;
if(passwordTmp.startsWith("{3DES}"))
{
if(DesEncryptTools.IS_NEWKEY)
{
throw new WabacusConfigLoadingException("密钥文件已经改变,但wabacus.cfg.xml中已有用旧密钥加密好的密码,它们将无法解密,请将它们先置成明文再换密钥文件");
}
}else
{
hasEncrypted=true;
passwordTmp=DesEncryptTools.encrypt(passwordTmp);//加密
elePasswordTmp.setText("{3DES}"+passwordTmp);
}
}
if(hasEncrypted)
{
try
{
XmlAssistant.getInstance().saveDocumentToXmlFile("wabacus.cfg.xml",doc);
}catch(IOException e)
{
log.warn("wabacus.cfg.xml中的数据源密码加密失败,将存放明文的密码",e);
}
}
}
private static void loadSystemItemConfig()
{
Map<String,String> mFinalSystemConfig=new HashMap<String,String>();
Map<String,String> mBuiltInSystemConfig=new HashMap<String,String>();
BufferedInputStream bis=null;
try
{
InputStream is=ConfigLoadManager.currentDynClassLoader.getResourceAsStream("defaultconfig/wabacus.cfg.default.xml");
if(is!=null)
{
bis=new BufferedInputStream(is);
Document docTemp=XmlAssistant.getInstance().loadXmlDocument(is);
Element eleRoot=docTemp.getRootElement();
Element eleSystem=XmlAssistant.getInstance().getSingleElementByName(eleRoot,"system");
if(eleSystem!=null)
{
List lstItem=eleSystem.elements("item");
if(lstItem!=null&&lstItem.size()>0)
{
Element eleItemTmp;
for(int i=0;i<lstItem.size();i++)
{
eleItemTmp=(org.dom4j.Element)lstItem.get(i);
if(eleItemTmp!=null)
{
String name=eleItemTmp.attributeValue("name");
String value=eleItemTmp.attributeValue("value");
mBuiltInSystemConfig.put(name,value);
mFinalSystemConfig.put(name,value);
}
}
}
}
}
}catch(Exception e)
{
throw new WabacusConfigLoadingException("加载系统内置配置文件/defaultconfig/wabacus.cfg.default.xml失败",e);
}finally
{
if(bis!=null)
{
try
{
bis.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
Map<String,String> mSystemConfig=new HashMap<String,String>();
Document doc=XmlAssistant.getInstance().loadXmlDocument("wabacus.cfg.xml");
Element root=doc.getRootElement();
Element eleSystem=XmlAssistant.getInstance().getSingleElementByName(root,"system");
if(eleSystem!=null)
{
List lstItem=eleSystem.elements("item");
if(lstItem!=null&&lstItem.size()>0)
{
for(int i=0;i<lstItem.size();i++)
{
Element eleItem=(Element)lstItem.get(i);
if(eleItem!=null)
{
String name=eleItem.attributeValue("name");
String value=eleItem.attributeValue("value");
mSystemConfig.put(name,value);
mFinalSystemConfig.put(name,value);
}
}
}
}
Config.getInstance().setMSystemConfig(mFinalSystemConfig);
initSystemConfig(mBuiltInSystemConfig,mSystemConfig);
}
private static void createSystemJS()
{
if(!Config.should_createjs) return;
String jsFilePath=FilePathAssistant.getInstance().standardFilePath(Config.webroot_abspath+"\\wxtmpfiles\\js\\generate_system.js");
String rowselectbgcolor=Config.getInstance().getSystemConfigValue("selectedrow-bgcolor","");
StringBuilder scriptBuf=new StringBuilder();
if(!rowselectbgcolor.trim().equals(""))
{
scriptBuf.append("var WX_selectedRowBgcolor='"+rowselectbgcolor+"';");
}else
{
scriptBuf.append("var WX_selectedRowBgcolor='#0000FF';");
}
scriptBuf.append("var WXConfig=new Object();");
scriptBuf.append("WXConfig.showreport_url='"+Config.showreport_url+"';");
scriptBuf.append("WXConfig.showreport_onpage_url='"+Config.showreport_onpage_url+"';");
scriptBuf.append("WXConfig.webroot='").append(Config.webroot).append("';");
scriptBuf.append("WXConfig.prompt_dialog_type='").append(Config.getInstance().getSystemConfigValue("prompt-dialog-type","artdialog")).append(
"';");
String loadErrorMessage=Config.getInstance().getResourceString(null,null,"${load.error.mess}",false);
scriptBuf.append("WXConfig.load_error_message=").append(
loadErrorMessage==null||loadErrorMessage.trim().equals("")?"null":"'"+loadErrorMessage+"'").append(";");
JavaScriptAssistant.getInstance().writeJsMethodToJsFiles(jsFilePath,scriptBuf.toString());
if(Config.getInstance().getMInputBoxTypes()!=null&&Config.getInstance().getMInputBoxTypes().size()>0)
{
createGetInputBoxLabelValueMethod(jsFilePath,false);
createGetInputBoxLabelValueMethod(jsFilePath,true);
createGetInputboxLabelValueByIdMethod(jsFilePath,false);
createGetInputboxLabelValueByIdMethod(jsFilePath,true);
createSetInputBoxLabelValueMethod(jsFilePath,false);
createSetInputBoxLabelValueMethod(jsFilePath,true);
createSetInputboxLabelValueByIdMethod(jsFilePath,false);
createSetInputboxLabelValueByIdMethod(jsFilePath,true);
String typenameTmp;
AbsInputBox boxObjTmp;
scriptBuf=new StringBuilder();
scriptBuf.append("function getChangeStyleObjByInputBoxObjOnEdit(boxObj){");
scriptBuf.append(" var parentEleObj=getInputboxParentElementObj(boxObj);");
scriptBuf.append(" if(parentEleObj==null) return boxObj;");
scriptBuf.append(" if(parentEleObj.changeStyleObjByInputBoxObjOnEdit!=null) return parentEleObj.changeStyleObjByInputBoxObjOnEdit;");//已经设置过(比如自定义输入框就会在校验的时候设置一下)
scriptBuf.append(" var boxId=getInputboxIdByParentElementObj(parentEleObj);");
scriptBuf.append(" if(boxId==null||boxId=='') return boxObj;");
scriptBuf.append(" var boxMetadataObj=getInputboxMetadataObj(boxId);if(boxMetadataObj==null) return boxObj;");
scriptBuf.append(" var boxType=boxMetadataObj.getAttribute('typename');");
for(Entry<String,AbsInputBox> entryTmp:Config.getInstance().getMInputBoxTypes().entrySet())
{
typenameTmp=entryTmp.getKey();
boxObjTmp=entryTmp.getValue();
if(Tools.isEmpty(typenameTmp)||typenameTmp.equals(Consts.DEFAULT_KEY)||boxObjTmp==null) continue;
scriptBuf.append(" if(boxType=='"+typenameTmp+"'){ ");
scriptBuf.append(boxObjTmp.getChangeStyleObjOnEdit());
scriptBuf.append(" }");
}
scriptBuf.append("return boxObj;}");
JavaScriptAssistant.getInstance().writeJsMethodToJsFiles(jsFilePath,scriptBuf.toString());
scriptBuf=new StringBuilder();
scriptBuf.append("function fillInputBoxToTd(parentTdObj){");
scriptBuf.append(" var realinputboxid=getInputboxIdByParentElementObj(parentTdObj);");
scriptBuf.append(" var reportguid=getReportGuidByInputboxId(realinputboxid);");
scriptBuf.append(" var metadataObj=getReportMetadataObj(reportguid);");
scriptBuf.append(" var reportfamily=metadataObj.reportfamily;");
scriptBuf.append(" var textalign=parentTdObj.style.textAlign||parentTdObj.getAttribute('align'); if(textalign==null) textalign='left';");
scriptBuf.append(" var wid=parentTdObj.clientWidth-2;");
scriptBuf.append(" var updateDestTdObj=getUpdateColDestObj(parentTdObj,reportguid,parentTdObj);");
scriptBuf.append(" var boxValue=updateDestTdObj.getAttribute('value');");
scriptBuf.append(" if(boxValue==null){boxValue='';}");
scriptBuf.append(" var boxMetadataObj=getInputboxMetadataObj(realinputboxid);");
scriptBuf.append(" if(boxMetadataObj==null){ wx_error('没有取到输入框'+realinputboxid+'对应的元数据,无法显示输入框');return;}");
scriptBuf.append(" var displayonclick=boxMetadataObj.getAttribute('displayonclick');");
scriptBuf.append(" var boxType=boxMetadataObj.getAttribute('typename');");
scriptBuf.append(" var styleproperty=boxMetadataObj.getAttribute('styleproperty');");
scriptBuf.append(" if(styleproperty==null) styleproperty='';styleproperty=paramdecode(styleproperty);");
scriptBuf.append(" var boxstr='';var arrTmp=null;");
for(Entry<String,AbsInputBox> entryTmp:Config.getInstance().getMInputBoxTypes().entrySet())
{
typenameTmp=entryTmp.getKey();
boxObjTmp=entryTmp.getValue();
if(Tools.isEmpty(typenameTmp)||typenameTmp.equals(Consts.DEFAULT_KEY)||boxObjTmp==null) continue;
scriptBuf.append(" if(boxType=='"+typenameTmp+"'){ ");
scriptBuf.append(boxObjTmp.filledInContainer());
scriptBuf.append(" }");
}
scriptBuf.append(" doPostFilledInContainer(parentTdObj);");
scriptBuf.append("}");
JavaScriptAssistant.getInstance().writeJsMethodToJsFiles(jsFilePath,scriptBuf.toString());
scriptBuf=new StringBuilder();
scriptBuf.append("function doPostFilledInContainer(parentTdObj){");
scriptBuf.append(" var realinputboxid=getInputboxIdByParentElementObj(parentTdObj);");
scriptBuf.append(" var boxMetadataObj=getInputboxMetadataObj(realinputboxid);");
scriptBuf.append(" var boxType=boxMetadataObj.getAttribute('typename');");
scriptBuf.append(" var displayonclick=boxMetadataObj.getAttribute('displayonclick');");
scriptBuf.append(" var isCommonFlag=true;");
for(Entry<String,AbsInputBox> entryTmp:Config.getInstance().getMInputBoxTypes().entrySet())
{
typenameTmp=entryTmp.getKey();
boxObjTmp=entryTmp.getValue();
if(Tools.isEmpty(typenameTmp)||typenameTmp.equals(Consts.DEFAULT_KEY)||boxObjTmp==null) continue;
scriptBuf.append(" if(boxType=='"+typenameTmp+"'){ ");
scriptBuf.append(boxObjTmp.doPostFilledInContainer());
scriptBuf.append(" }");
}
scriptBuf.append(" if(isCommonFlag===true){");
scriptBuf.append(" var boxObj=document.getElementById(realinputboxid);");
scriptBuf.append(" if(boxObj==null) return;");
scriptBuf.append(" if(displayonclick=='true'){boxObj.dataObj=initInputBoxData(boxObj,parentTdObj);boxObj.focus();}");
scriptBuf.append(" }");
scriptBuf.append("}");
JavaScriptAssistant.getInstance().writeJsMethodToJsFiles(jsFilePath,scriptBuf.toString());
scriptBuf=new StringBuilder();
scriptBuf.append("function fillBoxValueToParentElement(boxObj,inputboxid,isChangedisplay){");
scriptBuf.append(" var reportguid=getReportGuidByInputboxId(inputboxid);");
scriptBuf.append(" var reportMetaDataObj=getReportMetadataObj(reportguid);");
scriptBuf.append(" var boxMetadataObj=getInputboxMetadataObj(inputboxid);");
scriptBuf.append(" var parentElementObj=getInputboxParentElementObjByTagName(boxObj,'TD');");//输入框所在的存放输入框值的父标签对象,只有displayonclick为true的才会调此方法
scriptBuf.append(" if(parentElementObj==null) return;");
scriptBuf.append(" var boxType=boxMetadataObj.getAttribute('typename');");
scriptBuf.append(" var displayvalue='',realvalue='';");
for(Entry<String,AbsInputBox> entryTmp:Config.getInstance().getMInputBoxTypes().entrySet())
{
typenameTmp=entryTmp.getKey();
boxObjTmp=entryTmp.getValue();
if(Tools.isEmpty(typenameTmp)||typenameTmp.equals(Consts.DEFAULT_KEY)||boxObjTmp==null) continue;
scriptBuf.append(" if(boxType=='"+typenameTmp+"'){ ");
scriptBuf.append(boxObjTmp.fillBoxValueToParentElement());
scriptBuf.append(" }");
}
//scriptBuf.append("else{ label=label.replace(/</g,'<');label=label.replace(/>/g,'>');label=label.replace(/\\\'/g,''');label=label.replace(/\\\"/g,'"');}");
scriptBuf.append(" if(isChangedisplay===true){");
scriptBuf.append(" if(displayvalue==null) displayvalue='';");
scriptBuf.append(" var formatemplate=boxMetadataObj.getAttribute('formatemplate');");
scriptBuf.append(" if(formatemplate!=null&&formatemplate!='')");
scriptBuf.append(" {");
scriptBuf.append(" displayvalue=getEditable2ColRealValueByFormatemplate(parentElementObj,reportguid,formatemplate,boxMetadataObj.getAttribute('formatemplate_dyncols'),displayvalue);");
scriptBuf.append(" }");
scriptBuf.append(" setColDisplayValueToEditable2Td(parentElementObj,displayvalue);");
scriptBuf.append(" }");
// /**
// * 注意下面的oldvalue变量不能从<td/>的oldvalue属性中取,而必须从存放新值的value属性中取,因为假设第一次编辑新值时,与oldvalue不同,将此记录数据放入待保存队列中,并将新值设置到value属性中,
// */
// scriptBuf.append(" if(value!=oldvalue){");//编辑后的值与<td/>中原有的值不同,则要更新它
// scriptBuf.append(" parentTdObj.setAttribute('value',value);");
// scriptBuf.append(" if(childids!=null&&childids!=''){");//是树形分组节点或普通分组节点对应的列,则更新它所包括的所有数据行的相应分组列的值,以便保存时用上
// scriptBuf.append(" addDataForSaving(reportguid,parentTdObj.parentNode);");
// scriptBuf.append(" wx_warn('错误的报表类型');");
scriptBuf.append("}");
JavaScriptAssistant.getInstance().writeJsMethodToJsFiles(jsFilePath,scriptBuf.toString());
}
}
private static void createGetInputBoxLabelValueMethod(String jsFilePath,boolean isGetLabel)
{
StringBuilder scriptBuf=new StringBuilder();
if(isGetLabel)
{
scriptBuf.append("function getInputBoxLabel(boxObj){");
}else
{
scriptBuf.append("function getInputBoxValue(boxObj){");
}
scriptBuf.append(" if(boxObj==null) return null;");
scriptBuf.append(" var boxId=getInputboxIdByParentElementObj(getInputboxParentElementObj(boxObj));");
scriptBuf.append(" if(boxId==null||boxId=='') return null;");
scriptBuf.append(" var boxMetadataObj=getInputboxMetadataObj(boxId);if(boxMetadataObj==null) return null;");
scriptBuf.append(" var boxType=boxMetadataObj.getAttribute('typename');");
createGetInputBoxValueJs(jsFilePath,scriptBuf,isGetLabel);
}
private static void createGetInputboxLabelValueByIdMethod(String jsFilePath,boolean isGetLabel)
{
StringBuilder scriptBuf=new StringBuilder();
if(isGetLabel)
{
scriptBuf.append("function getInputBoxLabelById(boxId){");
}else
{
scriptBuf.append("function getInputBoxValueById(boxId){");
}
scriptBuf.append(" if(boxId==null||boxId=='') return null;");
scriptBuf.append(" var boxObj=document.getElementById(boxId);");
scriptBuf.append(" var boxMetadataObj=getInputboxMetadataObj(boxId);if(boxMetadataObj==null) return null;");
scriptBuf.append(" var boxType=boxMetadataObj.getAttribute('typename');");
createGetInputBoxValueJs(jsFilePath,scriptBuf,isGetLabel);
}
private static void createGetInputBoxValueJs(String jsFilePath,StringBuilder scriptBuf,boolean isGetLabel)
{
String typenameTmp;
AbsInputBox boxObjTmp;
for(Entry<String,AbsInputBox> entryTmp:Config.getInstance().getMInputBoxTypes().entrySet())
{
typenameTmp=entryTmp.getKey();
boxObjTmp=entryTmp.getValue();
if(Tools.isEmpty(typenameTmp)||typenameTmp.equals(Consts.DEFAULT_KEY)||boxObjTmp==null) continue;
scriptBuf.append(" if(boxType=='"+typenameTmp+"') { ");
scriptBuf.append(boxObjTmp.createGetInputboxValueJs(isGetLabel));
scriptBuf.append(" }");
}
scriptBuf.append("return boxObj==null?null:boxObj.value;}");
JavaScriptAssistant.getInstance().writeJsMethodToJsFiles(jsFilePath,scriptBuf.toString());
}
private static void createSetInputBoxLabelValueMethod(String jsFilePath,boolean isSetLabel)
{
StringBuilder scriptBuf=new StringBuilder();
if(isSetLabel)
{
scriptBuf.append("function setInputBoxLabel(boxObj,newValue){");
}else
{
scriptBuf.append("function setInputBoxValue(boxObj,newValue){");
}
scriptBuf.append(" if(boxObj==null) return;");
scriptBuf.append(" var boxId=getInputboxIdByParentElementObj(getInputboxParentElementObj(boxObj));");
scriptBuf.append(" if(boxId==null||boxId=='') return;");
scriptBuf.append(" var boxMetadataObj=getInputboxMetadataObj(boxId);if(boxMetadataObj==null) return;");
scriptBuf.append(" var boxType=boxMetadataObj.getAttribute('typename');");
createSetInputBoxValueJs(jsFilePath,scriptBuf,isSetLabel);
}
private static void createSetInputboxLabelValueByIdMethod(String jsFilePath,boolean isSetLabel)
{
StringBuilder scriptBuf=new StringBuilder();
if(isSetLabel)
{
scriptBuf.append("function setInputBoxLabelById(boxId,newValue){");
}else
{
scriptBuf.append("function setInputBoxValueById(boxId,newValue){");
}
scriptBuf.append(" if(boxId==null||boxId=='') return;");
scriptBuf.append(" var boxObj=document.getElementById(boxId);");
scriptBuf.append(" var boxMetadataObj=getInputboxMetadataObj(boxId);if(boxMetadataObj==null) return;");
scriptBuf.append(" var boxType=boxMetadataObj.getAttribute('typename');");
createSetInputBoxValueJs(jsFilePath,scriptBuf,isSetLabel);
}
private static void createSetInputBoxValueJs(String jsFilePath,StringBuilder scriptBuf,boolean isSetLabel)
{
scriptBuf.append(" var isCommonFlag=true;");
String typenameTmp;
AbsInputBox boxObjTmp;
for(Entry<String,AbsInputBox> entryTmp:Config.getInstance().getMInputBoxTypes().entrySet())
{
typenameTmp=entryTmp.getKey();
boxObjTmp=entryTmp.getValue();
if(Tools.isEmpty(typenameTmp)||typenameTmp.equals(Consts.DEFAULT_KEY)||boxObjTmp==null) continue;
scriptBuf.append(" if(boxType=='"+typenameTmp+"') { ");
scriptBuf.append(boxObjTmp.createSetInputboxValueJs(isSetLabel));
scriptBuf.append(" }");
}
scriptBuf.append(" if(isCommonFlag==true){");
scriptBuf.append(" if(boxObj!=null){boxObj.value=newValue;}");
scriptBuf.append(" }");
scriptBuf.append("}");
JavaScriptAssistant.getInstance().writeJsMethodToJsFiles(jsFilePath,scriptBuf.toString());
}
private static void loadI18nResources(Element eleI18nResources)
{
String file=eleI18nResources.attributeValue("file");
if(file==null||file.trim().equals(""))
{
return;
//throw new WabacusConfigLoadingException("在系统配置文件<i18n-resources/>中必须配置file属性,且不能配置为空字符串");
}
file=file.trim();
if(file.toLowerCase().endsWith(".xml"))
{
file=file.substring(0,file.length()-4);
}
String absFilePath=WabacusAssistant.getInstance().getRealFilePath(Config.configpath,file);
if(Tools.isDefineKey("classpath",Config.configpath))
{//如果所有配置文件是存放在classpath下面
validI18nFile(absFilePath,"/");
Config.i18n_filename=absFilePath;
Config.getInstance().getResources().setMI18NResources(new HashMap<String,Map<String,Object>>());
loadI18nResourcesInClassPath(null);
}else
{
validI18nFile(absFilePath,File.separator);
int idxtmp=absFilePath.lastIndexOf(File.separator);
Config.i18n_filename=absFilePath.substring(idxtmp+1).toLowerCase();
String i18n_filepath=absFilePath.substring(0,idxtmp);
loadI18nResourcesInAbsPath(i18n_filepath);
}
}
private static void validI18nFile(String file,String seperator)
{
if(file.endsWith(seperator))
{
throw new WabacusConfigLoadingException("在系统配置文件<i18n-resources/>中配置的file属性必须包括I18N资源文件名,不能只指定路径");
}
int idxsep=file.lastIndexOf(seperator);
int idxdot=file.lastIndexOf(".");
if(idxsep>=0&&idxdot>idxsep||idxdot>0)
{
throw new WabacusConfigLoadingException("在系统配置文件<i18n-resources/>中配置的file指定的国际化资源文件类型:"+file.substring(idxdot)+"不合法,只能是.xml格式");
}
}
private static void loadI18nResourcesInAbsPath(String i18n_filepath)
{
log.info("正在加载"+i18n_filepath+"路径下的国际化资源文件...");
File f=new File(i18n_filepath);
if(!f.exists()||!f.isDirectory())
{
throw new WabacusConfigLoadingException("在<i18n-resources/>的path属性中配置的:"+i18n_filepath+"不存在或不是目录,无法加载其下的资源文件");
}
File[] filesArray=f.listFiles();
if(filesArray==null||filesArray.length==0)
{
log.warn("在<i18n-resources/>的path属性中配置的:"+i18n_filepath+"下没有资源文件");
}
Map<String,Map<String,Object>> mI18nResourceItems=new HashMap<String,Map<String,Object>>();
String nameTemp;
for(int i=0;i<filesArray.length;i++)
{
nameTemp=filesArray[i].getName().toLowerCase();
int idx=nameTemp.lastIndexOf(File.separator);
if(idx>0)
{
nameTemp=nameTemp.substring(idx+1);
}
idx=nameTemp.lastIndexOf(".");
if(idx<=0) continue;
String typetmp=nameTemp.substring(idx).toLowerCase();
nameTemp=nameTemp.substring(0,idx);
if(nameTemp.startsWith(Config.i18n_filename)&&typetmp.equals(".xml"))
{
Map<String,Object> mResults=null;
try
{
Map mTemp=loadXmlResources(XmlAssistant.getInstance().loadXmlDocument(filesArray[i]).getRootElement());
if(mTemp==null||mTemp.size()==0)
{
log.warn("没有在I18N资源文件"+filesArray[i].getName()+"中配置资源项");
}else
{
mResults=mTemp;
}
if(mResults!=null) mI18nResourceItems.put(nameTemp,mResults);
}catch(Exception e)
{
throw new WabacusConfigLoadingException("加载i18n资源文件"+filesArray[i].getName()+"失败",e);
}
}
}
if(mI18nResourceItems==null||mI18nResourceItems.size()==0)
{
log.warn("在<i18n-resources/>的path属性中配置的:"+i18n_filepath+"下没有符合要求的资源文件");
}
Config.getInstance().getResources().setMI18NResources(mI18nResourceItems);
}
public static void loadI18nResourcesInClassPath(String localetype)
{
String myi18nfile=Config.i18n_filename;
if(localetype!=null&&!localetype.trim().equals("")&&!localetype.trim().equalsIgnoreCase("en"))
{
myi18nfile=myi18nfile+"_"+localetype;
}
myi18nfile=myi18nfile+".xml";
Map<String,Object> mResults=null;
try
{
Map mTemp=loadXmlResources(XmlAssistant.getInstance().loadXmlDocument(
ConfigLoadManager.currentDynClassLoader.getResourceAsStream(myi18nfile)).getRootElement());
if(mTemp==null||mTemp.size()==0)
{
log.warn("没有在I18N资源文件"+myi18nfile+"中配置资源项");
}else
{
mResults=mTemp;
}
}catch(IOException ioe)
{
if(localetype==null||localetype.trim().equals(""))
{
throw new WabacusConfigLoadingException("配置的国际化资源文件"+Config.i18n_filename+"不存在",ioe);
}
log.warn("没有配置语言类型为"+localetype+"的国际化资源文件");
}catch(DocumentException de)
{
if(localetype==null||localetype.trim().equals(""))
{
throw new WabacusConfigLoadingException("配置的国际化资源文件"+Config.i18n_filename+"不合法",de);
}
log.warn("配置语言类型为"+localetype+"的国际化资源文件不合法");
}catch(Exception e)
{
if(localetype==null||localetype.trim().equals("")) localetype="EN";
throw new WabacusConfigLoadingException("加载"+localetype+"对应的国际化资源文件失败",e);
}
if(mResults==null)
{
mResults=new HashMap<String,Object>();
}else
{
mResults=Config.getInstance().getResources().replace(mResults);//因为存放在classpath中的国际化资源文件可能是在运行时加载,因此要在这里替换掉里面的%WEBROOT%等占位符
}
if(localetype==null||localetype.trim().equals("")) localetype="en";
Config.getInstance().getResources().getMI18NResources().put(localetype,mResults);
}
public static List<String> loadCssfiles(Element root)
{
List<String> lstCssFiles=new UniqueArrayList<String>();
if(root==null) return lstCssFiles;
List lstCssFileElements=root.elements("css-file");
if(lstCssFileElements!=null&&lstCssFileElements.size()>0)
{
Element eleCssFile;
for(int i=0;i<lstCssFileElements.size();i++)
{
eleCssFile=(Element)lstCssFileElements.get(i);
if(eleCssFile==null) continue;
String cssfile=eleCssFile.getTextTrim();
if(cssfile==null||cssfile.trim().equals("")) continue;
if(!cssfile.toLowerCase().trim().startsWith("http://"))
{
cssfile=Config.webroot+"/"+cssfile.trim();
cssfile=Tools.replaceAll(cssfile,"\\","/");
cssfile=Tools.replaceAll(cssfile,"//","/");
}
lstCssFiles.add(cssfile);
}
}
return lstCssFiles;
}
public static List<JavascriptFileBean> loadJsfiles(Element root)
{
List<JavascriptFileBean> lstJsFiles=new ArrayList<JavascriptFileBean>();
if(root==null) return lstJsFiles;
List lstJsFileElements=root.elements("js-file");
if(lstJsFileElements!=null&&lstJsFileElements.size()>0)
{
String encodetype=Config.encode.toLowerCase().trim();
if(encodetype.equalsIgnoreCase("gb2312"))
{
encodetype="gbk";
}else if(encodetype.equals("utf-8"))
{
encodetype="";
}
Element eleJsFile;
String loadorderTmp;
for(int i=0;i<lstJsFileElements.size();i++)
{
eleJsFile=(Element)lstJsFileElements.get(i);
if(eleJsFile==null) continue;
String jsfile=eleJsFile.getTextTrim();
if(jsfile==null||jsfile.trim().equals("")) continue;
jsfile=Tools.replaceAll(jsfile,"%ENCODING%",encodetype);
if(!jsfile.trim().startsWith(Config.webroot)&&!jsfile.toLowerCase().trim().startsWith("http://"))
{
jsfile=Config.webroot+"/"+jsfile.trim();
jsfile=Tools.replaceAll(jsfile,"\\","/");
jsfile=Tools.replaceAll(jsfile,"//","/");
}
loadorderTmp=eleJsFile.attributeValue("loadorder");
lstJsFiles.add(new JavascriptFileBean(jsfile.trim(),loadorderTmp==null||loadorderTmp.trim().equals("")?0:Integer
.parseInt(loadorderTmp.trim())));
}
}
return lstJsFiles;
}
private static void initSystemConfig(Map<String,String> mBuiltInSystemConfig,Map<String,String> mSystemConfig)
{
Config.webroot_abspath=Config.getInstance().getSystemConfigValue("webroot-abspath",Config.homeAbsPath);
Config.webroot_abspath=FilePathAssistant.getInstance().standardFilePath(Config.webroot_abspath);
Config.should_createjs=Config.getInstance().getSystemConfigValue("js-create",true);
if(Config.should_createjs)
{
String createjs_path=FilePathAssistant.getInstance().standardFilePath(Config.webroot_abspath+"\\wxtmpfiles\\js\\");
File f=new File(createjs_path);
if(f.exists())
{
try
{
FilePathAssistant.getInstance().delete(f,".js",false,true);
}catch(IOException e)
{
throw new WabacusConfigLoadingException("删除js文件创建路径失败",e);
}
}
log.info("报表javascript生成路径:"+createjs_path);
FilePathAssistant.getInstance().checkAndCreateDirIfNotExist(Config.webroot_abspath+"\\wxtmpfiles\\js\\");
}else
{
log.warn("由于js-create配置为false,不生成报表的javascript");
}
Config.show_sql=Config.getInstance().getSystemConfigValue("show-sql",false);
Config.skin=Config.getInstance().getSystemConfigValue("skin","");
if(Config.webroot==null||Config.webroot.trim().equals(""))
{
Config.webroot=Config.getInstance().getSystemConfigValue("webroot","/");
Config.webroot=Tools.replaceAll(Config.webroot,"\\","/");
if(!Config.webroot.startsWith("/")) Config.webroot="/"+Config.webroot;
if(!Config.webroot.endsWith("/")) Config.webroot=Config.webroot+"/";
}
Config.encode=Config.getInstance().getSystemConfigValue("encode","utf-8");
Config.showreport_url=Config.getInstance().getSystemConfigValue("showreport-url","");
if(Config.showreport_url.equals(""))
{
throw new WabacusConfigLoadingException("必须在wabacus.cfg.xml文件中,配置showreport-url");
}
if(!Config.showreport_url.startsWith(Config.webroot))
{
if(Config.showreport_url.startsWith("/"))
{
Config.showreport_url=Config.showreport_url.substring(1);
}
Config.showreport_url=Config.webroot+Config.showreport_url;
}
String token="?";
if(Config.showreport_url.indexOf("?")>0) token="&";
Config.showreport_onpage_url=Config.showreport_url+token+Consts.DISPLAYTYPE_PARAMNAME+"="+Consts.DISPLAY_ON_PAGE;
Config.showreport_onword_url=Config.showreport_url+token+Consts.DISPLAYTYPE_PARAMNAME+"="+Consts.DISPLAY_ON_WORD;
Config.showreport_onrichexcel_url=Config.showreport_url+token+Consts.DISPLAYTYPE_PARAMNAME+"="+Consts.DISPLAY_ON_RICHEXCEL;
Config.showreport_onplainexcel_url=Config.showreport_url+token+Consts.DISPLAYTYPE_PARAMNAME+"="+Consts.DISPLAY_ON_PLAINEXCEL;
Config.showreport_onpdf_url=Config.showreport_url+token+Consts.DISPLAYTYPE_PARAMNAME+"="+Consts.DISPLAY_ON_PDF;
Config.default_errorpromptparams_onblur=Config.getInstance().getSystemConfigValue("default-errorpromptparams-onblur",null);
List<Class> lstClasses=new ArrayList<Class>();
String strValidateClass=mSystemConfig.get("server-validate-class");
List lstTemp=ConfigLoadAssistant.getInstance().convertStringToClassList(strValidateClass);
if(lstTemp!=null)
{
lstClasses.addAll(lstTemp);
}
strValidateClass=mBuiltInSystemConfig.get("server-validate-class");
lstTemp=ConfigLoadAssistant.getInstance().convertStringToClassList(strValidateClass);
if(lstTemp!=null) lstClasses.addAll(lstTemp);
Config.getInstance().setLstServerValidateClasses(lstClasses);
List<Class> lstFormatClasses=new ArrayList<Class>();
String strFormatClass=mSystemConfig.get("format-class");
lstTemp=ConfigLoadAssistant.getInstance().convertStringToClassList(strFormatClass);
if(lstTemp!=null)
{
lstFormatClasses.addAll(lstTemp);
}
strFormatClass=mBuiltInSystemConfig.get("format-class");
lstTemp=ConfigLoadAssistant.getInstance().convertStringToClassList(strFormatClass);
if(lstTemp!=null) lstFormatClasses.addAll(lstTemp);
Config.getInstance().setLstFormatClasses(lstFormatClasses);
String default_roworderclass=Config.getInstance().getSystemConfigValue("default-roworderclass","");
if(!default_roworderclass.equals(""))
{
Object obj=null;
try
{
obj=ConfigLoadManager.currentDynClassLoader.loadClassByCurrentLoader(default_roworderclass).newInstance();
}catch(Exception e)
{
throw new WabacusConfigLoadingException("在wabacus.cfg.xml通过default-roworderclass配置的"+default_roworderclass+"类对象实例化失败",e);
}
if(!(obj instanceof IListReportRoworderPersistence))
{
throw new WabacusConfigLoadingException("在wabacus.cfg.xml通过default-roworderclass配置的类"+default_roworderclass+"没有实现"
+IListReportRoworderPersistence.class.getName()+"接口");
}
Config.default_roworder_object=(IListReportRoworderPersistence)obj;
}
String default_pagepersonalizeclass=Config.getInstance().getSystemConfigValue("default-pagepersonalizeclass","");
if(!default_pagepersonalizeclass.equals(""))
{
Object obj=null;
try
{
obj=ConfigLoadManager.currentDynClassLoader.loadClassByCurrentLoader(default_pagepersonalizeclass).newInstance();
}catch(Exception e)
{
throw new WabacusConfigLoadingException("在wabacus.cfg.xml通过default-pagepersonalizeclass配置的"+default_pagepersonalizeclass+"类对象实例化失败",e);
}
if(!(obj instanceof IPagePersonalizePersistence))
{
throw new WabacusConfigLoadingException("在wabacus.cfg.xml通过default-pagepersonalizeclass配置的类"+default_pagepersonalizeclass+"没有实现"
+IPagePersonalizePersistence.class.getName()+"接口");
}
Config.default_pagepersonalize_object=(IPagePersonalizePersistence)obj;
}
String default_reportpersonalizeclass=Config.getInstance().getSystemConfigValue("default-reportpersonalizeclass","");
if(!default_reportpersonalizeclass.equals(""))
{
Object obj=null;
try
{
obj=ConfigLoadManager.currentDynClassLoader.loadClassByCurrentLoader(default_reportpersonalizeclass).newInstance();
}catch(Exception e)
{
throw new WabacusConfigLoadingException("在wabacus.cfg.xml通过default-reportpersonalizeclass配置的"+default_reportpersonalizeclass+"类对象无例化失败",e);
}
if(!(obj instanceof IReportPersonalizePersistence))
{
throw new WabacusConfigLoadingException("在wabacus.cfg.xml通过default-reportpersonalizeclass配置的类"+default_reportpersonalizeclass+"没有实现"
+IReportPersonalizePersistence.class.getName()+"接口");
}
Config.default_reportpersonalize_object=(IReportPersonalizePersistence)obj;
}
}
private static void loadBuildInDefaultSystemConfig()
{
BufferedInputStream bis=null;
try
{
InputStream is=ConfigLoadManager.currentDynClassLoader.getResourceAsStream("defaultconfig/wabacus.cfg.default.xml");
if(is!=null)
{
bis=new BufferedInputStream(is);
Document docTemp=XmlAssistant.getInstance().loadXmlDocument(is);
Element eleRoot=docTemp.getRootElement();
loadContainerTypesConfig(eleRoot);
loadReportTypesConfig(eleRoot);
loadInputBoxTypesConfig(eleRoot);
loadReportDatasetvalueProviders(eleRoot);
loadCommonDatasetvalueProviders(eleRoot);
loadUpdateDatasetvalueProviders(eleRoot);
loadDataTypesConfig(eleRoot);
Config.getInstance().addGlobalCss(loadCssfiles(eleRoot.element("global-cssfiles")));
Config.getInstance().setLstDefaultGlobalJavascriptFiles(loadJsfiles(eleRoot.element("global-jsfiles")));
loadGlobalPageInterceptors(eleRoot.element("global-interceptors"));
}
}catch(Exception e)
{
throw new WabacusConfigLoadingException("加载系统内置配置文件/defaultconfig/wabacus.cfg.default.xml失败",e);
}finally
{
if(bis!=null)
{
try
{
bis.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
}
private static void loadGlobalPageInterceptors(Element eleGlobalInterceptors)
{
if(eleGlobalInterceptors==null) return;
List lstEleGlobalInterceptors=eleGlobalInterceptors.elements("interceptor");
if(lstEleGlobalInterceptors==null||lstEleGlobalInterceptors.size()==0) return;
Element eleInterceptorTmp;
Class clsTmp;
Object objTmp;
String classTmp,pageidTmp,matchmodeTmp;
for(int i=0;i<lstEleGlobalInterceptors.size();i++)
{
eleInterceptorTmp=(Element)lstEleGlobalInterceptors.get(i);
classTmp=eleInterceptorTmp.attributeValue("class");
pageidTmp=eleInterceptorTmp.attributeValue("pageid");
matchmodeTmp=eleInterceptorTmp.attributeValue("matchmode");
if(classTmp==null||classTmp.trim().equals(""))
{
throw new WabacusConfigLoadingException("加载全局拦截器失败,存在没有配置class属性的拦截器");
}
clsTmp=ConfigLoadManager.currentDynClassLoader.loadClassByCurrentLoader(classTmp);
try
{
objTmp=clsTmp.newInstance();
}catch(Exception e)
{
throw new WabacusConfigLoadingException("实例化全局拦截器"+classTmp+"失败",e);
}
if(!(objTmp instanceof AbsPageInterceptor))
{
throw new WabacusConfigLoadingException("全局拦截器"+classTmp+"没有继承"+AbsPageInterceptor.class.getName()+"类");
}
if(pageidTmp!=null&&!pageidTmp.trim().equals(""))
{
try
{
Method method=clsTmp.getMethod("setMatchpageids",new Class[] { String.class });
method.invoke(objTmp,new Object[] { pageidTmp.trim() });
}catch(Exception e)
{
throw new WabacusConfigLoadingException("全局拦截器"+classTmp+"的类中没有setMatchpageids(String)方法",e);
}
}
if(matchmodeTmp!=null&&!matchmodeTmp.trim().equals(""))
{
try
{
Method method=clsTmp.getMethod("setMatchmode",new Class[] { String.class });
method.invoke(objTmp,new Object[] { matchmodeTmp.trim() });
}catch(Exception e)
{
throw new WabacusConfigLoadingException("全局拦截器"+classTmp+"的类中没有setMatchmode(String)方法",e);
}
}
Config.getInstance().addGlobalInterceptor((AbsPageInterceptor)objTmp);
}
}
private static void loadInputBoxTypesConfig(Element eleRoot)
{
Element eleTypes=eleRoot.element("inputbox-types");
Map<String,AbsInputBox> mTypes=new HashMap<String,AbsInputBox>();
String defaulttype=null;
if(eleTypes!=null)
{
defaulttype=eleTypes.attributeValue("default");
List lstEleTypes=eleTypes.elements("inputbox-type");
if(lstEleTypes!=null&&lstEleTypes.size()>0)
{
Element eleType;
for(int i=0;i<lstEleTypes.size();i++)
{
eleType=(Element)lstEleTypes.get(i);
if(eleType==null) continue;
String name=eleType.attributeValue("name");
String strclass=eleType.attributeValue("class");
String defaultstyleproperty=eleType.attributeValue("defaultstyleproperty");
if(name==null)
{
throw new WabacusConfigLoadingException("在系统配置文件中注册的输入框类型的name属性不能为空");
}
name=name.trim();
if(mTypes.containsKey(name))
{
throw new WabacusConfigLoadingException("在系统配置文件中注册的输入框类型的name属性"+name+"存在重复");
}
if(strclass==null||strclass.trim().equals(""))
{
throw new WabacusConfigLoadingException("在系统配置文件中注册的name属性为"+name+"的输入框没有配置class属性");
}
try
{
Class c=ConfigLoadManager.currentDynClassLoader.loadClassByCurrentLoader(strclass);
Object o=c.getConstructor(new Class[] { String.class }).newInstance(new Object[] { name });
if(!(o instanceof AbsInputBox))
{
throw new WabacusConfigLoadingException("在系统配置文件中注册的name属性为"+name+"的输入框,其class:"+strclass+"没有继承类"
+AbsInputBox.class.getName());
}
mTypes.put(name,(AbsInputBox)o);
}catch(Exception e)
{
throw new WabacusConfigLoadingException("在系统配置文件中注册的name属性为"+name+"的输入框,其class:"+strclass+"无法加载或无法实例化",e);
}
if(defaultstyleproperty!=null)
{
mTypes.get(name).setDefaultstyleproperty(Tools.formatStringBlank(defaultstyleproperty.trim()));
}
}
}
}
if(Config.getInstance().getMInputBoxTypes()==null)
{
Config.getInstance().setMInputBoxTypes(mTypes);
}else
{
Tools.copyMapData(mTypes,Config.getInstance().getMInputBoxTypes(),false);
}
if(defaulttype!=null&&!defaulttype.trim().equals(""))
{
AbsInputBox defaultTypeObj=Config.getInstance().getInputBoxTypeByName(defaulttype);
if(defaultTypeObj==null)
{
throw new WabacusConfigLoadingException("配置的默认输入框"+defaulttype+"不存在");
}
Config.getInstance().setInputBoxType(Consts.DEFAULT_KEY,defaultTypeObj);
}
}
private static void loadDataTypesConfig(Element eleRoot)
{
Element eleTypes=eleRoot.element("data-types");
Map<String,IDataType> mTypes=new HashMap<String,IDataType>();
String defaulttype=null;
if(eleTypes!=null)
{
defaulttype=eleTypes.attributeValue("default");
List lstEleTypes=eleTypes.elements("data-type");
if(lstEleTypes!=null&&lstEleTypes.size()>0)
{
Element eleType;
for(int i=0;i<lstEleTypes.size();i++)
{
eleType=(Element)lstEleTypes.get(i);
if(eleType==null) continue;
String name=eleType.attributeValue("name");
String strclass=eleType.attributeValue("class");
if(name==null)
{
throw new WabacusConfigLoadingException("在系统配置文件中注册的数据类型的name属性不能为空");
}
name=name.trim();
if(mTypes.containsKey(name))
{
throw new WabacusConfigLoadingException("在系统配置文件中注册的数据类型的name属性"+name+"存在重复");
}
if(strclass==null||strclass.trim().equals(""))
{
throw new WabacusConfigLoadingException("在系统配置文件中注册的name属性为"+name+"的数据类型没有配置class属性");
}
try
{
Class c=ConfigLoadManager.currentDynClassLoader.loadClassByCurrentLoader(strclass);
Object o=c.newInstance();
if(!(o instanceof IDataType))
{
throw new WabacusConfigLoadingException("在系统配置文件中注册的name属性为"+name+"的数据类型,其class:"+strclass+"没有实现"
+IDataType.class.getName()+"接口");
}
((IDataType)o).loadTypeConfig(eleType);
mTypes.put(name,(IDataType)o);
}catch(Exception e)
{
throw new WabacusConfigLoadingException("在系统配置文件中注册的name属性为"+name+"的数据类型时,其class:"+strclass+"无法加载或无法实例化",e);
}
}
}
}
if(Config.getInstance().getMDataTypes()==null)
{
Config.getInstance().setMDataTypes(mTypes);
}else
{
Tools.copyMapData(mTypes,Config.getInstance().getMDataTypes(),false);
}
if(defaulttype!=null&&!defaulttype.trim().equals(""))
{
IDataType defaultTypeObj=Config.getInstance().getDataTypeByName(defaulttype);
if(defaultTypeObj==null)
{
throw new WabacusConfigLoadingException("配置的默认数据类型"+defaulttype+"不存在");
}
Config.getInstance().getMDataTypes().put(Consts.DEFAULT_KEY,defaultTypeObj);
}
}
private static void loadBuildInDefaultResources()
{
BufferedInputStream bis=null;
try
{
Config.getInstance().setResources(new Resources());
InputStream is=ConfigLoadManager.currentDynClassLoader.getResourceAsStream("defaultconfig/wabacus.resources.default.xml");
if(is!=null)
{
bis=new BufferedInputStream(is);
Document docTemp=XmlAssistant.getInstance().loadXmlDocument(bis);
Map mResults=loadXmlResources(docTemp.getRootElement());
if(mResults!=null&&mResults.size()>0)
{
Tools.copyMapData(mResults,Config.getInstance().getResources().getMBuiltInDefaultResources(),true);
}
}
}catch(Exception e)
{
throw new WabacusConfigLoadingException("加载系统内置配置文件/defaultconfig/wabacus.resources.default.xml失败",e);
}finally
{
if(bis!=null)
{
try
{
bis.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
}
private static void loadGlobeResources(Element root)
{
Element eleResources=root.element("global-resources");
if(eleResources==null) return;
List lstFiles=eleResources.elements("resource-file");
if(lstFiles==null||lstFiles.size()==0) return;
List<String> lstFilePaths=getListConfigFilePaths(lstFiles);
if(lstFilePaths==null||lstFilePaths.size()==0) return;
Map mResultsTmp;
for(String fileTmp:lstFilePaths)
{
mResultsTmp=loadResourceFile(fileTmp);
if(mResultsTmp==null) continue;
String key=Tools.copyMapData(mResultsTmp,Config.getInstance().getResources().getMGlobalResources(),true);
if(key!=null)
{
throw new WabacusConfigLoadingException("在resource文件中,name属性为"+key+"的存在重复,不能加载配置文件");
}
}
}
public static Map loadResourceFile(String resourcefile)
{
boolean isClasspath=Tools.isDefineKey("classpath",resourcefile);
if(isClasspath) resourcefile=Tools.getRealKeyByDefine("classpath",resourcefile);
if(!resourcefile.toLowerCase().endsWith(".properties")&&!resourcefile.toLowerCase().endsWith(".xml"))
{
log.warn("没有加载"+resourcefile+"文件,因为不是xml和properties格式");
return null;
}
log.info("正在加载资源文件:"+resourcefile+"...");
Map mResults=null;
BufferedInputStream bis=null;
try
{
bis=getConfigFileInputStream(resourcefile,isClasspath);
if(resourcefile.toLowerCase().endsWith(".properties"))
{
Properties props=new Properties();
props.load(bis);
if(props!=null) mResults=convertPropertiesToResources(props);
}else
{
mResults=loadXmlResources(XmlAssistant.getInstance().loadXmlDocument(bis).getRootElement());
}
}catch(Exception e)
{
throw new WabacusConfigLoadingException("加载配置文件"+resourcefile+"失败,请确认是否存在此配置文件",e);
}finally
{
try
{
if(bis!=null) bis.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
return mResults;
}
private static BufferedInputStream getConfigFileInputStream(String filepath,boolean isClasspath) throws IOException
{
BufferedInputStream bisResult=null;
if(isClasspath)
{
if(filepath.startsWith("/")) filepath=filepath.substring(1);
bisResult=new BufferedInputStream(ConfigLoadManager.currentDynClassLoader.getResourceAsStream(filepath));//必须用ConfigLoadManager.currentDynClassLoader,否则无法实现热部署
}else
{
bisResult=new BufferedInputStream(new FileInputStream(filepath));
}
return bisResult;
}
public static List<String> getListConfigFilePaths(List lstFileElements)
{
if(lstFileElements==null||lstFileElements.size()==0) return null;
List<String> lstResults=new ArrayList<String>();
Element eleTmp;
for(int i=0,len=lstFileElements.size();i<len;i++)
{
eleTmp=(Element)lstFileElements.get(i);
String filepathTmp=eleTmp.getTextTrim();
if(filepathTmp==null||filepathTmp.trim().equals("")) continue;
String pattern=eleTmp.attributeValue("pattern");
boolean isPattern=pattern!=null&&pattern.toLowerCase().trim().equals("true");
if(isPattern)
{
boolean isClasspathType=false;
if(Tools.isDefineKey("classpath",filepathTmp))
{
filepathTmp=Tools.getRealKeyByDefine("classpath",filepathTmp).trim();
while(filepathTmp.startsWith("/"))
{
filepathTmp=filepathTmp.substring(1).trim();
}
isClasspathType=true;
}else if(Tools.isDefineKey("absolute",filepathTmp))
{
filepathTmp=Tools.getRealKeyByDefine("absolute",filepathTmp).trim();
filepathTmp=FilePathAssistant.getInstance().standardFilePath(filepathTmp);
}else if(Tools.isDefineKey("relative",filepathTmp))
{//配置为相对应用根路径的相对路径
filepathTmp=Tools.getRealKeyByDefine("relative",filepathTmp).trim();
filepathTmp=WabacusAssistant.getInstance().getRealFilePath(Config.webroot_abspath,filepathTmp);
}else
{
filepathTmp=WabacusAssistant.getInstance().getRealFilePath(Config.configpath,filepathTmp);
if(Tools.isDefineKey("classpath",Config.configpath)) isClasspathType=true;
}
String recursive=eleTmp.attributeValue("recursive");
boolean isRecursive=recursive!=null&&recursive.toLowerCase().trim().equals("true");
FilePathAssistant.getInstance().getLstFilesByPath(lstResults,filepathTmp,isClasspathType,isRecursive);
}else
{
if(Tools.isDefineKey("classpath",filepathTmp))
{
filepathTmp=Tools.getRealKeyByDefine("classpath",filepathTmp).trim();
while(filepathTmp.startsWith("/"))
{
filepathTmp=filepathTmp.substring(1).trim();
}
filepathTmp="classpath{"+filepathTmp+"}";//标识是classpath的路径
}else if(Tools.isDefineKey("absolute",filepathTmp))
{
filepathTmp=Tools.getRealKeyByDefine("absolute",filepathTmp).trim();
filepathTmp=FilePathAssistant.getInstance().standardFilePath(filepathTmp);
}else if(Tools.isDefineKey("relative",filepathTmp))
{
filepathTmp=Tools.getRealKeyByDefine("relative",filepathTmp).trim();
filepathTmp=WabacusAssistant.getInstance().getRealFilePath(Config.webroot_abspath,filepathTmp);
}else
{
filepathTmp=WabacusAssistant.getInstance().getRealFilePath(Config.configpath,filepathTmp);
if(Tools.isDefineKey("classpath",Config.configpath))
{
filepathTmp="classpath{"+filepathTmp+"}";
}
}
if(!lstResults.contains(filepathTmp)) lstResults.add(filepathTmp);
}
}
return lstResults;
}
private static void loadDataSources(Element eleDataSources)
{
List lstEleDatasource=eleDataSources.elements("datasource");
if(lstEleDatasource==null||lstEleDatasource.size()==0)
{
throw new WabacusConfigLoadingException("没有在wabacus.cfg.xml文件中配置数据源");
}
Map<String,AbsDataSource> mDataSources=new HashMap<String,AbsDataSource>();
Element eleDataSource=null;
String name;
for(int i=0;i<lstEleDatasource.size();i++)
{
eleDataSource=(Element)lstEleDatasource.get(i);
name=eleDataSource.attributeValue("name");
if(name==null||name.trim().equals(""))
{
throw new WabacusConfigLoadingException("必须配置数据源的name属性");
}
name=name.trim();
if(mDataSources.containsKey(name))
{
throw new WabacusConfigLoadingException("配置的数据源:"+name+"存在重复");
}
String provider=eleDataSource.attributeValue("type");
if(provider==null||provider.trim().equals(""))
{
provider=DriverManagerDataSource.class.getName();
}
Object providerObj=null;
try
{
Class c_provider=ConfigLoadManager.currentDynClassLoader.loadClassByCurrentLoader(provider);
providerObj=c_provider.newInstance();
}catch(Exception e)
{
throw new WabacusConfigLoadingException("数据源类:"+provider+"无法实例化",e);
}
if(!(providerObj instanceof AbsDataSource))
{
throw new WabacusConfigLoadingException("配置的数据源类:"+provider+"没有继承超类"+AbsDataSource.class.getName());
}
((AbsDataSource)providerObj).setName(name);
((AbsDataSource)providerObj).loadConfig(eleDataSource);
mDataSources.put(name,((AbsDataSource)providerObj));
}
String defaultname=eleDataSources.attributeValue("default");
if(defaultname!=null&&!defaultname.trim().equals(""))
{
String defaultname2=defaultname.trim();
if(Tools.isDefineKey("i18n",defaultname2))
{
defaultname2=Tools.getRealKeyByDefine("i18n",defaultname2);
}
if(!mDataSources.containsKey(defaultname2))
{
throw new WabacusConfigLoadingException("配置的默认数据源:"+eleDataSources.attributeValue("default")+"不存在");
}
mDataSources.put(Consts.DEFAULT_KEY,mDataSources.get(defaultname2));
Config.getInstance().setDefault_datasourcename(defaultname.trim());
}else
{
Config.getInstance().setDefault_datasourcename(null);
}
Config.getInstance().setMDataSources(mDataSources);
}
public static Map loadXmlResources(Element rootTemp) throws Exception
{
Map mResult=new HashMap();
if(rootTemp!=null)
{
List lstResources=XmlAssistant.getInstance().getElementsByName(rootTemp,"resource");//rootTemp.elements("resource");
if(lstResources!=null&&lstResources.size()>0)
{
for(int k=0;k<lstResources.size();k++)
{
Element eleResource=(Element)lstResources.get(k);
if(eleResource!=null)
{
String key=eleResource.attributeValue("key");
String type=eleResource.attributeValue("type");
if(key==null||key.trim().equals(""))
{
throw new WabacusConfigLoadingException("在资源文件中,为各<resource/>配置的key属性不能为空");
}
key=key.trim();
if(mResult.containsKey(key))
{
throw new WabacusConfigLoadingException("在resource文件中,key属性为"+key+"的存在重复,不能加载配置文件");
}
if(type==null||type.trim().equals(""))
{
type=StringRes.class.getName();
}
type=type.trim();
Object o=ConfigLoadManager.currentDynClassLoader.loadClassByCurrentLoader(type).newInstance();
if(!(o instanceof AbsResource))
{
throw new WabacusConfigLoadingException("在resource文件中,为"+key+"资源项配置的type,没有继承AbsResource类");
}
mResult.put(key,((AbsResource)o).getValue(eleResource));
}
}
}
}
return mResult;
}
private static void loadContainerTypesConfig(Element root)
{
Element eleContainertypes=XmlAssistant.getInstance().getSingleElementByName(root,"container-types");
if(eleContainertypes==null) return;
List lstContainertypes=eleContainertypes.elements("container-type");
if(lstContainertypes==null||lstContainertypes.size()<=0) return;
Map<String,AbsContainerType> mContainertypes=new HashMap<String,AbsContainerType>();
for(int i=0;i<lstContainertypes.size();i++)
{
Element eleContainertype=(Element)lstContainertypes.get(i);
if(eleContainertype==null) continue;
String name=eleContainertype.attributeValue("name");
String strclass=eleContainertype.attributeValue("class");
if(name==null||name.trim().equals(""))
{
throw new WabacusConfigLoadingException("配置报表的容器类型的name属性不能为空");
}
name=name.trim();
if(mContainertypes.containsKey(name))
{
throw new WabacusConfigLoadingException("系统配置文件中配置的容器类型name属性:"+name+"存在重复");
}
strclass=strclass==null?"":strclass.trim();
if(strclass.trim().equals(""))
{
throw new WabacusConfigLoadingException("系统配置文件中配置的name属性为"+name+"的容器类型没有配置class属性");
}
Object containerObj=AbsComponentType.createComponentTypeObj(ConfigLoadManager.currentDynClassLoader.loadClassByCurrentLoader(strclass),
null,null,null);
if(!(containerObj instanceof AbsContainerType))
{
throw new WabacusConfigLoadingException("配置报表的容器类型的class:"+strclass+"没有继承"+AbsContainerType.class.getName()+"类");
}
mContainertypes.put(name,(AbsContainerType)containerObj);
}
if(Config.getInstance().getMContainertypes()==null)
{
Config.getInstance().setMContainertypes(mContainertypes);
}else
{
Tools.copyMapData(mContainertypes,Config.getInstance().getMContainertypes(),false);
}
}
private static void loadReportTypesConfig(Element root)
{
Element eleReporttypes=XmlAssistant.getInstance().getSingleElementByName(root,"report-types");
if(eleReporttypes==null) return;
String defaultreporttype=eleReporttypes.attributeValue("default");
defaultreporttype=defaultreporttype==null?"":defaultreporttype.trim();
List lstReporttypes=eleReporttypes.elements("report-type");
if(lstReporttypes==null||lstReporttypes.size()<=0) return;
Map<String,IReportType> mReportTypes=new HashMap<String,IReportType>();
for(int i=0;i<lstReporttypes.size();i++)
{
Element eleReporttype=(Element)lstReporttypes.get(i);
if(eleReporttype==null) continue;
String name=eleReporttype.attributeValue("name");
String strclass=eleReporttype.attributeValue("class");
name=name==null?"":name.trim();
if(name.equals(""))
{
throw new WabacusConfigLoadingException("配置报表类型的name属性不能为空");
}
if(mReportTypes.containsKey(name))
{
throw new WabacusConfigLoadingException("配置报表类型的name属性:"+name+"存在重复");
}
strclass=strclass==null?"":strclass.trim();
if(strclass.equals(""))
{
throw new WabacusConfigLoadingException("配置报表类型的class属性不能为空");
}
Object reportObj=AbsComponentType.createComponentTypeObj(ConfigLoadManager.currentDynClassLoader.loadClassByCurrentLoader(strclass),null,
null,null);
if(!(reportObj instanceof AbsReportType))
{
throw new WabacusConfigLoadingException("配置报表类型的class:"+strclass+"没有继承"+AbsReportType.class.getName()+"类");
}
mReportTypes.put(name,(IReportType)reportObj);
}
if(Config.getInstance().getMReporttypes()==null)
{
Config.getInstance().setMReporttypes(mReportTypes);
}else
{
Tools.copyMapData(mReportTypes,Config.getInstance().getMReporttypes(),false);
}
if(!defaultreporttype.equals(""))
{
Object reportObj=Config.getInstance().getMReporttypes().get(defaultreporttype);
if(reportObj==null) throw new WabacusConfigLoadingException("配置的默认报表类型key:"+defaultreporttype+"不存在");
mReportTypes.put(Consts.DEFAULT_KEY,(IReportType)reportObj);
}
}
private static void loadReportDatasetvalueProviders(Element eleRoot)
{
Element eleDatasetValueTypes=XmlAssistant.getInstance().getSingleElementByName(eleRoot,"report-datasetvalue-providers");
if(eleDatasetValueTypes==null) return;
String defaultdsvtype=eleDatasetValueTypes.attributeValue("default");
defaultdsvtype=defaultdsvtype==null?"":defaultdsvtype.trim();
Map<String,Object> mDatasetValueTypes=loadDatasetvalueTypes(eleDatasetValueTypes,AbsReportDataSetValueProvider.class);
if(mDatasetValueTypes==null) return;
Map<String,AbsReportDataSetValueProvider> mRealDatasetValueTypes=new HashMap<String,AbsReportDataSetValueProvider>();
for(Entry<String,Object> entryTmp:mDatasetValueTypes.entrySet())
{
mRealDatasetValueTypes.put(entryTmp.getKey(),(AbsReportDataSetValueProvider)entryTmp.getValue());
}
if(Config.getInstance().getMReportDatasetValueProviders()==null)
{
Config.getInstance().setMReportDatasetValueProviders(mRealDatasetValueTypes);
}else
{
Tools.copyMapData(mRealDatasetValueTypes,Config.getInstance().getMReportDatasetValueProviders(),false);
}
if(!defaultdsvtype.equals(""))
{
AbsReportDataSetValueProvider dsvTypeObj=Config.getInstance().getReportDatasetValueProvider(defaultdsvtype);
if(dsvTypeObj==null) throw new WabacusConfigLoadingException("配置的<report-datasetvalue-providers/>的default:"+defaultdsvtype+"不存在");
Config.getInstance().getMReportDatasetValueProviders().put(Consts.DEFAULT_KEY,dsvTypeObj);
}
}
private static void loadCommonDatasetvalueProviders(Element eleRoot)
{
Element eleDatasetValueTypes=XmlAssistant.getInstance().getSingleElementByName(eleRoot,"common-datasetvalue-providers");
if(eleDatasetValueTypes==null) return;
String defaultdsvtype=eleDatasetValueTypes.attributeValue("default");
defaultdsvtype=defaultdsvtype==null?"":defaultdsvtype.trim();
Map<String,Object> mDatasetValueTypes=loadDatasetvalueTypes(eleDatasetValueTypes,AbsCommonDataSetValueProvider.class);
if(mDatasetValueTypes==null) return;
Map<String,AbsCommonDataSetValueProvider> mRealDatasetValueTypes=new HashMap<String,AbsCommonDataSetValueProvider>();
String keyTmp;
for(Entry<String,Object> entryTmp:mDatasetValueTypes.entrySet())
{
keyTmp=entryTmp.getKey().trim();
if("class".equals(keyTmp)||"$".equals(keyTmp)||keyTmp.indexOf(" ")>0||keyTmp.indexOf(",")>=0||keyTmp.indexOf("=")>=0)
{
throw new WabacusConfigLoadingException("在<common-datasetvalue-providers/>的<datasetvalue-provider/>中配置的name:"+keyTmp
+"不合法,不能配置为$或class,也不能出现空格、逗号、等号");
}
mRealDatasetValueTypes.put(keyTmp,(AbsCommonDataSetValueProvider)entryTmp.getValue());
}
if(Config.getInstance().getMCommonDatasetValueProviders()==null)
{
Config.getInstance().setMCommonDatasetValueProviders(mRealDatasetValueTypes);
}else
{
Tools.copyMapData(mRealDatasetValueTypes,Config.getInstance().getMCommonDatasetValueProviders(),false);
}
if(!defaultdsvtype.equals(""))
{
AbsCommonDataSetValueProvider dsvTypeObj=Config.getInstance().getCommonDatasetValueProvider(defaultdsvtype);
if(dsvTypeObj==null) throw new WabacusConfigLoadingException("配置的<common-datasetvalue-providers/>的default:"+defaultdsvtype+"不存在");
Config.getInstance().getMCommonDatasetValueProviders().put(Consts.DEFAULT_KEY,dsvTypeObj);
}
}
private static void loadUpdateDatasetvalueProviders(Element eleRoot)
{
Element eleDatasetValueTypes=XmlAssistant.getInstance().getSingleElementByName(eleRoot,"update-dataset-providers");
if(eleDatasetValueTypes==null) return;
String defaultdsvtype=eleDatasetValueTypes.attributeValue("default");
defaultdsvtype=defaultdsvtype==null?"":defaultdsvtype.trim();
Map<String,Object> mDatasetValueTypes=loadDatasetvalueTypes(eleDatasetValueTypes,AbsUpdateActionProvider.class);
if(mDatasetValueTypes==null) return;
Map<String,AbsUpdateActionProvider> mRealDatasetValueTypes=new HashMap<String,AbsUpdateActionProvider>();
String keyTmp;
for(Entry<String,Object> entryTmp:mDatasetValueTypes.entrySet())
{
keyTmp=entryTmp.getKey().trim();
mRealDatasetValueTypes.put(keyTmp,(AbsUpdateActionProvider)entryTmp.getValue());
}
if(Config.getInstance().getMUpdateDatasetActionProviders()==null)
{
Config.getInstance().setMUpdateDatasetActionProviders(mRealDatasetValueTypes);
}else
{
Tools.copyMapData(mRealDatasetValueTypes,Config.getInstance().getMUpdateDatasetActionProviders(),false);
}
if(!defaultdsvtype.equals(""))
{
AbsUpdateActionProvider dsvTypeObj=Config.getInstance().getUpdateDatasetActionProvider(defaultdsvtype);
if(dsvTypeObj==null) throw new WabacusConfigLoadingException("配置的<update-dataset-providers/>的default:"+defaultdsvtype+"不存在");
Config.getInstance().getMUpdateDatasetActionProviders().put(Consts.DEFAULT_KEY,dsvTypeObj);
}
}
private static Map<String,Object> loadDatasetvalueTypes(Element eleDatasetValueTypes,Class datasetTypeClass)
{
if(eleDatasetValueTypes==null) return null;
String defaultdsvtype=eleDatasetValueTypes.attributeValue("default");
defaultdsvtype=defaultdsvtype==null?"":defaultdsvtype.trim();
List lstEleDsvTypes=eleDatasetValueTypes.elements("dataset-provider");
if(lstEleDsvTypes==null||lstEleDsvTypes.size()<=0) return null;
Map<String,Object> mDatasetValueTypes=new HashMap<String,Object>();
for(int i=0;i<lstEleDsvTypes.size();i++)
{
Element eleDsvType=(Element)lstEleDsvTypes.get(i);
if(eleDsvType==null) continue;
String name=eleDsvType.attributeValue("name");
String strclass=eleDsvType.attributeValue("class");
name=name==null?"":name.trim();
if(name.equals(""))
{
throw new WabacusConfigLoadingException("配置<dataset-provider/>的name属性不能为空");
}
if(mDatasetValueTypes.containsKey(name))
{
throw new WabacusConfigLoadingException("配置<dataset-provider/>的name属性:"+name+"存在重复");
}
strclass=strclass==null?"":strclass.trim();
if(strclass.equals(""))
{
throw new WabacusConfigLoadingException("配置<dataset-provider/>的class属性不能为空");
}
Object datasetValueTypeObj=null;
try
{
datasetValueTypeObj=ConfigLoadManager.currentDynClassLoader.loadClassByCurrentLoader(strclass).newInstance();
}catch(Exception e)
{
throw new WabacusConfigLoadingException("配置<dataset-provider/>的class:"+strclass+"类无法实例化");
}
if(!datasetTypeClass.isInstance(datasetValueTypeObj))
{
throw new WabacusConfigLoadingException("配置<dataset-provider/>的class:"+strclass+"没有继承"+datasetTypeClass.getName()+"类");
}
mDatasetValueTypes.put(name,datasetValueTypeObj);
}
return mDatasetValueTypes;
}
public static Map convertPropertiesToResources(Properties props)
{
Map mResults=new HashMap();
if(props==null||props.isEmpty())
{
return null;
}
Iterator itKeys=props.keySet().iterator();
while(itKeys.hasNext())
{
String key=(String)itKeys.next();
String value=(String)props.get(key);
// try
// e.printStackTrace();
if(mResults.containsKey(key))
{
throw new WabacusConfigLoadingException("配置的资源key"+key+"存在重复,加载配置文件失败");
}
mResults.put(key,value);
}
return mResults;
}
private static void loadAllSkinConfigProperties()
{
File skinFileObj=new File(FilePathAssistant.getInstance().standardFilePath(Config.webroot_abspath+"\\webresources\\skin\\"));
if(!skinFileObj.exists()||!skinFileObj.isDirectory()) return;
File[] childFilesArr=skinFileObj.listFiles();
if(childFilesArr.length==0) return;
File childFileObjTmp;
String skinNameTmp=null;
for(int i=0;i<childFilesArr.length;i++)
{
childFileObjTmp=childFilesArr[i];
if(!childFileObjTmp.isDirectory()) continue;
skinNameTmp=childFileObjTmp.getName();
childFileObjTmp=new File(childFileObjTmp.getAbsolutePath()+File.separator+"config.properties");
if(!childFileObjTmp.exists()) continue;
loadConfigSkinProperties(skinNameTmp,childFileObjTmp);
}
}
private static void loadConfigSkinProperties(String skinName,File propFileObj)
{
BufferedInputStream bis=null;
try
{
bis=new BufferedInputStream(new FileInputStream(propFileObj));
Properties props=new Properties();
props.load(bis);
Config.getInstance().addSkinConfigProperties(skinName,convertPropertiesToResources(props));
}catch(Exception e)
{
throw new WabacusConfigLoadingException("加载主题风格"+skinName+"的config.properties配置文件失败",e);
}finally
{
try
{
if(bis!=null) bis.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
}