# flowgraph-to-tree **Repository Path**: xiaofan012_admin/flowgraph-to-tree ## Basic Information - **Project Name**: flowgraph-to-tree - **Description**: java实现,将批流图转换为以开始节点为根的树结构,方便后续做输出使用 - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-01 - **Last Updated**: 2026-02-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Flowgraph to Tree Converter 这是一个将流程图(Flowgraph)转换为树形结构的Java应用程序。该项目基于JDK8和Maven构建。 ## 功能特性 - 解析XML格式的流程图定义 - 识别流程图中的并行分支(Fork)和汇聚节点(Join) - 将复杂的流程图转换为易于理解的树形结构表示 - 支持多种节点类型:开始事件、结束事件和任务节点 - **版本v1.0限制**:不允许一个节点同时有多输入和多输出(即一个节点不能既是fork又是join) ## 项目结构 ``` pro07-flowgraph-to-tree/ ├── pom.xml ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ ├── com/example/parser/ │ │ │ │ ├── ParserUtil.java │ │ │ │ └── util/ │ │ │ │ └── XmlReadUtil.java │ │ │ └── com/example/parser/vo/ │ │ │ ├── GraphNode.java │ │ │ ├── SimpleNode.java │ │ │ ├── SequenceNode.java │ │ │ ├── ParallelNode.java │ │ │ ├── SequenceType.java │ │ │ ├── NodeInOutCnt.java │ │ │ └── XmlEle.java │ │ └── resources/ │ │ └── datas_v4.xml ├── src/test/java/com/example/parser/ │ └── ParserUtilTest.java ``` ## 编译和运行 ### 编译项目 ```bash mvn clean compile ``` ### 运行测试 ```bash mvn test ``` 或者直接运行测试类: ```bash mvn exec:java -Dexec.mainClass="com.example.parser.ParserUtilTest" ``` ## 核心类说明 - `ParserUtil`: 主要的解析器工具类,负责读取XML并执行图到树的转换,支持并行处理 - `XmlReadUtil`: XML读取工具类,负责解析XML文件或XML字符串为XmlEle对象 - `XmlEle`: 封装XML元素的基本信息(type, attrMap, children, id, value) - `GraphNode`: 表示流程图中的节点,存储XML元素的attrMap - `SimpleNode`: GraphNode的简单实现 - `SequenceNode`: 表示顺序执行的节点序列 - `ParallelNode`: 表示并行执行的节点组 - `SequenceType`: 定义序列类型的枚举 - `NodeInOutCnt`: 节点进出计数类 - `XmlEle`: XML元素类 - `ParserUtilTest`: 单元测试类,验证ParserUtil的功能 - `XmlReadUtilTest`: XML读取工具类的单元测试,验证XML字符串解析功能 ## 依赖库 - `Lombok`: 用于减少样板代码(getter、setter、构造函数等) - `JUnit`: 用于单元测试 ## 输入格式 程序接受XML格式的流程图定义,包含以下元素: - `startEvent`: 开始事件 - `endEvent`: 结束事件 - `task`: 任务节点 - `sequenceFlow`: 顺序流(连接) ## 输出格式 程序输出转换后的树形结构,其中: - `[[THEN]]` 表示顺序执行 - `{ }` 表示并行执行的分支 - `[ ]` 表示顺序执行的节点序列 ## 示例输出解释 ``` start,end >> [start, A, { [B1], [B2] }, C, D, { [D1, D2], [E1, E2], [F1, F2] }, K, end] ``` 这表示从start到end的完整流程,其中A之后是并行分支{[B1], [B2]},然后是C、D,接着是另一个并行分支{[D1, D2], [E1, E2], [F1, F2]},最后是K和end。 ## 版本信息 **v1.0** - 当前版本 - 完成了所有核心功能 - 支持从文件和字符串解析XML - 实现了流程图到树的转换 - **限制**:不允许一个节点同时有多输入和多输出(即一个节点不能既是fork又是join) ## 架构优化 本次重构的主要改进: 1. 引入XmlEle类来封装XML元素信息 2. 移除了GraphEdge类,将连接直接转为节点引用 3. 将值对象分离到vo包中,提高代码模块化程度 4. 优化了XML解析过程,先解析为XmlEle对象,再转换为GraphNode 5. 将XML读取功能抽取到XmlReadUtil类中,实现职责分离 6. GraphNode现在存储XML元素的attrMap,避免属性丢失 7. 引入Lombok库,减少样板代码(getter、setter、构造函数等) 8. 重构为明确的6个主步骤,提升代码可读性 9. 移除了多余的ProcessResult中间类,直接返回SequenceNode 10. 将Parser类重构为纯工具类(ParserUtil),移除所有成员变量 11. 支持并行处理,提高性能 12. 优化方法拆分粒度,提升代码可读性 13. 将joinNodeCntMap和forkNodeCntMap改为Set结构,提高内存效率 14. 移除了parseGraphToTree方法中不必要的邻接表生成,提高性能 15. 移除了convertXmlElesToGraphNodes方法中不必要的startNode和endNode逻辑,简化代码 16. 移除了ParserUtil中的main方法,改为专门的单元测试,提高代码规范性 17. 优化了connectNodes方法中的比较逻辑,使用引用比较代替ID比较,提高性能 18. 为XmlReadUtil类增加了直接读取XML字符串的方法,增强灵活性