enrichment schema 2
This commit is contained in:
53
plan-extended-anaylis/string_resolution.md
Normal file
53
plan-extended-anaylis/string_resolution.md
Normal file
@@ -0,0 +1,53 @@
|
||||
# Advanced String and Variable Resolution Strategy
|
||||
|
||||
## 1. The Problem
|
||||
Annotations often use non-literal values for metadata:
|
||||
- **Constants**: `@PostMapping(ApiConstants.SUBMIT_PATH)`
|
||||
- **Concatenation**: `@RequestMapping(BASE + "/orders")`
|
||||
- **Inherited Variables**: Use of fields defined in base classes.
|
||||
|
||||
Simple `StringLiteral` extraction fails in these cases. We need a recursive **Expression Evaluator**.
|
||||
|
||||
## 2. Evaluation Logic
|
||||
|
||||
### Constant Resolution
|
||||
If an expression is a `SimpleName` or `QualifiedName`:
|
||||
1. Use `CodebaseContext.getTypeDeclaration()` to find the class where the variable is defined.
|
||||
2. Search for the `VariableDeclarationFragment`.
|
||||
3. If it has an initializer that is a literal or another evaluatable expression, resolve it.
|
||||
|
||||
### Concatenation (Infix Expressions)
|
||||
If an expression is an `InfixExpression` with the `+` operator:
|
||||
1. Recursively resolve the left operand.
|
||||
2. Recursively resolve the right operand.
|
||||
3. Concatenate the results if both are strings.
|
||||
|
||||
### Spring Expression Language (SpEL) in Annotations
|
||||
For values like `@Value("#{systemProperties['path.base'] + '/api'}")`:
|
||||
1. Identify the SpEL string.
|
||||
2. Use a "Lite" SpEL parser to extract keys.
|
||||
3. Match against the `profiles` map in `CodebaseMetadata`.
|
||||
|
||||
## 3. Implementation: `ValueResolver`
|
||||
We will introduce a central `ValueResolver` utility.
|
||||
|
||||
```java
|
||||
public class ValueResolver {
|
||||
public String resolveString(Expression expr, CodebaseContext context) {
|
||||
if (expr instanceof StringLiteral sl) return sl.getLiteralValue();
|
||||
if (expr instanceof InfixExpression ie) return resolveInfix(ie, context);
|
||||
if (expr instanceof Name name) return resolveVariable(name, context);
|
||||
// ... fallback to toString() or empty
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 4. Challenges
|
||||
- **Circular Dependencies**: A + B, where B = A + C. We need a "visited" set to prevent infinite recursion.
|
||||
- **Runtime-only values**: Some values cannot be resolved statically (e.g., values from a DB). In these cases, we should return the placeholder or a "Runtime Value" marker.
|
||||
- **Method Calls**: `getPath() + "/orders"`. Resolving method return values is complex; initially, we will only support simple getters returning literals.
|
||||
|
||||
## 5. Integration
|
||||
1. Update `AstUtils` or create `ValueResolver`.
|
||||
2. Refactor `SpringMvcEnricher`, `RabbitMqEnricher`, and `JmsEnricher` to use the resolver for all path/queue/destination fields.
|
||||
3. Update `integration_test_state_machine` with complex path examples.
|
||||
Reference in New Issue
Block a user