43 lines
2.1 KiB
Markdown
43 lines
2.1 KiB
Markdown
# Advanced Context Extraction: Payloads and Interceptors
|
|
|
|
## 1. Incoming Payload Analysis
|
|
To understand *what* data drives the state machine, we need to capture metadata about the incoming parameters at entry points.
|
|
|
|
### REST Endpoints
|
|
For methods annotated with `@PostMapping`, `@PutMapping`, etc.:
|
|
1. **Extract Parameters**: Scan method parameters for `@RequestBody`, `@PathVariable`, or `@RequestParam`.
|
|
2. **Type Extraction**: Capture the FQN of the parameter type (e.g., `com.example.OrderRequest`).
|
|
3. **Data Linkage**: If a field from this payload is used in a `sendEvent(payload.getEvent())` call, mark the transition as "Dynamic based on Payload".
|
|
|
|
### Message Listeners
|
|
For `@RabbitListener` or `@JmsListener`:
|
|
1. Identify the parameter receiving the message body.
|
|
2. Extract its type and any `@Header` or `@Payload` annotations.
|
|
|
|
## 2. Interceptor and Filter Analysis
|
|
Interceptors often perform cross-cutting logic (authentication, context injection) that affects how state machines are driven.
|
|
|
|
### Discovery Strategy
|
|
1. **Find Interceptors**: Scan for classes implementing `HandlerInterceptor` or `WebRequestInterceptor`.
|
|
2. **Registration Mapping**: Look for `WebMvcConfigurer.addInterceptors()` calls to identify which URL patterns each interceptor applies to.
|
|
3. **Context Injection**: Analyze if the interceptor modifies the request (e.g., `request.setAttribute("userContext", ...)`) or populates a `ThreadLocal` (like `SecurityContextHolder`).
|
|
|
|
### Linking to State Machines
|
|
If a controller uses a value from a known Interceptor-injected context to decide which event to send or which state machine to restore, we can link the Interceptor's logic to the State Machine flow.
|
|
|
|
## 3. Implementation in `EnrichmentService`
|
|
We will introduce a `ContextEnricher` that:
|
|
1. Builds a map of **Active Interceptors** per path.
|
|
2. Augments `EntryPoint` metadata with **Payload Type** information.
|
|
|
|
## 4. Modeling Updates
|
|
Update `EntryPoint` and `TriggerPoint` to include `payloadType` and `interceptors`.
|
|
|
|
```java
|
|
public record EntryPoint(
|
|
// ... existing fields ...
|
|
String payloadType,
|
|
List<String> activeInterceptors
|
|
) {}
|
|
```
|