package com.dy.rtuMw.server.rtuData; import java.net.URL; import java.util.*; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.input.SAXBuilder; public class TreeParse { public List ids ; public List classes ; // public static void main(String args[]) { // TreeParse o = new TreeParse(); // TreeConfig conf = o.parseConfig(); // } public TreeParse(){ ids = new ArrayList() ; classes = new ArrayList() ; } /** * 解析处理器配置 * @return */ protected TreeConfig parseConfig() { try { ClassLoader classLoader = ClassLoader.getSystemClassLoader(); URL configFileURL = classLoader.getResource("RtuDataDealTree.xml"); return this.parse(this.createDom(configFileURL)) ; } catch (Exception e) { System.out.println("系统启动时,初始上行数据处理任务配置出错 !"); System.out.println(e.getMessage()); e.printStackTrace(); return null; } } /** * * @return */ private Document createDom(URL configFileURL) throws Exception { if (configFileURL == null) { throw new Exception("未得到上行数据处理任务配置文件!", null); } Document doc = null; 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; } /** * 分析 * @return ArrayList * @throws Exception */ private TreeConfig parse(Document doc) throws Exception { Element root = doc.getRootElement(); if (root == null) { throw new Exception("未得到上行数据处理任务配置文件根元素project!"); } List rootTasks = root.getChildren("task") ; if(rootTasks == null || rootTasks.size() == 0){ throw new Exception("未得到上行数据处理任务配置文件根任务task!"); } if(rootTasks.size() > 1){ throw new Exception("未得到上行数据处理任务配置文件根任务task必须只有一个!"); } TreeConfig tree = new TreeConfig() ; tree.taskConf = new TaskConfig() ; this.parseNode(rootTasks.get(0), tree, tree.taskConf) ; return tree ; } private void parseNode(Element taskEle, TreeConfig me, TaskConfig taskConf)throws Exception { // if(taskEle == null){ throw new Exception("分析上行数据处理任务配置文件出错!"); } String id = taskEle.getAttributeValue("id") ; if(id == null || id.trim().equals("")){ throw new Exception("上行数据处理任务配置文件中id必须配置!"); } id = id.trim() ; if(ids.contains(id)){ throw new Exception("上行数据处理任务配置文件中id=" + id + "重复配置!"); } taskConf.id = id ; ids.add(id) ; String name = taskEle.getAttributeValue("name") ; if(name == null || name.trim().equals("")){ throw new Exception("上行数据处理任务配置文件中name必须配置!"); } name = name.trim() ; taskConf.name = name ; String enable = taskEle.getAttributeValue("enable") ; if(enable == null || !(enable.trim().equals("true") || enable.trim().equals("false"))){ throw new Exception("上行数据处理任务配置文件中enable必须配置,并且值只能为true或false!"); } if(enable.trim().equals("true")){ taskConf.enable = true ; } if(enable.trim().equals("false")){ taskConf.enable = false ; } String clazz = taskEle.getAttributeValue("class") ; if(clazz == null || clazz.trim().equals("")){ throw new Exception("上行数据处理任务配置文件中class必须配置!"); } clazz = clazz.trim() ; if(classes.contains(clazz)){ throw new Exception("上行数据处理任务配置文件中class=" + clazz + "重复配置!"); } taskConf.clazz = clazz ; classes.add(clazz) ; this.checkClass(taskConf.clazz) ; this.parseSubNode(taskEle, me) ; } private void parseSubNode(Element ele, TreeConfig parent)throws Exception { List list = ele.getChildren("task") ; if(list != null && list.size() > 0){ parent.subTreeConfs = new TreeConfig[list.size()] ; Iterator it = list.iterator(); Element e = null; int count = 0 ; TreeConfig me ; while(it.hasNext()){ e = (Element) it.next(); me = new TreeConfig() ; me.taskConf = new TaskConfig() ; parent.subTreeConfs[count++] = me ; parseNode(e, me, me.taskConf) ; } } } private void checkClass(String clazz)throws Exception { Class c = Class.forName(clazz); if (c == null) { throw new Exception("上行数据处理任务配置文件中不能实例化class=" + clazz + "!"); }else{ Object o = c.getDeclaredConstructor().newInstance(); //Object o = c.newInstance(); if(!(o instanceof Task)){ throw new Exception("上行数据处理任务配置文件中class=" + clazz + "必须实现Task接口!"); } } } }