读取XML配置文件

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;
 }
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值