Fix Join activity to clear ALL blocking activities in ancestor paths

Fixes #1342
This commit is contained in:
Sipke Schoorstra 2021-08-07 19:57:25 +02:00
parent 8deef4755e
commit 0222c20d7d
2 changed files with 28 additions and 3 deletions

View file

@ -60,10 +60,10 @@ namespace Elsa.Activities.ControlFlow
var ancestorActivityIds = workflowExecutionContext.GetInboundActivityPath(Id).ToList();
var activities = workflowExecutionContext.WorkflowBlueprint.Activities.ToDictionary(x => x.Id);
var ancestors = ancestorActivityIds.Select(x => activities[x]).ToList();
var fork = ancestors.FirstOrDefault(x => x.Type == nameof(Fork));
var forks = ancestors.Where(x => x.Type == nameof(Fork)).ToList();
await RemoveBlockingActivitiesAsync(workflowExecutionContext, fork);
await RemoveScopeActivitiesAsync(workflowExecutionContext, ancestors, fork);
await RemoveBlockingActivitiesAsync(workflowExecutionContext, forks);
await RemoveScopeActivitiesAsync(workflowExecutionContext, ancestors, forks);
// Clear the recorded inbound transitions. This is necessary in case we're in a looping construct.
InboundTransitions = new List<string>();
@ -83,6 +83,12 @@ namespace Elsa.Activities.ControlFlow
};
}
private async Task RemoveBlockingActivitiesAsync(WorkflowExecutionContext workflowExecutionContext, IEnumerable<IActivityBlueprint> forks)
{
foreach (var fork in forks)
await RemoveBlockingActivitiesAsync(workflowExecutionContext, fork);
}
private async Task RemoveBlockingActivitiesAsync(WorkflowExecutionContext workflowExecutionContext, IActivityBlueprint? fork)
{
var blockingActivities = workflowExecutionContext.WorkflowInstance.BlockingActivities.ToList();
@ -105,6 +111,12 @@ namespace Elsa.Activities.ControlFlow
}
}
private async Task RemoveScopeActivitiesAsync(WorkflowExecutionContext workflowExecutionContext, ICollection<IActivityBlueprint> ancestors, IEnumerable<IActivityBlueprint> forks)
{
foreach (var fork in forks)
await RemoveScopeActivitiesAsync(workflowExecutionContext, ancestors, fork);
}
private async Task RemoveScopeActivitiesAsync(WorkflowExecutionContext workflowExecutionContext, ICollection<IActivityBlueprint> ancestors, IActivityBlueprint? fork)
{
var scopes = workflowExecutionContext.WorkflowInstance.Scopes.AsEnumerable().Reverse().ToList();

View file

@ -20,6 +20,8 @@ export namespace Components {
interface ElsaActivityEditorModal {
"culture": string;
}
interface ElsaActivityPickerModal {
}
interface ElsaCheckListProperty {
"propertyDescriptor": ActivityPropertyDescriptor;
"propertyModel": ActivityDefinitionProperty;
@ -303,6 +305,12 @@ declare global {
prototype: HTMLElsaActivityEditorModalElement;
new (): HTMLElsaActivityEditorModalElement;
};
interface HTMLElsaActivityPickerModalElement extends Components.ElsaActivityPickerModal, HTMLStencilElement {
}
var HTMLElsaActivityPickerModalElement: {
prototype: HTMLElsaActivityPickerModalElement;
new (): HTMLElsaActivityPickerModalElement;
};
interface HTMLElsaCheckListPropertyElement extends Components.ElsaCheckListProperty, HTMLStencilElement {
}
var HTMLElsaCheckListPropertyElement: {
@ -593,6 +601,7 @@ declare global {
};
interface HTMLElementTagNameMap {
"elsa-activity-editor-modal": HTMLElsaActivityEditorModalElement;
"elsa-activity-picker-modal": HTMLElsaActivityPickerModalElement;
"elsa-check-list-property": HTMLElsaCheckListPropertyElement;
"elsa-checkbox-property": HTMLElsaCheckboxPropertyElement;
"elsa-confirm-dialog": HTMLElsaConfirmDialogElement;
@ -647,6 +656,8 @@ declare namespace LocalJSX {
interface ElsaActivityEditorModal {
"culture"?: string;
}
interface ElsaActivityPickerModal {
}
interface ElsaCheckListProperty {
"propertyDescriptor"?: ActivityPropertyDescriptor;
"propertyModel"?: ActivityDefinitionProperty;
@ -918,6 +929,7 @@ declare namespace LocalJSX {
}
interface IntrinsicElements {
"elsa-activity-editor-modal": ElsaActivityEditorModal;
"elsa-activity-picker-modal": ElsaActivityPickerModal;
"elsa-check-list-property": ElsaCheckListProperty;
"elsa-checkbox-property": ElsaCheckboxProperty;
"elsa-confirm-dialog": ElsaConfirmDialog;
@ -973,6 +985,7 @@ declare module "@stencil/core" {
export namespace JSX {
interface IntrinsicElements {
"elsa-activity-editor-modal": LocalJSX.ElsaActivityEditorModal & JSXBase.HTMLAttributes<HTMLElsaActivityEditorModalElement>;
"elsa-activity-picker-modal": LocalJSX.ElsaActivityPickerModal & JSXBase.HTMLAttributes<HTMLElsaActivityPickerModalElement>;
"elsa-check-list-property": LocalJSX.ElsaCheckListProperty & JSXBase.HTMLAttributes<HTMLElsaCheckListPropertyElement>;
"elsa-checkbox-property": LocalJSX.ElsaCheckboxProperty & JSXBase.HTMLAttributes<HTMLElsaCheckboxPropertyElement>;
"elsa-confirm-dialog": LocalJSX.ElsaConfirmDialog & JSXBase.HTMLAttributes<HTMLElsaConfirmDialogElement>;