| New file | 
|  |  |  | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | import org.springframework.core.io.Resource; | 
|---|
|  |  |  | import org.springframework.core.io.ResourceLoader; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public class TreeParse { | 
|---|
|  |  |  | public List<String> ids ; | 
|---|
|  |  |  | public List<String> classes ; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //   public static void main(String args[]) { | 
|---|
|  |  |  | //      TreeParse o = new TreeParse(); | 
|---|
|  |  |  | //      TreeConfig conf = o.parseConfig(); | 
|---|
|  |  |  | //   } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public TreeParse(){ | 
|---|
|  |  |  | ids = new ArrayList<String>() ; | 
|---|
|  |  |  | classes = new ArrayList<String>() ; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 解析处理器配置 | 
|---|
|  |  |  | * @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 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | protected TreeConfig parseConfig(ResourceLoader resourceLoader) { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | Resource resource = resourceLoader.getResource("classpath:RtuDataDealTree.xml"); | 
|---|
|  |  |  | URL configFileURL = resource.getURL() ; | 
|---|
|  |  |  | 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<String> | 
|---|
|  |  |  | * @throws Exception | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | private TreeConfig parse(Document doc) throws Exception { | 
|---|
|  |  |  | Element root = doc.getRootElement(); | 
|---|
|  |  |  | if (root == null) { | 
|---|
|  |  |  | throw new Exception("未得到上行数据处理任务配置文件根元素project!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<Element> 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 { | 
|---|
|  |  |  | //      <task id="task2.1" name="构造数据" enable="true" class="" /> | 
|---|
|  |  |  | 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接口!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|