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