datai/docs/archive/REQ-013-2.md

122 lines
7.1 KiB
Markdown
Raw Normal View History

# Apex 动态代码执行与日志管理需求
## 元数据
- 需求编号013-2
- 父需求013
- 创建时间2026-01-26
- 创建人SSOT 架构师
- 状态:进行中
- 优先级:高
- 关联代码:
- `com.sforce.soap.apex.ExecuteAnonymousResult`
- `com.sforce.soap.apex.DebuggingHeader_element`
- `com.sforce.soap.apex.LogCategory`
- `com.sforce.soap.apex.LogCategoryLevel`
- `com.sforce.soap.apex.DebuggingInfo_element`
## 需求概述
实现 `executeAnonymous` 的封装,允许用户执行任意 Apex 代码片段,并能够灵活控制和获取执行过程中的调试日志。通过封装 `DebuggingHeader` 实现细粒度的日志级别控制,并解析 `DebuggingInfo` 获取执行结果。
## 目标
1. **统一执行接口**:封装底层的 SOAP 调用,提供友好的 Java 接口。
2. **精确日志控制**:支持基于 `LogCategory``LogCategoryLevel` 的细粒度日志配置。
3. **结果结构化**:将 SOAP 的 `ExecuteAnonymousResult` 转换为结构化的 Java 对象,区分编译错误和运行时异常。
4. **日志内容提取**:自动从 SOAP Header 中提取并(可选)解析日志内容。
## 功能需求
### 1. 动态代码执行 (Anonymous Execution)
- **功能描述**:封装 `SoapConnection.executeAnonymous` 方法。
- **接口定义**
```java
ExecuteResult execute(String apexCode, DebuggingOptions options);
```
- **输入参数**
- `apexCode`: 待执行的 Apex 代码字符串。
- `options`: 包含日志级别配置、模拟模式等选项。
- **处理逻辑**
1. 构建 `DebuggingHeader_element`,根据 `options` 设置日志级别。
2. 调用 `connection.executeAnonymous(apexCode)`
3. 获取响应头中的 `DebuggingInfo_element`,提取 `debugLog`
4. 处理 `ExecuteAnonymousResult` 返回值:
- **编译检查**:检查 `isCompiled()`
- 若为 `false`,读取 `compileProblem`, `line`, `column`
- 抛出 `ApexCompilationException` (引用 REQ-013-1 定义)。
- **执行检查**:检查 `isSuccess()`
- 若为 `false`,读取 `exceptionMessage`, `exceptionStackTrace`
- 封装到 `ExecuteResult` 中作为运行时错误返回。
- **成功**:封装执行结果。
- **输出对象 (`ExecuteResult`)**
- `boolean success`: 执行是否成功。
2026-01-28 18:17:11 +08:00
- `boolean compiled`: 代码是否编译成功。
- `String debugLog`: 完整的调试日志内容。
- `String exceptionMessage`: 运行时异常信息(如有)。
- `String exceptionStackTrace`: 运行时堆栈跟踪(如有)。
2026-01-28 18:17:11 +08:00
- `String compileProblem`: 编译错误描述(如有)。
- `int compileLine`: 编译错误行号(如有)。
- `int compileColumn`: 编译错误列号(如有)。
- `long executionTime`: (可选) 从日志或响应时间估算的执行耗时。
### 2. 日志级别配置 (Logging Configuration)
2026-01-28 18:17:11 +08:00
- **功能描述**:构建 `DebuggingHeader`,支持两种日志配置模式。
- **配置模式**
- **细粒度模式**:使用 `categories` 字段,基于 `LogCategory``LogCategoryLevel` 的精确配置。
- **预设模式**:使用 `debugLevel` 字段,基于 `LogType` 的快速配置。
- **枚举定义**
- **`LogCategory`** (对应 `com.sforce.soap.apex.LogCategory`):
- `Db`, `Workflow`, `Validation`, `Callout`, `Apex_code`, `Apex_profiling`, `Visualforce`, `System`
- `Wave`, `Nba`, `Data_access`, `All`
2026-01-28 18:17:11 +08:00
- **`LogCategoryLevel`** (对应 `com.sforce.soap.apex.LogCategoryLevel`):
- `None`, `Finest`, `Finer`, `Fine`, `Debug`, `Info`, `Warn`, `Error`
- **`LogType`** (对应 `com.sforce.soap.apex.LogType`):
- `None`, `Debugonly`, `Db`, `Profiling`, `Callout`, `Detail`
- **配置模板**
2026-01-28 18:17:11 +08:00
- **细粒度模板**
- `DEBUG_ONLY`: `Apex_code`=DEBUG, `System`=DEBUG, 其他=INFO
- `DB_ANALYSIS`: `Db`=FINEST, `Apex_profiling`=FINEST, 其他=INFO
2026-01-28 18:17:11 +08:00
- **预设模板**
- `DEBUGONLY`: 使用 `LogType.Debugonly`
- `DB`: 使用 `LogType.Db`
- `PROFILING`: 使用 `LogType.Profiling`
### 3. 日志获取与解析 (Log Retrieval & Parsing)
- **功能描述**:处理 `DebuggingInfo_element`
- **详细要求**
- **自动提取**:每次执行后,自动检查 SOAP 响应头,提取 `debugLog` 字符串。
- **日志解析器 (LogParser)** (可选组件):
- `List<String> getUserDebugs(String log)`: 提取所有 `USER_DEBUG` 行。
- `Map<String, String> getLimits(String log)`: 提取 `LIMIT_USAGE` 部分(如 "Number of SOQL queries: 2 out of 100")。
## 关键代码映射 (Source Code Mapping)
### SOAP 对象映射
| 逻辑概念 | SOAP 类名 | 关键字段 |
| :--- | :--- | :--- |
| 执行结果 | `ExecuteAnonymousResult` | `compiled`, `compileProblem`, `line`, `column`, `success`, `exceptionMessage`, `exceptionStackTrace` |
2026-01-28 18:17:11 +08:00
| 调试头 | `DebuggingHeader_element` | `categories` (`LogInfo[]`), `debugLevel` (`LogType`) |
| 日志信息配置 | `LogInfo` | `category` (`LogCategory`), `level` (`LogCategoryLevel`) |
| 调试信息返回 | `DebuggingInfo_element` | `debugLog` |
### 枚举值对应
2026-01-28 18:17:11 +08:00
- **LogCategory**: 严格匹配 `com.sforce.soap.apex.LogCategory` 的枚举值12个值Db, Workflow, Validation, Callout, Apex_code, Apex_profiling, Visualforce, System, Wave, Nba, Data_access, All
- **LogCategoryLevel**: 严格匹配 `com.sforce.soap.apex.LogCategoryLevel` 的枚举值8个值None, Finest, Finer, Fine, Debug, Info, Warn, Error
- **LogType**: 严格匹配 `com.sforce.soap.apex.LogType` 的枚举值6个值None, Debugonly, Db, Profiling, Callout, Detail
## 异常处理规范
1. **编译异常**:当 `ExecuteAnonymousResult.compiled == false` 时,必须阻断流程,抛出受检异常 `ApexCompilationException`,包含具体的行列号和错误信息。
2. **运行时异常**:当 `ExecuteAnonymousResult.success == false` 时,不抛出异常,而是将错误信息封装在 `ExecuteResult` 中返回,因为这属于代码执行的预期结果之一(例如代码逻辑抛出异常)。
3. **SOAP 故障**:网络或认证错误抛出 `ConnectionException` 或运行时异常。
## 验证与测试
1. **基础执行**:执行 `System.debug('Hello');`,断言 `success=true``debugLog` 包含 'Hello'。
2. **编译错误**:执行 `In valid Code;`,断言抛出 `ApexCompilationException` 且包含行号。
3. **运行时错误**:执行 `throw new MyException('Test');`,断言 `success=false``exceptionMessage` 包含 'Test'。
4. **日志级别**:设置 `Apex_code=FINEST`,执行代码,断言日志长度或内容详细程度增加。
## 相关文档
2026-01-28 18:17:11 +08:00
- [设计文档](../design/2026-01-28-013-2-Apex动态代码执行与日志管理设计.md)
- [提示词文档](../prompts/2026-01-27-013-2-prompt-Apex动态代码执行与日志管理.md)
- [变更日志](../changelog/2026-01-27-013-2-changelog.md)
- [复盘文档](../retros/2026-01-27-013-2-retro.md)
- [API 文档](../api-docs/apex/2026-01-27-013-2-api.md)