From 7a21f09ae96c176ac80872b12687ccda16ecad7b Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Mon, 27 Jan 2025 15:49:25 +0100 Subject: [PATCH] Restore methods for traversing activity execution context hierarchy Reintroduced `GetAncestors` method and added new methods: `GetDescendants`, `GetActiveChildren`, and `GetChildren`. These methods enhance navigation through activity execution contexts by providing easy access to hierarchical relationships like ancestors, descendants, and children. --- .../ActivityExecutionContextExtensions.cs | 76 +++++++++++++++---- 1 file changed, 62 insertions(+), 14 deletions(-) diff --git a/src/modules/Elsa.Workflows.Core/Extensions/ActivityExecutionContextExtensions.cs b/src/modules/Elsa.Workflows.Core/Extensions/ActivityExecutionContextExtensions.cs index 739b0d8eb..59a69c68d 100644 --- a/src/modules/Elsa.Workflows.Core/Extensions/ActivityExecutionContextExtensions.cs +++ b/src/modules/Elsa.Workflows.Core/Extensions/ActivityExecutionContextExtensions.cs @@ -183,20 +183,6 @@ public static partial class ActivityExecutionContextExtensions return portProperty.GetCustomAttribute()?.Name ?? portProperty.Name; } - /// - /// Returns a flattened list of the current context's ancestors. - /// - public static IEnumerable GetAncestors(this ActivityExecutionContext context) - { - var current = context.ParentActivityExecutionContext; - - while (current != null) - { - yield return current; - current = current.ParentActivityExecutionContext; - } - } - /// /// Send a signal up the current hierarchy of ancestors. /// @@ -314,6 +300,68 @@ public static partial class ActivityExecutionContextExtensions return null; } + + /// + /// Returns a flattened list of the current context's ancestors. + /// + public static IEnumerable GetAncestors(this ActivityExecutionContext context) + { + var current = context.ParentActivityExecutionContext; + + while (current != null) + { + yield return current; + current = current.ParentActivityExecutionContext; + } + } + + /// + /// Returns a flattened list of the current context's descendants. + /// + public static IEnumerable GetDescendents(this ActivityExecutionContext context) + { + var children = context.WorkflowExecutionContext.ActivityExecutionContexts.Where(x => x.ParentActivityExecutionContext == context).ToList(); + + foreach (var child in children) + { + yield return child; + + foreach (var descendent in GetDescendents(child)) + yield return descendent; + } + } + + /// + /// Returns a flattened list of the current context's immediate active children. + /// + public static IEnumerable GetActiveChildren(this ActivityExecutionContext context) + { + return context.WorkflowExecutionContext.ActivityExecutionContexts.Where(x => x.ParentActivityExecutionContext == context); + } + + /// + /// Returns a flattened list of the current context's immediate children. + /// + public static IEnumerable GetChildren(this ActivityExecutionContext context) + { + return context.WorkflowExecutionContext.ActivityExecutionContexts.Where(x => x.ParentActivityExecutionContext == context); + } + + /// + /// Returns a flattened list of the current context's descendants. + /// + public static IEnumerable GetDescendants(this ActivityExecutionContext context) + { + var children = context.WorkflowExecutionContext.ActivityExecutionContexts.Where(x => x.ParentActivityExecutionContext == context).ToList(); + + foreach (var child in children) + { + yield return child; + + foreach (var descendant in child.GetDescendants()) + yield return descendant; + } + } internal static bool GetHasEvaluatedProperties(this ActivityExecutionContext context) => context.TransientProperties.TryGetValue("HasEvaluatedProperties", out var value) && value; internal static void SetHasEvaluatedProperties(this ActivityExecutionContext context) => context.TransientProperties["HasEvaluatedProperties"] = true;