From e23cf08f818994c5bb31e58d0ecd8c6b218ffa7c Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Sat, 5 Dec 2020 11:15:27 +0100 Subject: [PATCH] Allow access to parent activity state from child activity --- src/core/Elsa.Abstractions/Models/WorkflowInstance.cs | 2 ++ src/core/Elsa.Abstractions/Services/CompositeActivity.cs | 4 ++++ .../Services/Models/ActivityBlueprintWrapper.cs | 4 ++-- .../Services/Models/ActivityExecutionContext.cs | 4 ++++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/core/Elsa.Abstractions/Models/WorkflowInstance.cs b/src/core/Elsa.Abstractions/Models/WorkflowInstance.cs index d1a3834407..6813d73d3 100644 --- a/src/core/Elsa.Abstractions/Models/WorkflowInstance.cs +++ b/src/core/Elsa.Abstractions/Models/WorkflowInstance.cs @@ -15,6 +15,7 @@ namespace Elsa.Models ExecutionLog = new List(); ScheduledActivities = new Stack(); PostScheduledActivities = new Stack(); + ParentActivities = new Stack(); } public int Id { get; set; } @@ -40,5 +41,6 @@ namespace Elsa.Models public WorkflowFault? Fault { get; set; } public Stack ScheduledActivities { get; set; } public Stack PostScheduledActivities { get; set; } + public Stack ParentActivities { get; set; } } } \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Services/CompositeActivity.cs b/src/core/Elsa.Abstractions/Services/CompositeActivity.cs index 5043f305e..5b436fd43 100644 --- a/src/core/Elsa.Abstractions/Services/CompositeActivity.cs +++ b/src/core/Elsa.Abstractions/Services/CompositeActivity.cs @@ -20,10 +20,14 @@ namespace Elsa.Services protected override IActivityExecutionResult OnExecute(ActivityExecutionContext context) { if (IsScheduled) + { + context.WorkflowExecutionContext.WorkflowInstance.ParentActivities.Pop(); return Complete(context); + } var compositeActivityBlueprint = (ICompositeActivityBlueprint)context.ActivityBlueprint; var startActivities = compositeActivityBlueprint.GetStartActivities().Select(x => x.Id).ToList(); + context.WorkflowExecutionContext.WorkflowInstance.ParentActivities.Push(Id); context.WorkflowExecutionContext.PostScheduleActivity(Id); IsScheduled = true; return Schedule(startActivities, context.Input); diff --git a/src/core/Elsa.Abstractions/Services/Models/ActivityBlueprintWrapper.cs b/src/core/Elsa.Abstractions/Services/Models/ActivityBlueprintWrapper.cs index 0e9c71c8d..62ce289d6 100644 --- a/src/core/Elsa.Abstractions/Services/Models/ActivityBlueprintWrapper.cs +++ b/src/core/Elsa.Abstractions/Services/Models/ActivityBlueprintWrapper.cs @@ -30,12 +30,12 @@ namespace Elsa.Services.Models var workflowBlueprint = ActivityExecutionContext.WorkflowExecutionContext.WorkflowBlueprint; var activityId = ActivityExecutionContext.ActivityBlueprint.Id; - // Computed property setters that depend on actual workflow state might fault, since we are using a fake activity execution context. + // Computed property setters that depend on actual workflow state might fault, since we might be using a fake activity execution context. try { return await workflowBlueprint.GetActivityPropertyValue(activityId, propertyExpression, ActivityExecutionContext, cancellationToken); } - catch (Exception e) + catch (Exception) { return default; } diff --git a/src/core/Elsa.Abstractions/Services/Models/ActivityExecutionContext.cs b/src/core/Elsa.Abstractions/Services/Models/ActivityExecutionContext.cs index e014d73aa..df0afe86f 100644 --- a/src/core/Elsa.Abstractions/Services/Models/ActivityExecutionContext.cs +++ b/src/core/Elsa.Abstractions/Services/Models/ActivityExecutionContext.cs @@ -42,6 +42,10 @@ namespace Elsa.Services.Models set => ActivityInstance.Output = value; } + public ActivityBlueprintWrapper Parent() where T : IActivity => new(new ActivityExecutionContext(ServiceScope, WorkflowExecutionContext, + WorkflowExecutionContext.GetActivityBlueprintById(WorkflowExecutionContext.WorkflowInstance.ParentActivities.Peek()), + null, CancellationToken)); + public void SetVariable(string name, object? value) => WorkflowExecutionContext.SetVariable(name, value); public object? GetVariable(string name) => WorkflowExecutionContext.GetVariable(name); public T GetVariable(string name) => WorkflowExecutionContext.GetVariable(name);