InitialContext.java
package com.windgone.framework.core;
import java.io.*;
import java.lang.reflect.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.w3c.dom.*;
import com.windgone.framework.frameworkexception.ApplicationException;
import com.windgone.framework.frameworkexception.PersistenceException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
/**
* 初始化参数
* @author YUJIAXIANG001
*
*/
public class InitialContext
{
/** 参数列表 */
private static Properties parameter = new Properties();
/**
* date format
*/
private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/** 参数列表Node */
private static Node contextModel;
/** 参数DOC */
private static Document doc;
/** 配置文件名称 */
private static String configFileName;
/** 根节点 */
protected final static String TAG_ELM_ROOT = "framework-config";
/** 初始化参数节点 */
protected final static String TAG_ELM_INIT_PARAMETER = "init-parameter";
/** 参数属性节点 */
protected final static String TAG_ELM_PROPERTY = "property";
/** 参数名节点 */
protected final static String TAG_ELM_NAME = "name";
/** 参数值节点 */
protected final static String TAG_ELM_VALUE = "value";
/** 节点功能描述 */
protected final static String TAG_ELM_DESCRIPTION = "description";
/** 参数内容节点 */
protected final static String TAG_ELM_CONTEXT_PARAM = "context-param";
/** 参数内容节点列表 */
protected final static String TAG_ELM_PARAM_LIST = "context-param-list";
/** 反射类名 */
protected final static String TAG_ATTR_PARSE_CLASS = "parse-class";
/**
* 初始化环境变量
* @param fileName 配置文件名称
* @throws Exception
*/
public static void init(String fileName) throws Exception
{
configFileName = fileName;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
doc = builder.parse(new FileInputStream(configFileName));
Element root_element = doc.getDocumentElement();
//检查配置文件合法性
if (!(root_element.getTagName()).equals(TAG_ELM_ROOT))
{
throw new Exception("Illegal initial parameter xml file.");
}
createContextModel();
NodeList list = root_element.getElementsByTagName(TAG_ELM_INIT_PARAMETER);
for (int i = 0; i < list.getLength(); i++)
{
Element element = (Element) list.item(i);
String classname = element.getAttribute(TAG_ATTR_PARSE_CLASS);
try
{
Class cls = Class.forName(classname);
Object obj = cls.newInstance();
Class[] argstab = new Class[] { Element.class };
Method md = cls.getMethod("init", argstab);
Object[] args = new Object[] { element };
md.invoke(obj, args);
}
catch (ClassNotFoundException ex)
{
ex.printStackTrace();
}
catch (ClassCastException ex)
{
ex.printStackTrace();
}
}
}
/**
* 根据配置文件中init-parameter节点element初始参数,子类中可以覆盖
* @param element
* @throws Exception
*/
public static void init(Element element) throws Exception
{
init(element, null);
}
/**
* 处理参数配置块
* @param element 块的文档根
* @param prefix 保存时参数名前缀,避免覆盖
* @throws Exception 异常
*/
public static void init(Element element, String prefix) throws Exception
{
if (prefix == null)
{
prefix = "";
}
NodeList list = element.getElementsByTagName(TAG_ELM_CONTEXT_PARAM);
Object obj;
if (list != null && list.getLength() > 0)
{
for (int i = 0; i < list.getLength(); i++)
{
obj = list.item(i);
if (obj instanceof Element)
{
handleParamContext((Element) obj, true, prefix);
}
}
}
list = element.getElementsByTagName(TAG_ELM_PARAM_LIST);
if (list != null && list.getLength() > 0)
{
for (int i = 0; i < list.getLength(); i++)
{
obj = list.item(i);
if (obj instanceof Element)
{
handleParamContext((Element) obj, false, prefix);
}
}
}
}
/**
* 读取参数值
* @param paraName 参数名
* @return 参数值
*/
public static String getProperty(String paraName)
{
if (paraName == null)
{
return null;
}
return parameter.getProperty(paraName);
}
/**
* 设置参数值
* @param paraName 参数名
* @param defaultValue 参数值
*/
public static void setProperty(String paraName, String defaultValue)
{
if (paraName == null)
{
return;
}
if (defaultValue == null)
{
parameter.remove(paraName);
}
parameter.setProperty(paraName, defaultValue);
}
/**
* 取出参数列表(适用于多值参数)
* @param paraName 参数名
* @return 参数值
*/
public static List getPorpertyList(String paraName)
{
if (paraName == null)
{
return null;
}
Object obj = parameter.get(paraName);
if (obj instanceof List)
{
return (List) obj;
}
else
{
return null;
}
}
/**
* 设置参数列表
* @param paraName 参数名
* @param paraList 参数值列表
*/
public static void setPorpertyList(String paraName, List paraList)
{
if (paraName == null)
{
return;
}
if (paraList == null)
{
parameter.remove(paraName);
}
parameter.put(paraName, paraList);
}
/**
* 读取参数值,为空时返回缺省值
* @param paraName 参数名
* @param defaultValue 缺省值
* @return 参数值
*/
public static String getProperty(String paraName, String defaultValue)
{
return parameter.getProperty(paraName, defaultValue);
}
/**
* 保存参数值
* @param parent 父级节点element
* @param key 参数名
* @param value 参数值
* @throws PersistenceException
*/
public static void saveProperty(Element parent, String key, String value) throws PersistenceException
{
if (parent == null || key == null)
{
throw new PersistenceException("要保存的参数或父节点为空");
}
//更改内存中的参数值
setProperty(key, value);
NodeList list = parent.getElementsByTagName(TAG_ELM_CONTEXT_PARAM);
Object obj;
Element context = null;
NodeList subList;
boolean gotten = false;
//查找参数节点context
if (list != null)
{
for (int i = 0; i < list.getLength(); i++)
{
obj = list.item(i);
if (obj instanceof Element)
{
context = (Element) obj;
subList = context.getElementsByTagName(TAG_ELM_NAME);
if (subList != null && subList.getLength() != 0)
{
if (key.equals(subList.item(0).getFirstChild().getNodeValue()))
{
gotten = true;
break;
}
}
}
}
}
if (value == null)
{
if (gotten)
{
//若该节点存在,移除该参数节点
parent.removeChild(context);
}
else
{
return;
}
}
else
{
if (gotten)
{
//若该节点存在,替换该参数节点
parent.replaceChild(createContextNode(key, value), context);
}
else
{
//若该节点不存在,添加该参数节点
parent.appendChild(createContextNode(key, value));
}
}
try
{
//写入配置文件
TransformerFactory tfactory = TransformerFactory.newInstance();
Transformer transformer = tfactory.newTransformer();
Properties properties = transformer.getOutputProperties();
properties.setProperty(OutputKeys.ENCODING, "gb2312");
transformer.setOutputProperties(properties);
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File(configFileName));
transformer.transform(source,result);
}
catch (Exception e)
{
throw new PersistenceException("保存参数到配置文件异常", e);
}
}
/**
* 读取整形参数值
* @param name 参数名
* @param defaultValue 缺省值
* @return 参数的整数值
*/
public static int getParameter(String name, int defaultValue)
{
String value = getProperty(name);
if (value == null)
{
return defaultValue;
}
value = value.trim();
if (value.length() == 0)
{
return defaultValue;
}
try
{
return Integer.parseInt(value);
}
catch (Exception e)
{
return defaultValue;
}
}
/**
* 读取boolean参数值
* @param name 参数名
* @param defaultValue 缺省值
* @return 参数的boolean值
*/
public static boolean getParameter(String name, boolean defaultValue)
{
String value = getProperty(name);
if (value == null)
{
return defaultValue;
}
value = value.trim();
if ("true".equalsIgnoreCase(value))
{
return true;
}
else if ("false".equalsIgnoreCase(value))
{
return false;
}
else
{
return defaultValue;
}
}
/**
* 保存日期参数
* @param parent 参数配置块入口
* @param key 参数名称
* @param value 参数值
* @throws PersistenceException 保存参数异常
*/
public static void saveParameter(Element parent, String key, Date value) throws PersistenceException
{
if (value == null)
{
saveProperty(parent, key, null);
}
else
{
saveProperty(parent, key, dateFormat.format(value));
}
}
/**
* 取得日期参数 格式yyyy-MM-dd HH:mm:ss,格式错误或不存在时返回空
* @param name 参数名
* @return 参数日期值
*/
public static Date getDateParameter(String name)
{
String value = getProperty(name);
if (value == null)
{
return null;
}
value = value.trim();
try
{
return dateFormat.parse(value);
}
catch (java.text.ParseException e)
{
return null;
}
}
/**
* 创建参数配置DOC
* 设置参数列表Node:contextModel
*/
private static void createContextModel()
{
contextModel = doc.createElement(TAG_ELM_CONTEXT_PARAM);
contextModel.appendChild(doc.createElement(TAG_ELM_NAME));
contextModel.appendChild(doc.createElement(TAG_ELM_VALUE));
}
/**
* 处理参数配置element
* @param paramContext 参数配置的element
* @param single 参数是否单值
* @param prefix 参数名称前缀
* @throws ApplicationException 处理异常
*/
private static void handleParamContext(Element paramContext,boolean single, String prefix) throws ApplicationException
{
if (paramContext == null)
{
throw new ApplicationException("处理的标签为空");
}
NodeList nvs = paramContext.getElementsByTagName(TAG_ELM_NAME);
if (nvs == null || nvs.getLength() != 1)
{
throw new ApplicationException("参数名不可为空或多值");
}
String name = prefix + nvs.item(0).getFirstChild().getNodeValue();
nvs = paramContext.getElementsByTagName(TAG_ELM_VALUE);
if (nvs == null || nvs.getLength() == 0)
{
throw new ApplicationException("参数" + name + "的设定值为空");
}
if (single)
{
setProperty(name, nvs.item(0).getFirstChild().getNodeValue());
}
else
{
List paramList = new ArrayList();
int length = nvs.getLength();
for (int i = 0; i < length; i++)
{
paramList.add(nvs.item(i).getFirstChild().getNodeValue());
}
parameter.put(name, paramList);
}
}
/**
* 创建参数节点
* @param key 参数名
* @param value 参数值
* @return
*/
private static Node createContextNode(String key, String value)
{
Node newParamContext = contextModel.cloneNode(true);
newParamContext.getFirstChild().appendChild(doc.createTextNode(key));
newParamContext.getLastChild().appendChild(doc.createTextNode(value));
return newParamContext;
}
}