diff --git a/components/engine/engine-bpm-flowable/src/main/java/org/eclipse/dirigible/components/engine/bpm/flowable/delegate/ResilientClassDelegateFactory.java b/components/engine/engine-bpm-flowable/src/main/java/org/eclipse/dirigible/components/engine/bpm/flowable/delegate/ResilientClassDelegateFactory.java index dca8a7f42e1..ba35344eaa8 100644 --- a/components/engine/engine-bpm-flowable/src/main/java/org/eclipse/dirigible/components/engine/bpm/flowable/delegate/ResilientClassDelegateFactory.java +++ b/components/engine/engine-bpm-flowable/src/main/java/org/eclipse/dirigible/components/engine/bpm/flowable/delegate/ResilientClassDelegateFactory.java @@ -21,7 +21,7 @@ * Creates {@link ResilientClassDelegate}s for every {@code flowable:class} service task (the shape * of Flowable's own {@code DefaultClassDelegateFactory}), so the intent DSL's {@code onError} error * routing has its conversion hook on the one path all {@code delegate:} steps run through. Wired - * into the engine by {@code BpmFlowableConfig} via a {@code DefaultActivityBehaviorFactory} + * into the engine by {@code BpmFlowableConfig} via a {@code ResilientActivityBehaviorFactory} * carrying this factory. */ public class ResilientClassDelegateFactory implements ClassDelegateFactory { diff --git a/components/engine/engine-intent/CLAUDE.md b/components/engine/engine-intent/CLAUDE.md index d2f9bc884c3..4b256842f50 100644 --- a/components/engine/engine-intent/CLAUDE.md +++ b/components/engine/engine-intent/CLAUDE.md @@ -413,7 +413,7 @@ Semantics worth knowing: - **`abortOn:` on a process = cancel the in-flight instance when the document transitions into a terminal status (BPM events wave 2).** `abortOn: { status: [4, 5], then: markVoid }` — a `-transitioned` of the trigger entity into any listed EntityStatus seed id cancels the whole running instance (pending user tasks, parked waits, armed boundary timers). Emitted as an **interrupting message event subprocess** (`` with an `isInterrupting="true"` message start on `Abort` → optional cleanup serviceTask → `terminateEventDefinition`), NOT by wrapping the main flow — chosen over the proposal's subProcess-wrap sketch because it needs no restructuring of the flat step layout and still kills everything in scope. Glue: `ProcessAbortSupport` → the `aborts` collection in `.glue` → `Abort.java.template` — a `MessageHandler` on the entity's `-transitioned` topic (the channel transitions/setters already publish) that matches the status list (`entity. == || …`) and correlates `Abort` on the instance THIS process stamped in `ProcessIds` (`ProcessStamps.idFor`, falling back to `ProcessId` for records stamped before that column existed), fail-soft. `then:` omitted or `end` = terminate; a declared `serviceTask` cleanup (setField/setRelationField) is **abort-only** — `BpmnIntentGenerator` filters it out of the main linear chain (`steps.removeIf`) and re-emits it inside the event subprocess (its setter glue is still generated by `SetFieldSupport`). Parser (`validateAbortOn`): integer `status` (scalar or list), trigger entity with a `function: EntityStatus` relation, `then` = `end`/a setField-setRelationField serviceTask that is NOT explicitly routed to from the main flow (`next`/`then`/`else`). DI: the event subprocess is a fixed-placement container box below the main lane (BPMN-2.0 expanded-subprocess children carry absolute plane coordinates). Requested/shaped in upstream discussion #6340. **Consumers:** the orphaned-Inbox-task hole (cancel a SalesOrder mid-confirm), and the structural replacement for a cancelling `expire:` guard (kf quotations drops its `custom/` guard delegate). Caveat: `then` cleanup is one serviceTask (a multi-step cleanup chain is future work). - **`whenDeleted: abort | refuse` on a process = what a DELETE of the trigger row does to the in-flight instance (#7074).** `abortOn` is deaf to deletes - a `-deleted` is not a `-transitioned` - so deleting a DRAFT under approval left its Inbox task alive, claimable, opening a form of `—`s and completable over a row that no longer existed. Now EVERY entity-triggered process gets a `AbortOnDelete` `MessageHandler` on the trigger entity's `-deleted` topic (`deleteAborts` glue collection, `AbortOnDelete.java.template`, the pipeline's collection case) that reads its own `ProcessIds` stamp off the deleted payload and `Process.cancel`s the instance if `Process.isRunning` - generated whatever `whenDeleted` says, because `refuse` guards only the REST surface and a cascade or a reaction still deletes rows. `refuse` lands on the trigger entity as the `processDeleteGuards` scalar (`: