项目结构变更

This commit is contained in:
2026-06-09 11:20:24 +08:00
parent fb6cd124c8
commit 871823b3da
45 changed files with 222 additions and 223 deletions

View File

@@ -1,15 +1,15 @@
package com.aicheck;
package com.codechecker;
import com.aicheck.analyzer.ClassChangeAnalyzer;
import com.aicheck.analyzer.EndpointIndexBuilder;
import com.aicheck.api.analyzer.ApiChangeAnalyzer;
import com.aicheck.api.model.EndpointChangeReport;
import com.aicheck.api.notify.ApiChangeNotifier;
import com.aicheck.config.AppConfig;
import com.aicheck.git.GitChangeScanner;
import com.aicheck.model.ApiEndpoint;
import com.aicheck.model.ClassChangeReport;
import com.aicheck.notify.WeComNotifier;
import com.codechecker.analyzer.ClassChangeAnalyzer;
import com.codechecker.analyzer.EndpointIndexBuilder;
import com.codechecker.api.analyzer.ApiChangeAnalyzer;
import com.codechecker.api.model.EndpointChangeReport;
import com.codechecker.api.notify.ApiChangeNotifier;
import com.codechecker.config.AppConfig;
import com.codechecker.git.GitChangeScanner;
import com.codechecker.model.ApiEndpoint;
import com.codechecker.model.ClassChangeReport;
import com.codechecker.notify.WeComNotifier;
import picocli.CommandLine;
import picocli.CommandLine.Command;
import picocli.CommandLine.Option;
@@ -22,9 +22,9 @@ import java.util.concurrent.Callable;
/**
* CLI 入口加载配置 扫描 git 变更 分析影响 输出/发送企微通知
*/
@Command(name = "class-checker", mixinStandardHelpOptions = true,
@Command(name = "code-checker", mixinStandardHelpOptions = true,
description = "检测类变更与 API 变更并发送企业微信通知")
public class ClassCheckMain implements Callable<Integer> {
public class CodeCheckMain implements Callable<Integer> {
@Option(names = "--config", required = true, description = "配置文件路径")
private Path config;
@@ -45,7 +45,7 @@ public class ClassCheckMain implements Callable<Integer> {
/** 程序入口 */
public static void main(String[] args) {
int exitCode = new CommandLine(new ClassCheckMain()).execute(args);
int exitCode = new CommandLine(new CodeCheckMain()).execute(args);
System.exit(exitCode);
}
@@ -53,17 +53,22 @@ public class ClassCheckMain implements Callable<Integer> {
@Override
public Integer call() throws Exception {
AppConfig appConfig = AppConfig.load(config.toAbsolutePath());
if (!appConfig.isMasterEnabled()) {
System.out.println("变更检测已全部关闭checker.enabled=false");
return 0;
}
GitChangeScanner gitScanner = new GitChangeScanner(repoRoot.toAbsolutePath());
int totalSent = 0;
if (appConfig.isEnabled()) {
totalSent += runClassChangeCheck(appConfig, gitScanner);
if (appConfig.isClassCheckEnabled()) {
totalSent += executeClassCheck(appConfig, gitScanner);
} else {
System.out.println("类变更检测已关闭class_check.enabled=false");
}
if (appConfig.isApiCheckEnabled()) {
totalSent += runApiChangeCheck(appConfig, gitScanner);
totalSent += executeApiCheck(appConfig, gitScanner);
} else {
System.out.println("API 变更检测已关闭api_check.enabled=false");
}
@@ -74,7 +79,7 @@ public class ClassCheckMain implements Callable<Integer> {
return 0;
}
private int runClassChangeCheck(AppConfig appConfig, GitChangeScanner gitScanner) throws Exception {
private int executeClassCheck(AppConfig appConfig, GitChangeScanner gitScanner) throws Exception {
System.out.println("=== 类变更检测 ===");
EndpointIndexBuilder indexBuilder = new EndpointIndexBuilder();
Map<String, ApiEndpoint> endpointIndex = indexBuilder.buildIndex(repoRoot.toAbsolutePath(), appConfig);
@@ -95,7 +100,7 @@ public class ClassCheckMain implements Callable<Integer> {
return reports.size();
}
private int runApiChangeCheck(AppConfig appConfig, GitChangeScanner gitScanner) throws Exception {
private int executeApiCheck(AppConfig appConfig, GitChangeScanner gitScanner) throws Exception {
System.out.println("=== API 变更检测 ===");
ApiChangeAnalyzer analyzer = new ApiChangeAnalyzer(gitScanner);
List<EndpointChangeReport> reports = analyzer.analyze(

View File

@@ -1,14 +1,14 @@
package com.aicheck.analyzer;
package com.codechecker.analyzer;
import com.aicheck.config.AppConfig;
import com.aicheck.git.GitChangeScanner;
import com.aicheck.model.ChangedClassFile;
import com.aicheck.model.ClassChangeKind;
import com.aicheck.model.ClassChangeReport;
import com.aicheck.model.FieldChange;
import com.aicheck.model.FieldInfo;
import com.aicheck.parser.ClassDeclParser;
import com.aicheck.parser.ClassFieldParser;
import com.codechecker.config.AppConfig;
import com.codechecker.git.GitChangeScanner;
import com.codechecker.model.ChangedClassFile;
import com.codechecker.model.ClassChangeKind;
import com.codechecker.model.ClassChangeReport;
import com.codechecker.model.FieldChange;
import com.codechecker.model.FieldInfo;
import com.codechecker.parser.ClassDeclParser;
import com.codechecker.parser.ClassFieldParser;
import java.io.IOException;
import java.nio.file.Path;
@@ -32,7 +32,7 @@ public class ClassChangeAnalyzer {
/** 扫描变更文件并逐条分析,无实质变更的 MODIFIED 会被跳过 */
public List<ClassChangeReport> analyze(Path repoRoot, AppConfig config, String oldSha, String newSha,
Map<String, com.aicheck.model.ApiEndpoint> endpointIndex) throws IOException {
Map<String, com.codechecker.model.ApiEndpoint> endpointIndex) throws IOException {
List<ChangedClassFile> changedFiles = gitScanner.scanChangedClasses(oldSha, newSha);
List<ClassChangeReport> reports = new ArrayList<>();
@@ -51,7 +51,7 @@ public class ClassChangeAnalyzer {
/** 处理删除:标记 DELETED 并分析影响(基于旧源码) */
private ClassChangeReport analyzeDeleted(ChangedClassFile changedFile, AppConfig config, Path repoRoot,
String oldSha, Map<String, com.aicheck.model.ApiEndpoint> endpointIndex)
String oldSha, Map<String, com.codechecker.model.ApiEndpoint> endpointIndex)
throws IOException {
String path = changedFile.getRelativePath();
String oldSource = gitScanner.readFileAtCommit(oldSha, path);
@@ -75,7 +75,7 @@ public class ClassChangeAnalyzer {
/** 处理修改/重命名:字段 diff → 判定 changeKind → 影响分析 */
private ClassChangeReport analyzeModifiedOrRenamed(ChangedClassFile changedFile, AppConfig config,
Path repoRoot, String oldSha, String newSha,
Map<String, com.aicheck.model.ApiEndpoint> endpointIndex)
Map<String, com.codechecker.model.ApiEndpoint> endpointIndex)
throws IOException {
String oldPath = changedFile.pathForOldCommit();
String newPath = changedFile.getRelativePath();

View File

@@ -1,8 +1,8 @@
package com.aicheck.analyzer;
package com.codechecker.analyzer;
import com.aicheck.config.AppConfig;
import com.aicheck.model.ApiEndpoint;
import com.aicheck.parser.EndpointParser;
import com.codechecker.config.AppConfig;
import com.codechecker.model.ApiEndpoint;
import com.codechecker.parser.EndpointParser;
import java.io.IOException;
import java.nio.file.Path;

View File

@@ -1,7 +1,7 @@
package com.aicheck.analyzer;
package com.codechecker.analyzer;
import com.aicheck.model.FieldChange;
import com.aicheck.model.FieldInfo;
import com.codechecker.model.FieldChange;
import com.codechecker.model.FieldInfo;
import java.util.ArrayList;
import java.util.LinkedHashMap;

View File

@@ -1,10 +1,10 @@
package com.aicheck.analyzer;
package com.codechecker.analyzer;
import com.aicheck.config.AppConfig;
import com.aicheck.model.ApiEndpoint;
import com.aicheck.model.ClassChangeReport;
import com.aicheck.model.ClassType;
import com.aicheck.parser.ConversionParser;
import com.codechecker.config.AppConfig;
import com.codechecker.model.ApiEndpoint;
import com.codechecker.model.ClassChangeReport;
import com.codechecker.model.ClassType;
import com.codechecker.parser.ConversionParser;
import java.io.IOException;
import java.nio.file.Path;

View File

@@ -1,11 +1,11 @@
package com.aicheck.api.analyzer;
package com.codechecker.api.analyzer;
import com.aicheck.api.model.EndpointChangeReport;
import com.aicheck.api.model.EndpointSnapshot;
import com.aicheck.api.parser.EndpointSnapshotParser;
import com.aicheck.api.scanner.ApiFileChangeScanner;
import com.aicheck.config.AppConfig;
import com.aicheck.git.GitChangeScanner;
import com.codechecker.api.model.EndpointChangeReport;
import com.codechecker.api.model.EndpointSnapshot;
import com.codechecker.api.parser.EndpointSnapshotParser;
import com.codechecker.api.scanner.ApiFileChangeScanner;
import com.codechecker.config.AppConfig;
import com.codechecker.git.GitChangeScanner;
import java.io.IOException;
import java.nio.file.Path;
@@ -13,7 +13,7 @@ import java.util.ArrayList;
import java.util.List;
/**
* API 变更分析编排 {@link com.aicheck.analyzer.ClassChangeAnalyzer} 平行互不调用
* API 变更分析编排 {@link com.codechecker.analyzer.ClassChangeAnalyzer} 平行互不调用
*/
public class ApiChangeAnalyzer {
private final GitChangeScanner gitScanner;

View File

@@ -1,9 +1,9 @@
package com.aicheck.api.analyzer;
package com.codechecker.api.analyzer;
import com.aicheck.api.model.ApiChangeKind;
import com.aicheck.api.model.EndpointChangeReport;
import com.aicheck.api.model.EndpointSnapshot;
import com.aicheck.api.model.ParameterChange;
import com.codechecker.api.model.ApiChangeKind;
import com.codechecker.api.model.EndpointChangeReport;
import com.codechecker.api.model.EndpointSnapshot;
import com.codechecker.api.model.ParameterChange;
import java.io.IOException;
import java.util.ArrayList;

View File

@@ -1,13 +1,13 @@
package com.aicheck.api.analyzer;
package com.codechecker.api.analyzer;
import com.aicheck.analyzer.FieldDiffEngine;
import com.aicheck.api.model.EndpointSnapshot;
import com.aicheck.api.model.MethodParameterSnapshot;
import com.aicheck.api.model.ParameterChange;
import com.aicheck.api.parser.NestedDtoFieldParser;
import com.aicheck.api.parser.NestedFieldInfo;
import com.aicheck.model.FieldChange;
import com.aicheck.model.FieldInfo;
import com.codechecker.analyzer.FieldDiffEngine;
import com.codechecker.api.model.EndpointSnapshot;
import com.codechecker.api.model.MethodParameterSnapshot;
import com.codechecker.api.model.ParameterChange;
import com.codechecker.api.parser.NestedDtoFieldParser;
import com.codechecker.api.parser.NestedFieldInfo;
import com.codechecker.model.FieldChange;
import com.codechecker.model.FieldInfo;
import java.io.IOException;
import java.nio.file.Path;

View File

@@ -1,7 +1,7 @@
package com.aicheck.api.model;
package com.codechecker.api.model;
/**
* API 变更类型与类变更 {@link com.aicheck.model.ClassChangeKind} 独立
* API 变更类型与类变更 {@link com.codechecker.model.ClassChangeKind} 独立
*/
public enum ApiChangeKind {
NEW_ENDPOINT,

View File

@@ -1,4 +1,4 @@
package com.aicheck.api.model;
package com.codechecker.api.model;
import java.util.ArrayList;
import java.util.List;

View File

@@ -1,4 +1,4 @@
package com.aicheck.api.model;
package com.codechecker.api.model;
import java.util.ArrayList;
import java.util.List;

View File

@@ -1,4 +1,4 @@
package com.aicheck.api.model;
package com.codechecker.api.model;
/**
* 接口方法入参快照

View File

@@ -1,4 +1,4 @@
package com.aicheck.api.model;
package com.codechecker.api.model;
/**
* API 参数或 RequestBody 嵌套字段变更

View File

@@ -1,10 +1,10 @@
package com.aicheck.api.notify;
package com.codechecker.api.notify;
import com.aicheck.api.model.ApiChangeKind;
import com.aicheck.api.model.EndpointChangeReport;
import com.aicheck.api.model.ParameterChange;
import com.aicheck.common.MarkdownStyles;
import com.aicheck.common.WeComMarkdownSender;
import com.codechecker.api.model.ApiChangeKind;
import com.codechecker.api.model.EndpointChangeReport;
import com.codechecker.api.model.ParameterChange;
import com.codechecker.common.MarkdownStyles;
import com.codechecker.common.WeComMarkdownSender;
import java.util.ArrayList;
import java.util.LinkedHashMap;

View File

@@ -1,8 +1,8 @@
package com.aicheck.api.parser;
package com.codechecker.api.parser;
import com.aicheck.api.model.EndpointSnapshot;
import com.aicheck.api.model.MethodParameterSnapshot;
import com.aicheck.parser.TypeNameUtils;
import com.codechecker.api.model.EndpointSnapshot;
import com.codechecker.api.model.MethodParameterSnapshot;
import com.codechecker.parser.TypeNameUtils;
import com.github.javaparser.StaticJavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.NodeList;

View File

@@ -1,4 +1,4 @@
package com.aicheck.api.parser;
package com.codechecker.api.parser;
import java.io.IOException;
import java.nio.file.Files;

View File

@@ -1,4 +1,4 @@
package com.aicheck.api.parser;
package com.codechecker.api.parser;
import com.github.javaparser.ast.body.MethodDeclaration;
import com.github.javaparser.ast.comments.JavadocComment;

View File

@@ -1,8 +1,8 @@
package com.aicheck.api.parser;
package com.codechecker.api.parser;
import com.aicheck.model.FieldInfo;
import com.aicheck.parser.ClassFieldParser;
import com.aicheck.parser.TypeNameUtils;
import com.codechecker.model.FieldInfo;
import com.codechecker.parser.ClassFieldParser;
import com.codechecker.parser.TypeNameUtils;
import java.io.IOException;
import java.nio.file.Path;

View File

@@ -1,4 +1,4 @@
package com.aicheck.api.parser;
package com.codechecker.api.parser;
/**
* DTO 嵌套字段扁平化条目dot path

View File

@@ -1,6 +1,6 @@
package com.aicheck.api.scanner;
package com.codechecker.api.scanner;
import com.aicheck.git.GitChangeScanner;
import com.codechecker.git.GitChangeScanner;
import java.io.IOException;
import java.nio.file.Path;

View File

@@ -1,4 +1,4 @@
package com.aicheck.common;
package com.codechecker.common;
/**
* 企微 Markdown v1 公共样式类变更 / API 变更通知共用

View File

@@ -1,4 +1,4 @@
package com.aicheck.common;
package com.codechecker.common;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;

View File

@@ -1,4 +1,4 @@
package com.aicheck.config;
package com.codechecker.config;
import org.yaml.snakeyaml.Yaml;
@@ -14,7 +14,8 @@ import java.util.Map;
* 读取 .gitea/config.yaml提供检测开关扫描目录企微配置等
*/
public class AppConfig {
private boolean enabled = true;
private boolean masterEnabled = true;
private boolean classCheckEnabled = true;
private boolean dtoEntityConversionEnabled = true;
private List<String> modelDirs = new ArrayList<>();
private List<String> controllerScanDirs = new ArrayList<>();
@@ -42,8 +43,11 @@ public class AppConfig {
}
AppConfig config = new AppConfig();
Map<String, Object> checker = mapOrEmpty(root.get("checker"));
config.masterEnabled = boolOrDefault(checker.get("enabled"), true);
Map<String, Object> classCheck = mapOrEmpty(root.get("class_check"));
config.enabled = boolOrDefault(classCheck.get("enabled"), true);
config.classCheckEnabled = boolOrDefault(classCheck.get("enabled"), true);
Map<String, Object> conversion = mapOrEmpty(classCheck.get("dto_entity_conversion"));
config.dtoEntityConversionEnabled = boolOrDefault(conversion.get("enabled"), true);
@@ -115,9 +119,14 @@ public class AppConfig {
return value == null ? "" : value.toString();
}
/** 变更检测总开关 */
public boolean isEnabled() {
return enabled;
/** 变更检测总开关checker.enabled控制 class_check + api_check */
public boolean isMasterEnabled() {
return masterEnabled;
}
/** 类变更检测开关class_check.enabled */
public boolean isClassCheckEnabled() {
return classCheckEnabled;
}
/** Dto→Entity 类转换检测开关 */

View File

@@ -1,8 +1,8 @@
package com.aicheck.git;
package com.codechecker.git;
import com.aicheck.model.ChangedClassFile;
import com.aicheck.model.ClassType;
import com.aicheck.parser.ClassDeclParser;
import com.codechecker.model.ChangedClassFile;
import com.codechecker.model.ClassType;
import com.codechecker.parser.ClassDeclParser;
import java.io.BufferedReader;
import java.io.IOException;

View File

@@ -1,4 +1,4 @@
package com.aicheck.model;
package com.codechecker.model;
import java.util.LinkedHashSet;
import java.util.Set;

View File

@@ -1,4 +1,4 @@
package com.aicheck.model;
package com.codechecker.model;
/**
* Git 扫描得到的单个 Java 模型类变更记录

View File

@@ -1,4 +1,4 @@
package com.aicheck.model;
package com.codechecker.model;
/**
* 单次类变更的类型决定通知内容与影响分析策略

View File

@@ -1,4 +1,4 @@
package com.aicheck.model;
package com.codechecker.model;
import java.util.ArrayList;
import java.util.List;

View File

@@ -1,4 +1,4 @@
package com.aicheck.model;
package com.codechecker.model;
/**
* 目标模型类后缀类型决定通知模版中展示哪些影响段落

View File

@@ -1,4 +1,4 @@
package com.aicheck.model;
package com.codechecker.model;
/**
* 字段级 diff 结果用于通知中的 [新增]/[删除]/[修改]/[重命名]

View File

@@ -1,4 +1,4 @@
package com.aicheck.model;
package com.codechecker.model;
import java.util.Objects;

View File

@@ -1,9 +1,9 @@
package com.aicheck.notify;
package com.codechecker.notify;
import com.aicheck.model.ApiEndpoint;
import com.aicheck.model.ClassChangeReport;
import com.aicheck.model.ClassType;
import com.aicheck.model.FieldChange;
import com.codechecker.model.ApiEndpoint;
import com.codechecker.model.ClassChangeReport;
import com.codechecker.model.ClassType;
import com.codechecker.model.FieldChange;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;

View File

@@ -1,4 +1,4 @@
package com.aicheck.parser;
package com.codechecker.parser;
import com.github.javaparser.StaticJavaParser;
import com.github.javaparser.ast.CompilationUnit;

View File

@@ -1,6 +1,6 @@
package com.aicheck.parser;
package com.codechecker.parser;
import com.aicheck.model.FieldInfo;
import com.codechecker.model.FieldInfo;
import com.github.javaparser.StaticJavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;

View File

@@ -1,4 +1,4 @@
package com.aicheck.parser;
package com.codechecker.parser;
import com.github.javaparser.StaticJavaParser;
import com.github.javaparser.ast.CompilationUnit;

View File

@@ -1,6 +1,6 @@
package com.aicheck.parser;
package com.codechecker.parser;
import com.aicheck.model.ApiEndpoint;
import com.codechecker.model.ApiEndpoint;
import com.github.javaparser.StaticJavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.NodeList;

View File

@@ -1,4 +1,4 @@
package com.aicheck.parser;
package com.codechecker.parser;
import com.github.javaparser.ast.type.ClassOrInterfaceType;
import com.github.javaparser.ast.type.Type;