# PrDecompose **Repository Path**: for-gradutation/CoRA ## Basic Information - **Project Name**: PrDecompose - **Description**: Changesets Decomposition - **Primary Language**: Java - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-03-16 - **Last Updated**: 2022-05-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 介绍 Q: How to get partitions? A: Access localhost:8089/decompose?oldDir=xxx&newDir=xxx (i.e. localhost:8089/decompose?oldDir=D:/Old&newDir=D:/New) Q: What is the implementation process? A: PR Changesets -> Code-Diff(use GumTree tool) -> Dependency Analysis & Similarity Analysis(use APTED tool) -> DFS algorithm -> Partitions ### 项目结构说明 │ Application.java │ ├─Analyzer │ DependencyAnalyzer.java │ SimilarityAnalyzer.java │ ├─DataStructure │ ChangeLevel.java │ Cluster.java │ DiffGraph.java │ DiffRegion.java │ EdgeType.java │ FileInfo.java │ LineInfo.java │ OperationType.java │ TrivalType.java │ ├─Generator │ ClusterGenerator.java │ GraphGenerator.java │ └─Request ResultBuilder.java StatusCode.java Application.java是服务启动类。 Analyzer包含依赖分析和相似度分析,这两个类检查代码变更之间是否关联。 DataStructure包含自定义的数据结构,比较核心的是DiffGraph和DiffRegion类,DiffRegion类存储某个代码变更的信息, DiffGraph存储评审变更集中的所有代码变更(一个元素类型为DiffRegion的List)。此外,Cluster类存储了某个分区的数据, 每个评审变更集分解后存在至少一个分区。 Generator包含Cluster生成器和DiffGraph生成器,ClusterGenerator使用DFS算法获取DiffGraph中所有的极大连通子图, GraphGenerator从评审变更集中抽取所有的代码变更并处理信息转换为DiffRegion实例。 Request包含的两个类用于封装分解结果(即分区数据)为Json对象。 ### 整体逻辑 输入:代码评审变更集在服务器上的绝对路径,有旧版本和新版本两个路径 处理顺序:(1)使用GraphGenerator获取所有代码变更并转换为DiffRegion实例,并将所有DiffRegion实例插入DiffGraph实例 (2)使用Analyzer中的两个分析器对DiffGraph实例中的DiffRegion实例进行分析,寻找关联的DiffRegion实例并在它们之间建立边 (3)使用ClusterGenerator搜索DiffGraph实例以生成分区,相当于对图进行切割,直接或间接关联的节点在一个分区中,不关联的在不同分区 (4)使用ResultBuilder封装分区数据为Json对象 输出:HTTP响应数据(Json对象) ### 服务部署说明 JDK版本:11 (外部依赖限制版本为11) 端口号:8089 (由resources/application.properties文件配置) 启动类:Application.java