pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/ConfigXml.java
@@ -1,496 +1,495 @@
package com.dy.common.util;
import java.io.FileWriter;
import java.net.URL;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
@SuppressWarnings("unused")
import java.io.FileWriter;
import java.net.URL;
import java.util.List;
/**
 * @Author: liurunyu
 * @Date: 2024/8/21 15:27
 * @Description
 */
public class ConfigXml {
   /**
    * 创建Document对象
    * @param clazz 参考类
    * @param filePath 配置文件路径
    * @return 返回结果  返回结果返回 doc对象
    * @throws Exception  抛出异常 抛出异常
    */
   public Document createDom(Class<?> clazz, String filePath) throws Exception {
      if(clazz == null){
         throw new Exception("class对象为空!");
      }
      if(filePath == null || filePath.equals("")){
         throw new Exception("配置文件路径名称为空!");
      }
      if(!filePath.startsWith("/")){
         filePath = "/" + filePath ;
      }
      URL configFileURL = clazz.getResource(filePath);
      if (configFileURL == null) {
         throw new Exception("没有得到" + filePath + "配置!");
      }
      return this.createDom(configFileURL) ;
   }
   /**
    * 创建Document对象
    * @param configFileURL  配置文件路径
    * @return 返回结果  返回结果返回 doc对象
    * @throws Exception  抛出异常 抛出异常
    */
   public Document createDom(URL configFileURL) throws Exception {
      if (configFileURL == null) {
         throw new Exception("没有得到配置文件!", null);
      }
      Document doc;
      try {
         SAXBuilder sb = new SAXBuilder();
         doc = sb.build(configFileURL);
         if (doc == null) {
            throw new Exception("没有生成配置文件的DOM对象!", null);
         }
      } catch (Exception e) {
         throw new Exception("生成配置文件的DOM对象失败!", e);
      }
      return doc;
   }
   /**
    * 保存xml文件
    * @param clazz 参考类
    * @param doc doc对象 doc对象
    * @param filePath 配置文件路径
    * @throws Exception  抛出异常 抛出异常
    */
   public void saveXML(Class<?> clazz, Document doc, String filePath) throws Exception {
      if(doc == null){
         throw new Exception("Document对象为空!");
      }
      if(filePath == null || filePath.equals("")){
         throw new Exception("配置文件路径名称为空!");
      }
      if(!filePath.startsWith("/")){
         filePath = "/" + filePath ;
      }
      // 将doc对象输出到文件
      FileWriter writer = null ;
      try {
         // 创建xml文件输出流
         XMLOutputter xmlopt = new XMLOutputter();
         // 创建文件输出流
         URL configFileURL = clazz.getResource(filePath);
         if (configFileURL == null) {
            throw new Exception("没有得到" + filePath + "配置!");
         }
         writer = new FileWriter(configFileURL.getPath());
         // 指定文档格式
         Format fm = Format.getPrettyFormat();
         fm.setEncoding("UTF-8");
         xmlopt.setFormat(fm);
         // 将doc写入到指定的文件中
         xmlopt.output(doc, writer);
      } catch (Exception e) {
         throw new Exception("保存xml文件失败!", e);
      } finally {
         if(writer != null){
            writer.close();
         }
      }
   }
   /**
    * 检查元素是否存在
    * @param doc doc对象
    * @param elementName 元素名称
    * @return 返回结果  返回结果
    */
   public boolean existElement(Document doc, String elementName){
      if(doc == null){
         return false ;
      }
      if(elementName == null){
         return false ;
      }
      elementName = elementName.trim() ;
      if(elementName.equals("")){
         return false ;
      }
      Element e = this.getElement(doc, elementName) ;
      return e != null;
   }
    /**
     * 创建Document对象
     * @param configFileURL  配置文件路径
     * @return 返回结果  返回结果返回 doc对象
     * @throws Exception  抛出异常 抛出异常
     */
    protected Document doCreateDom(URL configFileURL) throws Exception {
        if (configFileURL == null) {
            throw new Exception("没有得到配置文件!", null);
        }
        Document doc;
        try {
            SAXBuilder sb = new SAXBuilder();
            doc = sb.build(configFileURL);
            if (doc == null) {
                throw new Exception("没有生成配置文件的DOM对象!", null);
            }
        } catch (Exception e) {
            throw new Exception("生成配置文件的DOM对象失败!", e);
        }
        return doc;
    }
   /**
    * 得到并设置元素的属性的布尔值
    * @param doc doc对象
    * @param elementName 元素名称
    * @param attrName 属性名称
    * @param attPropertyNameFix 属性名称前缀
    * @param setValue 同时设置值
    * @return 返回结果
    * @throws Exception  抛出异常
    */
   public boolean getSetAttrBoolean(Document doc, String elementName, String attrName, String attPropertyNameFix, String setValue) throws Exception{
      String txt = this.getSetAttrTxt(doc, elementName, attrName, attPropertyNameFix, false, setValue) ;
      return txt.equalsIgnoreCase("true");
   }
    /**
     * 保存xml文件
     * @param clazz 参考类
     * @param doc doc对象 doc对象
     * @param filePath 配置文件路径
     * @throws Exception  抛出异常 抛出异常
     */
    public void saveXML(Class<?> clazz, Document doc, String filePath) throws Exception {
        if(doc == null){
            throw new Exception("Document对象为空!");
        }
        if(filePath == null || filePath.equals("")){
            throw new Exception("配置文件路径名称为空!");
        }
        if(!filePath.startsWith("/")){
            filePath = "/" + filePath ;
        }
        // 将doc对象输出到文件
        FileWriter writer = null ;
        try {
            // 创建xml文件输出流
            XMLOutputter xmlopt = new XMLOutputter();
            // 创建文件输出流
            URL configFileURL = clazz.getResource(filePath);
            if (configFileURL == null) {
                throw new Exception("没有得到" + filePath + "配置!");
            }
            writer = new FileWriter(configFileURL.getPath());
            // 指定文档格式
            Format fm = Format.getPrettyFormat();
            fm.setEncoding("UTF-8");
            xmlopt.setFormat(fm);
            // 将doc写入到指定的文件中
            xmlopt.output(doc, writer);
        } catch (Exception e) {
            throw new Exception("保存xml文件失败!", e);
        } finally {
            if(writer != null){
                writer.close();
            }
        }
    }
   /**
    * 得到并设置元素的属性的布尔值
    * @param e 元素对象
    * @param attrName 属性名称
    * @param attPropertyNameFix 属性名称前缀
    * @param setValue 同时设置值
    * @return 返回结果
    * @throws Exception  抛出异常
    */
   public boolean getSetAttrBoolean(Element e, String attrName, String attPropertyNameFix, String setValue) throws Exception{
      String txt = this.getSetAttrTxt(e, attrName, attPropertyNameFix, false, setValue) ;
      return txt.equalsIgnoreCase("true");
   }
    /**
     * 检查元素是否存在
     * @param doc doc对象
     * @param elementName 元素名称
     * @return 返回结果  返回结果
     */
    public Element getElement(Document doc, String elementName){
        if(doc == null){
            return null ;
        }
        if(elementName == null){
            return null ;
        }
        elementName = elementName.trim() ;
        if(elementName.equals("")){
            return null ;
        }
        return this.get_element(doc, elementName) ;
    }
   /**
    * 得到并设置元素的属性的字符串值
    * @param doc doc对象
    * @param elementName 元素名称
    * @param attrName 属性名称
    * @param attPropertyNameFix 属性名称前缀
    * @param canBlank 是否可为空
    * @param setValue 同时设置值
    * @return 返回结果
    * @throws Exception  抛出异常
    */
   public String getSetAttrTxt(Document doc, String elementName, String attrName, String attPropertyNameFix, Boolean canBlank, String setValue) throws Exception{
      Element e = this.checkAndGetElement(doc, elementName);
      return this.getSetAttrTxt(e, attrName, attPropertyNameFix, canBlank, setValue) ;
   }
   /**
    * 得到并设置元素的属性的字符串值
    * @param e 元素对象
    * @param attrName 属性名称
    * @param attPropertyNameFix 属性名称前缀
    * @param canBlank 是否可为空
    * @param setValue 同时设置值
    * @return 返回结果
    * @throws Exception  抛出异常
    */
   public String getSetAttrTxt(Element e, String attrName, String attPropertyNameFix, Boolean canBlank, String setValue) throws Exception{
      String txt = this.check_get_set_Attribute(e, e.getName(), attrName, attPropertyNameFix, setValue) ;
      if(!canBlank){
         if(txt.trim().equals("")){
            throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值为空字符串!");
         }
      }
      return txt.trim() ;
   }
   /**
    * 得到并设置元素的属性的正整数值
    * @param doc doc对象
    * @param elementName 元素名称
    * @param attrName 属性名称
    * @param attPropertyNameFix 属性名称前缀
    * @param min 最小值
    * @param max 最大值
    * @param setValue 同时设置值
    * @return 返回结果
    * @throws Exception  抛出异常
    */
   public Integer getSetAttrPlusInt(Document doc, String elementName, String attrName, String attPropertyNameFix, Integer min, Integer max, String setValue) throws Exception{
      Element e = this.checkAndGetElement(doc, elementName);
      return this.getSetAttrPlusInt(e, attrName, attPropertyNameFix, min, max, setValue) ;
   }
    /**
     * 检查元素是否存在
     * @param doc doc对象
     * @param elementName 元素名称
     * @return 返回结果  返回结果
     */
    public boolean existElement(Document doc, String elementName){
        if(doc == null){
            return false ;
        }
        if(elementName == null){
            return false ;
        }
        elementName = elementName.trim() ;
        if(elementName.equals("")){
            return false ;
        }
        Element e = this.get_element(doc, elementName) ;
        return e != null;
    }
   /**
    * 得到并设置元素的属性的正整数值
    * @param e 元素对象
    * @param attrName 属性名称
    * @param attPropertyNameFix 属性名称前缀
    * @param min 最小值
    * @param max 最大值
    * @param setValue 同时设置值
    * @return 返回结果
    * @throws Exception  抛出异常
    */
   public Integer getSetAttrPlusInt(Element e, String attrName, String attPropertyNameFix, Integer min, Integer max, String setValue) throws Exception{
      int v ;
      String txt = this.check_get_set_Attribute(e, e.getName(), attrName, attPropertyNameFix, setValue) ;
      if(!NumUtil.isPlusIntNumber(txt)){
         throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值不是正整数!");
      }
      v = Integer.parseInt(txt);
      if(min != null && v < min){
         throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值小于" + min + "!");
      }
      if(max != null && v > max){
         throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值大于" + max + "!");
      }
      return v ;
   }
   /**
    * 得到并设置元素的属性的整数值
    * @param doc doc对象
    * @param elementName 元素名称
    * @param attrName 属性名称
    * @param attPropertyNameFix 属性名称前缀
    * @param min 最小值
    * @param max 最大值
    * @param setValue 同时设置值
    * @return 返回结果
    * @throws Exception  抛出异常
    */
   public Integer getSetAttrInt(Document doc, String elementName, String attrName, String attPropertyNameFix, Integer min, Integer max, String setValue) throws Exception{
      Element e = this.checkAndGetElement(doc, elementName);
      return this.getSetAttrInt(e, attrName, attPropertyNameFix, min, max, setValue) ;
   }
   /**
    * 得到并设置元素的属性的整数值
    * @param e 元素对象
    * @param attrName 属性名称
    * @param attPropertyNameFix 属性名称前缀
    * @param min 最小值
    * @param max 最大值
    * @param setValue 同时设置值
    * @return 返回结果
    * @throws Exception  抛出异常
    */
   public Integer getSetAttrInt(Element e, String attrName, String attPropertyNameFix, Integer min, Integer max, String setValue) throws Exception{
      int v ;
      String txt = this.check_get_set_Attribute(e, e.getName(), attrName, attPropertyNameFix, setValue) ;
      if(!NumUtil.isIntNumber(txt)){
         throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值不是正整数!");
      }
      v = Integer.parseInt(txt) ;
      if(min != null && v < min){
         throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值小于" + min + "!");
      }
      if(max != null && v > max){
         throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值大于" + max + "!");
      }
      return v ;
   }
   /**
    * 得到并设置元素的属性的浮点数值
    * @param doc doc对象
    * @param elementName 元素名称
    * @param attrName 属性名称
    * @param min 最小值
    * @param max 最大值
    * @param setValue 同时设置值
    * @return 返回结果
    * @throws Exception  抛出异常
    */
   public Double getSetAttrPlusDouble(Document doc, String elementName, String attrName, String attPropertyNameFix, Double min, Double max, String setValue) throws Exception{
      Element e = this.checkAndGetElement(doc, elementName);
      return this.getSetAttrPlusDouble(e, attrName, attPropertyNameFix, min, max, setValue) ;
   }
   /**
    * 得到并设置元素的属性的正浮点数值
    * @param e 元素对象
    * @param attrName 属性名称
    * @param attPropertyNameFix 属性名称前缀
    * @param min 最小值
    * @param max 最大值
    * @param setValue 同时设置值
    * @return 返回结果
    * @throws Exception  抛出异常
    */
   public Double getSetAttrPlusDouble(Element e, String attrName, String attPropertyNameFix, Double min, Double max, String setValue) throws Exception{
      double v ;
      String txt = this.check_get_set_Attribute(e, e.getName(), attrName, attPropertyNameFix, setValue) ;
      if(!NumUtil.isPlusDoubleNumber(txt)){
         throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值不是正浮点数!");
      }
      v = Double.parseDouble(txt) ;
      if(min != null && v < min){
         throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值小于" + min + "!");
      }
      if(max != null && v > max){
         throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值大于" + max + "!");
      }
      return v ;
   }
   /**
    * 得到并设置元素的属性的浮点数值
    * @param doc doc对象
    * @param elementName 元素名称
    * @param attrName 属性名称
    * @param attPropertyNameFix 属性名称前缀
    * @param min 最小值
    * @param max 最大值
    * @param setValue 同时设置值
    * @return 返回结果
    * @throws Exception  抛出异常
    */
   public Double getSetAttrDouble(Document doc, String elementName, String attrName, String attPropertyNameFix, Double min, Double max, String setValue) throws Exception{
      Element e = this.checkAndGetElement(doc, elementName);
      return this.getSetAttrDouble(e, attrName, attPropertyNameFix, min, max, setValue) ;
   }
   /**
    * 得到并设置元素的属性的浮点数值
    * @param e 元素对象
    * @param attrName 属性名称
    * @param attPropertyNameFix 属性名称前缀
    * @param min 最小值
    * @param max 最大值
    * @param setValue 同时设置值
    * @return 返回结果
    * @throws Exception  抛出异常
    */
   public Double getSetAttrDouble(Element e, String attrName, String attPropertyNameFix, Double min, Double max, String setValue) throws Exception{
      double v ;
      String txt = this.check_get_set_Attribute(e, e.getName(), attrName, attPropertyNameFix, setValue) ;
      if(!NumUtil.isDoubleNumber(txt)){
         throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值不是正浮点数!");
      }
      v = Double.parseDouble(txt) ;
      if(min != null && v < min){
         throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值小于" + min + "!");
      }
      if(max != null && v > max){
         throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值大于" + max + "!");
      }
      return v ;
   }
   /**
    * 得到元素
    * @param doc doc对象
    * @param elementName 元素名称 元素名,形如"config.base.test"
    * @return 返回结果
    */
   private Element getElement(Document doc, String elementName){
      Element e = null ;
      Element root ;
      String nm ;
      String[] eNames = elementName.split("\\.") ;
      if(eNames.length > 0){
         root = doc.getRootElement() ;
         nm = root.getName() ;
         if(nm.equals(eNames[0].trim())){
            if(eNames.length == 1){
               e = root ;
            }else{
               e = this.getNextElement(root, eNames, 1) ;
            }
         }
      }
      return e ;
   }
   /**
    * 得到子元素
    * @param base 上级元素对象
    * @param eNames 元素名称
    * @param index 数组下标
    * @return 返回结果
    */
   private Element getNextElement(Element base, String[] eNames, int index){
      Element e = null ;
      String nm ;
      List<Element> list = base.getChildren() ;
      if(list != null && list.size() >0){
         for(Element el: list){
            nm = el.getName() ;
            if(nm.equals(eNames[index].trim())){
               if(eNames.length == index + 1){
                  e = el ;
               }else{
                  e = this.getNextElement(el, eNames, index + 1) ;
               }
               break ;
            }
         }
      }
      return e ;
   }
   /**
    * 检查并获元素
    * @param doc doc对象
    * @param elementName 元素名称
    * @return 返回结果
    * @throws Exception  抛出异常
    */
   private Element checkAndGetElement(Document doc, String elementName)throws Exception{
      if(doc == null){
         throw new Exception("配置文件的DOM对象为空!");
      }
      if(elementName == null){
         throw new Exception("元素名为空!");
      }
      elementName = elementName.trim() ;
      if(elementName.equals("")){
         throw new Exception("元素名为空!");
      }
      Element e = this.getElement(doc, elementName) ;
      if(e == null){
         throw new Exception("未得到名称为" + elementName + "的元素!");
      }
      return e ;
   }
   /**
    * 检查并获得并设置属性值
    * @param e 元素对象
    * @param elementName 元素名称
    * @param attrName 属性名称
    * @param attPropertyNameFix 属性名称前缀
    * @return 返回结果
    * @throws Exception  抛出异常
    */
   private String check_get_set_Attribute(Element e, String elementName, String attrName, String attPropertyNameFix, String setValue)throws Exception{
      if(attrName == null){
         throw new Exception("属性名为空!");
      }
      attrName = attrName.trim() ;
      if(attrName.equals("")){
         throw new Exception("属性名为空!");
      }
      String txt = this.get_set_AttributTxt(e, attrName, attPropertyNameFix, setValue) ;
      if(txt == null){
         throw new Exception("未得到元素" + elementName + "的属性" + attrName + "的值!");
      }
      return txt ;
   }
   /**
    * 得到并设置属性配置值
    * @param e 元素对象
    * @param attName 属性名称
    * @param attPropertyNameFix 属性名称前缀
    * @param setValue 同时设置值
    * @return 返回结果
    */
   private String get_set_AttributTxt(Element e, String attName, String attPropertyNameFix, String setValue){
      String txt = null ;
      if(e != null && attName != null){
         attName = attName.trim() ;
         if(!attName.equals("")){
            txt = e.getAttributeValue(attName) ;
            if(setValue != null){
               e.setAttribute(attName, setValue) ;
            }
         }
      }
      if(txt != null && txt.startsWith("${") && txt.endsWith("}")){
         txt = txt.substring(2, txt.length() - 1) ;
         if(attPropertyNameFix != null){
            txt = txt + attPropertyNameFix ;
         }
         txt = ConfigProperties.getConfig(txt) ;
      }
      return txt ;
   }
    /**
     * 得到并设置元素的属性的布尔值
     * @param doc doc对象
     * @param elementName 元素名称
     * @param attrName 属性名称
     * @param attPropertyNameFix 属性名称前缀
     * @param setValue 同时设置值
     * @return 返回结果
     * @throws Exception  抛出异常
     */
    public boolean getSetAttrBoolean(Document doc, String elementName, String attrName, String attPropertyNameFix, String setValue) throws Exception{
        String txt = this.getSetAttrTxt(doc, elementName, attrName, attPropertyNameFix, false, setValue) ;
        return txt.equalsIgnoreCase("true");
    }
    /**
     * 得到并设置元素的属性的布尔值
     * @param e 元素对象
     * @param attrName 属性名称
     * @param attPropertyNameFix 属性名称前缀
     * @param setValue 同时设置值
     * @return 返回结果
     * @throws Exception  抛出异常
     */
    public boolean getSetAttrBoolean(Element e, String attrName, String attPropertyNameFix, String setValue) throws Exception{
        String txt = this.getSetAttrTxt(e, attrName, attPropertyNameFix, false, setValue) ;
        return txt.equalsIgnoreCase("true");
    }
    /**
     * 得到并设置元素的属性的字符串值
     * @param doc doc对象
     * @param elementName 元素名称
     * @param attrName 属性名称
     * @param attPropertyNameFix 属性名称前缀
     * @param canBlank 是否可为空
     * @param setValue 同时设置值
     * @return 返回结果
     * @throws Exception  抛出异常
     */
    public String getSetAttrTxt(Document doc, String elementName, String attrName, String attPropertyNameFix, Boolean canBlank, String setValue) throws Exception{
        Element e = this.check_and_get_element(doc, elementName);
        return this.getSetAttrTxt(e, attrName, attPropertyNameFix, canBlank, setValue) ;
    }
    /**
     * 得到并设置元素的属性的字符串值
     * @param e 元素对象
     * @param attrName 属性名称
     * @param attPropertyNameFix 属性名称前缀
     * @param canBlank 是否可为空
     * @param setValue 同时设置值
     * @return 返回结果
     * @throws Exception  抛出异常
     */
    public String getSetAttrTxt(Element e, String attrName, String attPropertyNameFix, Boolean canBlank, String setValue) throws Exception{
        String txt = this.check_get_set_Attribute(e, e.getName(), attrName, attPropertyNameFix, setValue) ;
        if(!canBlank){
            if(txt.trim().equals("")){
                throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值为空字符串!");
            }
        }
        return txt.trim() ;
    }
    /**
     * 得到并设置元素的属性的正整数值
     * @param doc doc对象
     * @param elementName 元素名称
     * @param attrName 属性名称
     * @param attPropertyNameFix 属性名称前缀
     * @param min 最小值
     * @param max 最大值
     * @param setValue 同时设置值
     * @return 返回结果
     * @throws Exception  抛出异常
     */
    public Integer getSetAttrPlusInt(Document doc, String elementName, String attrName, String attPropertyNameFix, Integer min, Integer max, String setValue) throws Exception{
        Element e = this.check_and_get_element(doc, elementName);
        return this.getSetAttrPlusInt(e, attrName, attPropertyNameFix, min, max, setValue) ;
    }
    /**
     * 得到并设置元素的属性的正整数值
     * @param e 元素对象
     * @param attrName 属性名称
     * @param attPropertyNameFix 属性名称前缀
     * @param min 最小值
     * @param max 最大值
     * @param setValue 同时设置值
     * @return 返回结果
     * @throws Exception  抛出异常
     */
    public Integer getSetAttrPlusInt(Element e, String attrName, String attPropertyNameFix, Integer min, Integer max, String setValue) throws Exception{
        int v ;
        String txt = this.check_get_set_Attribute(e, e.getName(), attrName, attPropertyNameFix, setValue) ;
        if(!NumUtil.isPlusIntNumber(txt)){
            throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值不是正整数!");
        }
        v = Integer.parseInt(txt);
        if(min != null && v < min){
            throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值小于" + min + "!");
        }
        if(max != null && v > max){
            throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值大于" + max + "!");
        }
        return v ;
    }
    /**
     * 得到并设置元素的属性的整数值
     * @param doc doc对象
     * @param elementName 元素名称
     * @param attrName 属性名称
     * @param attPropertyNameFix 属性名称前缀
     * @param min 最小值
     * @param max 最大值
     * @param setValue 同时设置值
     * @return 返回结果
     * @throws Exception  抛出异常
     */
    public Integer getSetAttrInt(Document doc, String elementName, String attrName, String attPropertyNameFix, Integer min, Integer max, String setValue) throws Exception{
        Element e = this.check_and_get_element(doc, elementName);
        return this.getSetAttrInt(e, attrName, attPropertyNameFix, min, max, setValue) ;
    }
    /**
     * 得到并设置元素的属性的整数值
     * @param e 元素对象
     * @param attrName 属性名称
     * @param attPropertyNameFix 属性名称前缀
     * @param min 最小值
     * @param max 最大值
     * @param setValue 同时设置值
     * @return 返回结果
     * @throws Exception  抛出异常
     */
    public Integer getSetAttrInt(Element e, String attrName, String attPropertyNameFix, Integer min, Integer max, String setValue) throws Exception{
        int v ;
        String txt = this.check_get_set_Attribute(e, e.getName(), attrName, attPropertyNameFix, setValue) ;
        if(!NumUtil.isIntNumber(txt)){
            throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值不是正整数!");
        }
        v = Integer.parseInt(txt) ;
        if(min != null && v < min){
            throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值小于" + min + "!");
        }
        if(max != null && v > max){
            throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值大于" + max + "!");
        }
        return v ;
    }
    /**
     * 得到并设置元素的属性的浮点数值
     * @param doc doc对象
     * @param elementName 元素名称
     * @param attrName 属性名称
     * @param min 最小值
     * @param max 最大值
     * @param setValue 同时设置值
     * @return 返回结果
     * @throws Exception  抛出异常
     */
    public Double getSetAttrPlusDouble(Document doc, String elementName, String attrName, String attPropertyNameFix, Double min, Double max, String setValue) throws Exception{
        Element e = this.check_and_get_element(doc, elementName);
        return this.getSetAttrPlusDouble(e, attrName, attPropertyNameFix, min, max, setValue) ;
    }
    /**
     * 得到并设置元素的属性的正浮点数值
     * @param e 元素对象
     * @param attrName 属性名称
     * @param attPropertyNameFix 属性名称前缀
     * @param min 最小值
     * @param max 最大值
     * @param setValue 同时设置值
     * @return 返回结果
     * @throws Exception  抛出异常
     */
    public Double getSetAttrPlusDouble(Element e, String attrName, String attPropertyNameFix, Double min, Double max, String setValue) throws Exception{
        double v ;
        String txt = this.check_get_set_Attribute(e, e.getName(), attrName, attPropertyNameFix, setValue) ;
        if(!NumUtil.isPlusDoubleNumber(txt)){
            throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值不是正浮点数!");
        }
        v = Double.parseDouble(txt) ;
        if(min != null && v < min){
            throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值小于" + min + "!");
        }
        if(max != null && v > max){
            throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值大于" + max + "!");
        }
        return v ;
    }
    /**
     * 得到并设置元素的属性的浮点数值
     * @param doc doc对象
     * @param elementName 元素名称
     * @param attrName 属性名称
     * @param attPropertyNameFix 属性名称前缀
     * @param min 最小值
     * @param max 最大值
     * @param setValue 同时设置值
     * @return 返回结果
     * @throws Exception  抛出异常
     */
    public Double getSetAttrDouble(Document doc, String elementName, String attrName, String attPropertyNameFix, Double min, Double max, String setValue) throws Exception{
        Element e = this.check_and_get_element(doc, elementName);
        return this.getSetAttrDouble(e, attrName, attPropertyNameFix, min, max, setValue) ;
    }
    /**
     * 得到并设置元素的属性的浮点数值
     * @param e 元素对象
     * @param attrName 属性名称
     * @param attPropertyNameFix 属性名称前缀
     * @param min 最小值
     * @param max 最大值
     * @param setValue 同时设置值
     * @return 返回结果
     * @throws Exception  抛出异常
     */
    public Double getSetAttrDouble(Element e, String attrName, String attPropertyNameFix, Double min, Double max, String setValue) throws Exception{
        double v ;
        String txt = this.check_get_set_Attribute(e, e.getName(), attrName, attPropertyNameFix, setValue) ;
        if(!NumUtil.isDoubleNumber(txt)){
            throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值不是正浮点数!");
        }
        v = Double.parseDouble(txt) ;
        if(min != null && v < min){
            throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值小于" + min + "!");
        }
        if(max != null && v > max){
            throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值大于" + max + "!");
        }
        return v ;
    }
    /**
     * 得到元素
     * @param doc doc对象
     * @param elementName 元素名称 元素名,形如"config.base.test"
     * @return 返回结果
     */
    private Element get_element(Document doc, String elementName){
        Element e = null ;
        Element root ;
        String nm ;
        String[] eNames = elementName.split("\\.") ;
        if(eNames.length > 0){
            root = doc.getRootElement() ;
            nm = root.getName() ;
            if(nm.equals(eNames[0].trim())){
                if(eNames.length == 1){
                    e = root ;
                }else{
                    e = this.get_next_element(root, eNames, 1) ;
                }
            }
        }
        return e ;
    }
    /**
     * 得到子元素
     * @param base 上级元素对象
     * @param eNames 元素名称
     * @param index 数组下标
     * @return 返回结果
     */
    private Element get_next_element(Element base, String[] eNames, int index){
        Element e = null ;
        String nm ;
        List<Element> list = base.getChildren() ;
        if(list != null && list.size() >0){
            for(Element el: list){
                nm = el.getName() ;
                if(nm.equals(eNames[index].trim())){
                    if(eNames.length == index + 1){
                        e = el ;
                    }else{
                        e = this.get_next_element(el, eNames, index + 1) ;
                    }
                    break ;
                }
            }
        }
        return e ;
    }
    /**
     * 检查并获元素
     * @param doc doc对象
     * @param elementName 元素名称
     * @return 返回结果
     * @throws Exception  抛出异常
     */
    private Element check_and_get_element(Document doc, String elementName)throws Exception{
        if(doc == null){
            throw new Exception("配置文件的DOM对象为空!");
        }
        if(elementName == null){
            throw new Exception("元素名为空!");
        }
        elementName = elementName.trim() ;
        if(elementName.equals("")){
            throw new Exception("元素名为空!");
        }
        Element e = this.get_element(doc, elementName) ;
        if(e == null){
            throw new Exception("未得到名称为" + elementName + "的元素!");
        }
        return e ;
    }
    /**
     * 检查并获得并设置属性值
     * @param e 元素对象
     * @param elementName 元素名称
     * @param attrName 属性名称
     * @param attPropertyNameFix 属性名称前缀
     * @return 返回结果
     * @throws Exception  抛出异常
     */
    private String check_get_set_Attribute(Element e, String elementName, String attrName, String attPropertyNameFix, String setValue)throws Exception{
        if(attrName == null){
            throw new Exception("属性名为空!");
        }
        attrName = attrName.trim() ;
        if(attrName.equals("")){
            throw new Exception("属性名为空!");
        }
        String txt = this.get_set_AttributTxt(e, attrName, attPropertyNameFix, setValue) ;
        if(txt == null){
            throw new Exception("未得到元素" + elementName + "的属性" + attrName + "的值!");
        }
        return txt ;
    }
    /**
     * 得到并设置属性配置值
     * @param e 元素对象
     * @param attName 属性名称
     * @param attPropertyNameFix 属性名称前缀
     * @param setValue 同时设置值
     * @return 返回结果
     */
    private String get_set_AttributTxt(Element e, String attName, String attPropertyNameFix, String setValue){
        String txt = null ;
        if(e != null && attName != null){
            attName = attName.trim() ;
            if(!attName.equals("")){
                txt = e.getAttributeValue(attName) ;
                if(setValue != null){
                    e.setAttribute(attName, setValue) ;
                }
            }
        }
        if(txt != null && txt.startsWith("${") && txt.endsWith("}")){
            txt = txt.substring(2, txt.length() - 1) ;
            if(attPropertyNameFix != null){
                txt = txt + attPropertyNameFix ;
            }
            txt = ConfigProperties.getConfig(txt) ;
        }
        return txt ;
    }
}