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接口!"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |