# 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
) {}
```
