diff --git a/src/core/Elsa.Abstractions/ActivityResults/OutcomeResult.cs b/src/core/Elsa.Abstractions/ActivityResults/OutcomeResult.cs index 7527b4fe3..2b7241fb4 100644 --- a/src/core/Elsa.Abstractions/ActivityResults/OutcomeResult.cs +++ b/src/core/Elsa.Abstractions/ActivityResults/OutcomeResult.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Elsa.Models; using Elsa.Services; using Elsa.Services.Models; @@ -12,7 +13,7 @@ namespace Elsa.ActivityResults { var outcomeList = outcomes?.ToList() ?? new List(1); - if (!outcomeList.Any()) + if (!outcomeList.Any()) outcomeList.Add(OutcomeNames.Done); Outcomes = outcomeList; @@ -24,24 +25,34 @@ namespace Elsa.ActivityResults protected override void Execute(ActivityExecutionContext activityExecutionContext) { - if(Output != null) + if (Output != null) activityExecutionContext.Output = Output; - + activityExecutionContext.Outcomes = Outcomes.ToList(); var workflowExecutionContext = activityExecutionContext.WorkflowExecutionContext; - var nextActivities = GetNextActivities(workflowExecutionContext, activityExecutionContext.ActivityDefinition, Outcomes).ToList(); - + var nextActivities = GetNextActivities( + workflowExecutionContext, + activityExecutionContext.ActivityDefinition, + Outcomes).ToList(); + workflowExecutionContext.ScheduleActivities(nextActivities, Output); } - - private IEnumerable GetNextActivities(WorkflowExecutionContext workflowContext, IActivity source, IEnumerable outcomes) + + private IEnumerable GetNextActivities( + WorkflowExecutionContext workflowContext, + ActivityDefinition source, + IEnumerable outcomes) { var query = - from connection in workflowContext.Connections + from connection in workflowContext.WorkflowDefinition.Connections from outcome in outcomes - where connection.Source.Activity == source && (connection.Source.Outcome ?? OutcomeNames.Done).Equals(outcome, StringComparison.OrdinalIgnoreCase) - select connection.Target.Activity; + let connectionOutcome = connection.Outcome ?? OutcomeNames.Done + let isConnectionOutcome = connectionOutcome.Equals(outcome, StringComparison.OrdinalIgnoreCase) + where connection.SourceActivityId == source.Id && isConnectionOutcome + from activityDefinition in workflowContext.WorkflowDefinition.Activities + where activityDefinition.Id == connection.TargetActivityId + select activityDefinition; return query.Distinct(); } diff --git a/src/core/Elsa.Abstractions/ActivityResults/ScheduleActivitiesResult.cs b/src/core/Elsa.Abstractions/ActivityResults/ScheduleActivitiesResult.cs index a20377d0a..1db9eae44 100644 --- a/src/core/Elsa.Abstractions/ActivityResults/ScheduleActivitiesResult.cs +++ b/src/core/Elsa.Abstractions/ActivityResults/ScheduleActivitiesResult.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using Elsa.Models; using Elsa.Services; using Elsa.Services.Models; using ScheduledActivity = Elsa.Services.Models.ScheduledActivity; @@ -8,7 +9,7 @@ namespace Elsa.ActivityResults { public class ScheduleActivitiesResult : ActivityExecutionResult { - public ScheduleActivitiesResult(IEnumerable activities, object? input = default) => + public ScheduleActivitiesResult(IEnumerable activities, object? input = default) => Activities = activities.Select(x => new ScheduledActivity(x, input)); public ScheduleActivitiesResult(IEnumerable activities) => Activities = activities; diff --git a/src/core/Elsa.Abstractions/ActivityResults/SuspendResult.cs b/src/core/Elsa.Abstractions/ActivityResults/SuspendResult.cs index 39bcfc603..c4a681334 100644 --- a/src/core/Elsa.Abstractions/ActivityResults/SuspendResult.cs +++ b/src/core/Elsa.Abstractions/ActivityResults/SuspendResult.cs @@ -1,3 +1,4 @@ +using Elsa.Models; using Elsa.Services.Models; namespace Elsa.ActivityResults @@ -6,7 +7,9 @@ namespace Elsa.ActivityResults { protected override void Execute(ActivityExecutionContext activityExecutionContext) { - activityExecutionContext.WorkflowExecutionContext.BlockingActivities.Add(activityExecutionContext.ActivityDefinition); + var activityDefinition = activityExecutionContext.ActivityDefinition; + var blockingActivity = new BlockingActivity(activityDefinition.Id, activityDefinition.Type); + activityExecutionContext.WorkflowExecutionContext.BlockingActivities.Add(blockingActivity); activityExecutionContext.WorkflowExecutionContext.Suspend(); } } diff --git a/src/core/Elsa.Abstractions/Builders/IConnectionBuilder.cs b/src/core/Elsa.Abstractions/Builders/IConnectionBuilder.cs index 0e024803e..67de3b0f9 100644 --- a/src/core/Elsa.Abstractions/Builders/IConnectionBuilder.cs +++ b/src/core/Elsa.Abstractions/Builders/IConnectionBuilder.cs @@ -9,6 +9,6 @@ namespace Elsa.Builders Func Source { get; } Func Target{ get; } string Outcome { get; } - Connection BuildConnection(); + //Connection BuildConnection(); } } \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Extensions/WorkflowExecutionContextExtensions.cs b/src/core/Elsa.Abstractions/Extensions/WorkflowExecutionContextExtensions.cs index b1bb90e32..3db3b9340 100644 --- a/src/core/Elsa.Abstractions/Extensions/WorkflowExecutionContextExtensions.cs +++ b/src/core/Elsa.Abstractions/Extensions/WorkflowExecutionContextExtensions.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using Elsa.Models; using Elsa.Services; using Elsa.Services.Models; @@ -18,23 +19,35 @@ namespace Elsa // // return query; // } - - public static IEnumerable GetInboundConnections(this WorkflowExecutionContext workflowExecutionContext, IActivity activity) => workflowExecutionContext.Connections.Where(x => x.Target.Activity == activity); - public static IEnumerable GetOutboundConnections(this WorkflowExecutionContext workflowExecutionContext, IActivity activity) => workflowExecutionContext.Connections.Where(x => x.Source.Activity == activity); - public static IEnumerable GetInboundActivityPath(this WorkflowExecutionContext workflowExecutionContext, IActivity activity) => workflowExecutionContext.GetInboundActivityPathInternal(activity, activity).Distinct(); - private static IEnumerable GetInboundActivityPathInternal(this WorkflowExecutionContext workflowExecutionContext, IActivity activity, IActivity startingPointActivity) + public static IEnumerable + GetInboundConnections(this WorkflowExecutionContext workflowExecutionContext, string activityId) => + workflowExecutionContext.WorkflowDefinition.Connections.Where(x => x.TargetActivityId == activityId); + + public static IEnumerable GetOutboundConnections( + this WorkflowExecutionContext workflowExecutionContext, + string activityId) => + workflowExecutionContext.WorkflowDefinition.Connections.Where(x => x.SourceActivityId == activityId); + + public static IEnumerable GetInboundActivityPath(this WorkflowExecutionContext workflowExecutionContext, + string activityId) => + workflowExecutionContext.GetInboundActivityPathInternal(activityId, activityId).Distinct(); + + private static IEnumerable GetInboundActivityPathInternal( + this WorkflowExecutionContext workflowExecutionContext, + string activityId, + string startingPointActivityId) { - foreach (var connection in workflowExecutionContext.GetInboundConnections(activity)) + foreach (var connection in workflowExecutionContext.GetInboundConnections(activityId)) { // Circuit breaker: Detect workflows that implement repeating flows to prevent an infinite loop here. - if (connection.Source.Activity == startingPointActivity) + if (connection.SourceActivityId == startingPointActivityId) yield break; - yield return connection.Source.Activity.Id; + yield return connection.SourceActivityId!; foreach (var parentActivityId in workflowExecutionContext - .GetInboundActivityPathInternal(connection.Source.Activity, startingPointActivity) + .GetInboundActivityPathInternal(connection.SourceActivityId!, startingPointActivityId) .Distinct()) yield return parentActivityId; } diff --git a/src/core/Elsa.Abstractions/Extensions/WorkflowExtensions.cs b/src/core/Elsa.Abstractions/Extensions/WorkflowExtensions.cs index 4f0cb4b3f..bba4de369 100644 --- a/src/core/Elsa.Abstractions/Extensions/WorkflowExtensions.cs +++ b/src/core/Elsa.Abstractions/Extensions/WorkflowExtensions.cs @@ -8,10 +8,12 @@ namespace Elsa { public static class WorkflowExtensions { - public static IEnumerable WithVersion(this IEnumerable query, VersionOptions version) + public static IEnumerable WithVersion(this IEnumerable query, + VersionOptions version) => query.AsQueryable().WithVersion(version); - public static IQueryable WithVersion(this IQueryable query, VersionOptions version) + public static IQueryable WithVersion(this IQueryable query, + VersionOptions version) { if (version.IsDraft) query = query.Where(x => !x.IsPublished); @@ -30,10 +32,11 @@ namespace Elsa return query.OrderByDescending(x => x.Version); } - - public static IEnumerable GetStartActivities(this WorkflowBlueprint workflowBlueprint) + + public static IEnumerable GetStartActivities(this WorkflowBlueprint workflowBlueprint) { - var targetActivityIds = workflowBlueprint.Connections.Select(x => x.Target.Activity.Id).Distinct().ToLookup(x => x); + var targetActivityIds = workflowBlueprint.Connections.Select(x => x.Target.Activity.Id).Distinct() + .ToLookup(x => x); var query = from activity in workflowBlueprint.Activities @@ -43,46 +46,50 @@ namespace Elsa return query; } - public static IActivity GetActivity(this WorkflowBlueprint workflowBlueprint, string id) => workflowBlueprint.Activities.FirstOrDefault(x => x.Id == id); + public static IActivityBlueprint? GetActivity(this WorkflowBlueprint workflowBlueprint, string id) => + workflowBlueprint.Activities.FirstOrDefault(x => x.Id == id); - public static IEnumerable GetInboundConnections(this WorkflowBlueprint workflowBlueprint, string activityId) - { - return workflowBlueprint.Connections.Where(x => x.Target.Activity.Id == activityId).ToList(); - } + public static IEnumerable GetInboundConnections( + this WorkflowBlueprint workflowBlueprint, + string activityId) => workflowBlueprint.Connections.Where(x => x.Target.Activity.Id == activityId).ToList(); - public static IEnumerable GetOutboundConnections(this WorkflowBlueprint workflowBlueprint, string activityId) - { - return workflowBlueprint.Connections.Where(x => x.Source.Activity.Id == activityId).ToList(); - } + public static IEnumerable GetOutboundConnections( + this WorkflowBlueprint workflowBlueprint, + string activityId) => + workflowBlueprint.Connections.Where(x => x.Source.Activity.Id == activityId).ToList(); /// /// Returns the full path of incoming activities. /// - public static IEnumerable GetInboundActivityPath(this WorkflowBlueprint workflowBlueprint, string activityId) + public static IEnumerable GetInboundActivityPath( + this WorkflowBlueprint workflowBlueprint, + string activityId) { - var inspectedActivityIDs = new HashSet(); + var inspectedActivityIds = new HashSet(); - return workflowBlueprint.GetInboundActivityPathInternal(activityId, activityId, inspectedActivityIDs) - .Distinct().ToList(); + return workflowBlueprint.GetInboundActivityPathInternal(activityId, inspectedActivityIds) + .Distinct().ToList(); } - private static IEnumerable GetInboundActivityPathInternal(this WorkflowBlueprint workflowBlueprintBlueprintInstance, - string activityId, - string startingPointActivityId, - HashSet inspectedActivityIDs) + private static IEnumerable GetInboundActivityPathInternal( + this WorkflowBlueprint workflowBlueprintBlueprintInstance, + string activityId, + HashSet inspectedActivityIds) { foreach (var connection in workflowBlueprintBlueprintInstance.GetInboundConnections(activityId)) { // Circuit breaker: Detect workflows that implement repeating flows to prevent an infinite loop here. - if (inspectedActivityIDs.Contains(connection.Source.Activity.Id)) + if (inspectedActivityIds.Contains(connection.Source.Activity.Id)) yield break; yield return connection.Source.Activity.Id; - foreach (var parentActivityId in workflowBlueprintBlueprintInstance.GetInboundActivityPathInternal(connection.Source.Activity.Id, startingPointActivityId, inspectedActivityIDs) - .Distinct()) + foreach (var parentActivityId in workflowBlueprintBlueprintInstance.GetInboundActivityPathInternal( + connection.Source.Activity.Id, + inspectedActivityIds) + .Distinct()) { - inspectedActivityIDs.Add(parentActivityId); + inspectedActivityIds.Add(parentActivityId); yield return parentActivityId; } } diff --git a/src/core/Elsa.Abstractions/Messaging/Domain/ActivityNotification.cs b/src/core/Elsa.Abstractions/Messaging/Domain/ActivityNotification.cs index a1fe7fe2a..917286628 100644 --- a/src/core/Elsa.Abstractions/Messaging/Domain/ActivityNotification.cs +++ b/src/core/Elsa.Abstractions/Messaging/Domain/ActivityNotification.cs @@ -1,4 +1,5 @@ -using Elsa.Services; +using Elsa.Models; +using Elsa.Services; using Elsa.Services.Models; using MediatR; @@ -13,6 +14,6 @@ namespace Elsa.Messaging.Domain public ActivityExecutionContext ActivityExecutionContext { get; } public WorkflowExecutionContext WorkflowExecutionContext => ActivityExecutionContext.WorkflowExecutionContext; - public IActivity Activity => ActivityExecutionContext.ActivityDefinition; + public ActivityDefinition Activity => ActivityExecutionContext.ActivityDefinition; } } \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Services/Activity.cs b/src/core/Elsa.Abstractions/Services/Activity.cs index 94be90adf..f0079887a 100644 --- a/src/core/Elsa.Abstractions/Services/Activity.cs +++ b/src/core/Elsa.Abstractions/Services/Activity.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Elsa.ActivityResults; +using Elsa.Models; using Elsa.Services.Models; using Microsoft.Extensions.Localization; using ScheduledActivity = Elsa.Services.Models.ScheduledActivity; @@ -40,9 +41,9 @@ namespace Elsa.Services protected OutcomeResult Done(params string[] outcomes) => Done(outcomes, default); protected OutcomeResult Done(object? output) => new OutcomeResult(null, output); protected SuspendResult Suspend() => new SuspendResult(); - protected ScheduleActivitiesResult Schedule(params IActivity[] activities) => new ScheduleActivitiesResult(activities); - protected ScheduleActivitiesResult Schedule(IEnumerable activities, object input) => new ScheduleActivitiesResult(activities, input); - protected ScheduleActivitiesResult Schedule(IActivity activity, object input) => Schedule(new[] { activity }, input); + protected ScheduleActivitiesResult Schedule(params ActivityDefinition[] activities) => new ScheduleActivitiesResult(activities); + protected ScheduleActivitiesResult Schedule(IEnumerable activities, object input) => new ScheduleActivitiesResult(activities, input); + protected ScheduleActivitiesResult Schedule(ActivityDefinition activity, object input) => Schedule(new[] { activity }, input); protected ScheduleActivitiesResult Schedule(IEnumerable activities) => new ScheduleActivitiesResult(activities); protected CombinedResult Combine(IEnumerable results) => new CombinedResult(results); protected CombinedResult Combine(params IActivityExecutionResult[] results) => new CombinedResult(results); diff --git a/src/core/Elsa.Abstractions/Services/Models/Connection.cs b/src/core/Elsa.Abstractions/Services/Models/Connection.cs index 40cf8eabf..898bdf4ce 100644 --- a/src/core/Elsa.Abstractions/Services/Models/Connection.cs +++ b/src/core/Elsa.Abstractions/Services/Models/Connection.cs @@ -2,7 +2,7 @@ namespace Elsa.Services.Models { public class Connection : IConnection { - public Connection(IActivity sourceActivity, IActivity targetActivity, string sourceOutcome) + public Connection(IActivityBlueprint sourceActivity, IActivityBlueprint targetActivity, string sourceOutcome) : this(new SourceEndpoint(sourceActivity, sourceOutcome), new TargetEndpoint(targetActivity)) { } diff --git a/src/core/Elsa.Abstractions/Services/Models/Endpoint.cs b/src/core/Elsa.Abstractions/Services/Models/Endpoint.cs index 36ee27616..1a237aff3 100644 --- a/src/core/Elsa.Abstractions/Services/Models/Endpoint.cs +++ b/src/core/Elsa.Abstractions/Services/Models/Endpoint.cs @@ -2,15 +2,11 @@ namespace Elsa.Services.Models { public abstract class Endpoint { - protected Endpoint() - { - } - - protected Endpoint(IActivity activity) + protected Endpoint(IActivityBlueprint activity) { Activity = activity; } - public IActivity Activity { get; set; } + public IActivityBlueprint Activity { get; set; } } } \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Services/Models/IEndpoint.cs b/src/core/Elsa.Abstractions/Services/Models/IEndpoint.cs index 3fbb31e8a..bfc1f46b0 100644 --- a/src/core/Elsa.Abstractions/Services/Models/IEndpoint.cs +++ b/src/core/Elsa.Abstractions/Services/Models/IEndpoint.cs @@ -2,6 +2,6 @@ { public interface IEndpoint { - IActivity Activity { get; } + IActivityBlueprint Activity { get; } } } \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Services/Models/IWorkflowFault.cs b/src/core/Elsa.Abstractions/Services/Models/IWorkflowFault.cs index ab66a44ba..a029b0b56 100644 --- a/src/core/Elsa.Abstractions/Services/Models/IWorkflowFault.cs +++ b/src/core/Elsa.Abstractions/Services/Models/IWorkflowFault.cs @@ -1,10 +1,11 @@ -using Microsoft.Extensions.Localization; +using Elsa.Models; +using Microsoft.Extensions.Localization; namespace Elsa.Services.Models { public interface IWorkflowFault { - IActivity? FaultedActivity { get; } + ActivityDefinition? FaultedActivity { get; } LocalizedString? Message { get; } } } \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Services/Models/SourceEndpoint.cs b/src/core/Elsa.Abstractions/Services/Models/SourceEndpoint.cs index 60db86184..ecd7e3e35 100644 --- a/src/core/Elsa.Abstractions/Services/Models/SourceEndpoint.cs +++ b/src/core/Elsa.Abstractions/Services/Models/SourceEndpoint.cs @@ -2,7 +2,7 @@ namespace Elsa.Services.Models { public class SourceEndpoint : Endpoint, ISourceEndpoint { - public SourceEndpoint(IActivity activity, string outcome) : base(activity) => Outcome = outcome; + public SourceEndpoint(IActivityBlueprint activity, string outcome) : base(activity) => Outcome = outcome; public string Outcome { get; set; } } } \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Services/Models/TargetEndpoint.cs b/src/core/Elsa.Abstractions/Services/Models/TargetEndpoint.cs index ab838e119..5f73fb9ad 100644 --- a/src/core/Elsa.Abstractions/Services/Models/TargetEndpoint.cs +++ b/src/core/Elsa.Abstractions/Services/Models/TargetEndpoint.cs @@ -2,7 +2,7 @@ namespace Elsa.Services.Models { public class TargetEndpoint : Endpoint, ITargetEndpoint { - public TargetEndpoint(IActivity activity) : base(activity) + public TargetEndpoint(IActivityBlueprint activity) : base(activity) { } } diff --git a/src/core/Elsa.Abstractions/Services/Models/WorkflowExecutionContext.cs b/src/core/Elsa.Abstractions/Services/Models/WorkflowExecutionContext.cs index 241c394cd..9a68492d4 100644 --- a/src/core/Elsa.Abstractions/Services/Models/WorkflowExecutionContext.cs +++ b/src/core/Elsa.Abstractions/Services/Models/WorkflowExecutionContext.cs @@ -98,7 +98,7 @@ namespace Elsa.Services.Models public void Suspend() => Status = WorkflowStatus.Suspended; - public void Fault(IActivity? activity, LocalizedString? message) + public void Fault(ActivityDefinition? activity, LocalizedString? message) { Status = WorkflowStatus.Faulted; WorkflowFault = new WorkflowFault(activity, message); @@ -106,7 +106,7 @@ namespace Elsa.Services.Models public void Complete() => Status = WorkflowStatus.Completed; - public IActivity? GetActivity(string id) => WorkflowBlueprint.Activities.FirstOrDefault(x => x.Id == id); + public IActivityBlueprint? GetActivity(string id) => WorkflowBlueprint.Activities.FirstOrDefault(x => x.Id == id); public void UpdateWorkflowInstance(WorkflowInstance workflowInstance) { @@ -115,8 +115,8 @@ namespace Elsa.Services.Models workflowInstance.ScheduledActivities = new Stack( ScheduledActivities.Select(x => new Elsa.Models.ScheduledActivity(x.ActivityDefinition.Id, x.Input))); - workflowInstance.Activities = - WorkflowBlueprint.Activities.Select(x => new ActivityInstance(x.Id, x.Type, x.Output, Serialize(x))).ToList(); + //workflowInstance.Activities = + // WorkflowBlueprint.Activities.Select(x => new ActivityInstance(x.Id, x.Type, x.Output, Serialize(x))).ToList(); workflowInstance.BlockingActivities = BlockingActivities; workflowInstance.Status = Status; diff --git a/src/core/Elsa.Abstractions/Services/Models/WorkflowFault.cs b/src/core/Elsa.Abstractions/Services/Models/WorkflowFault.cs index 9d6762541..88fd6efd8 100644 --- a/src/core/Elsa.Abstractions/Services/Models/WorkflowFault.cs +++ b/src/core/Elsa.Abstractions/Services/Models/WorkflowFault.cs @@ -1,16 +1,17 @@ -using Microsoft.Extensions.Localization; +using Elsa.Models; +using Microsoft.Extensions.Localization; namespace Elsa.Services.Models { public class WorkflowFault : IWorkflowFault { - public WorkflowFault(IActivity? activity = default, LocalizedString? message = default) + public WorkflowFault(ActivityDefinition? activity = default, LocalizedString? message = default) { FaultedActivity = activity; Message = message; } - public IActivity? FaultedActivity { get; } + public ActivityDefinition? FaultedActivity { get; } public LocalizedString? Message { get; } } } \ No newline at end of file diff --git a/src/core/Elsa.Core/Activities/ControlFlow/For/For.cs b/src/core/Elsa.Core/Activities/ControlFlow/For/For.cs index a98b11d55..b7098a1b2 100644 --- a/src/core/Elsa.Core/Activities/ControlFlow/For/For.cs +++ b/src/core/Elsa.Core/Activities/ControlFlow/For/For.cs @@ -1,6 +1,7 @@ using Elsa.ActivityResults; using Elsa.Attributes; using Elsa.Services; +using Elsa.Services.Models; // ReSharper disable once CheckNamespace namespace Elsa.Activities.ControlFlow @@ -24,7 +25,7 @@ namespace Elsa.Activities.ControlFlow private int? CurrentValue { get; set; } - protected override IActivityExecutionResult OnExecute() + protected override IActivityExecutionResult OnExecute(ActivityExecutionContext context) { var currentValue = CurrentValue ?? Start; @@ -33,7 +34,7 @@ namespace Elsa.Activities.ControlFlow var input = currentValue; currentValue += Step; CurrentValue = currentValue; - return Combine(Schedule(this), Done(OutcomeNames.Iterate, input)); + return Combine(Schedule(context.ActivityDefinition), Done(OutcomeNames.Iterate, input)); } CurrentValue = null; diff --git a/src/core/Elsa.Core/Activities/ControlFlow/ForEach/ForEach.cs b/src/core/Elsa.Core/Activities/ControlFlow/ForEach/ForEach.cs index 9718c80e8..6011f51ec 100644 --- a/src/core/Elsa.Core/Activities/ControlFlow/ForEach/ForEach.cs +++ b/src/core/Elsa.Core/Activities/ControlFlow/ForEach/ForEach.cs @@ -16,7 +16,7 @@ namespace Elsa.Activities.ControlFlow Category = "Control Flow", Description = "Iterate over a collection.", Icon = "far fa-circle", - Outcomes = new[] {OutcomeNames.Iterate, OutcomeNames.Done} + Outcomes = new[] { OutcomeNames.Iterate, OutcomeNames.Done } )] public class ForEach : Activity { @@ -27,9 +27,7 @@ namespace Elsa.Activities.ControlFlow private int? CurrentIndex { get; set; } - protected override async Task OnExecuteAsync( - ActivityExecutionContext context, - CancellationToken cancellationToken) + protected override IActivityExecutionResult OnExecute(ActivityExecutionContext context) { var collection = CollectionCopy; @@ -42,7 +40,7 @@ namespace Elsa.Activities.ControlFlow { var input = collection[currentIndex]; CurrentIndex = currentIndex + 1; - return Combine(Schedule(this), Done(OutcomeNames.Iterate, input)); + return Combine(Schedule(context.ActivityDefinition), Done(OutcomeNames.Iterate, input)); } CurrentIndex = null; diff --git a/src/core/Elsa.Core/Activities/ControlFlow/Fork/ForkBuilder.cs b/src/core/Elsa.Core/Activities/ControlFlow/Fork/ForkBuilder.cs index cadc84fdd..874e5cecc 100644 --- a/src/core/Elsa.Core/Activities/ControlFlow/Fork/ForkBuilder.cs +++ b/src/core/Elsa.Core/Activities/ControlFlow/Fork/ForkBuilder.cs @@ -11,7 +11,7 @@ namespace Elsa.Activities.ControlFlow public ForkBuilder(IActivityBuilder activityBuilder) { _activityBuilder = activityBuilder; - _fork = (Fork)activityBuilder.Activity; + //_fork = (Fork)activityBuilder.Activity; } public IOutcomeBuilder When(string branch) diff --git a/src/core/Elsa.Core/Activities/ControlFlow/Fork/ForkBuilderExtensions.cs b/src/core/Elsa.Core/Activities/ControlFlow/Fork/ForkBuilderExtensions.cs index 69e1426a0..e1fb6e4b1 100644 --- a/src/core/Elsa.Core/Activities/ControlFlow/Fork/ForkBuilderExtensions.cs +++ b/src/core/Elsa.Core/Activities/ControlFlow/Fork/ForkBuilderExtensions.cs @@ -8,11 +8,12 @@ namespace Elsa.Activities.ControlFlow { public static IWorkflowBuilder Fork(this IBuilder builder, Action setup) { - var activityBuilder = builder.Then(); - var forkBuilder = new ForkBuilder(activityBuilder); + //var activityBuilder = builder.Then(); + //var forkBuilder = new ForkBuilder(activityBuilder); - setup(forkBuilder); - return activityBuilder.WorkflowBuilder; + //setup(forkBuilder); + //return activityBuilder.WorkflowBuilder; + throw new NotImplementedException(); } } } \ No newline at end of file diff --git a/src/core/Elsa.Core/Activities/Primitives/Inline.cs b/src/core/Elsa.Core/Activities/Primitives/Inline.cs index 9a9290f2b..8114d30d6 100644 --- a/src/core/Elsa.Core/Activities/Primitives/Inline.cs +++ b/src/core/Elsa.Core/Activities/Primitives/Inline.cs @@ -12,40 +12,8 @@ namespace Elsa.Activities.Primitives /// public class Inline : Activity { - public Inline() - { - Function = context => Task.FromResult(Done()); - } - - public Inline(Func> function) - { - Function = function; - } - - public Inline(Func function) - { - Function = context => - { - function(context); - return Task.FromResult(Done()); - }; - } - - public Inline(Action function) - { - Function = context => - { - function(context); - return Task.FromResult(Done()); - }; - } - - public Inline(Action function) : this(context => function()) - { - } - - public Func> Function { get; set; } - - protected override Task OnExecuteAsync(ActivityExecutionContext context, CancellationToken cancellationToken) => Function(context); + public Inline() => Function = context => new ValueTask(Done()); + public Func> Function { get; set; } + protected override ValueTask OnExecuteAsync(ActivityExecutionContext context, CancellationToken cancellationToken) => Function(context); } } \ No newline at end of file diff --git a/src/core/Elsa.Core/Builders/ActivityBuilderExtensions.cs b/src/core/Elsa.Core/Builders/ActivityBuilderExtensions.cs index 22c242488..660d5f66b 100644 --- a/src/core/Elsa.Core/Builders/ActivityBuilderExtensions.cs +++ b/src/core/Elsa.Core/Builders/ActivityBuilderExtensions.cs @@ -8,9 +8,57 @@ namespace Elsa.Builders { public static class ActivityBuilderExtensions { - public static IActivityBuilder Then(this IBuilder builder, Func> activity) => builder.Then(new Inline(activity)); - public static IActivityBuilder Then(this IBuilder builder, Func activity) => builder.Then(new Inline(activity)); - public static IActivityBuilder Then(this IBuilder builder, Action activity) => builder.Then(new Inline(activity)); - public static IActivityBuilder Then(this IBuilder builder, Action activity) => builder.Then(new Inline(activity)); + public static IActivityBuilder Then(this IBuilder builder, + Func> activity) => + builder.Then(x => x.Function = RunInline(activity)); + + public static IActivityBuilder + Then(this IBuilder builder, Func activity) => + builder.Then(x => x.Function = RunInline(activity)); + + public static IActivityBuilder Then(this IBuilder builder, Action activity) => + builder.Then(x => x.Function = RunInline(activity)); + + public static IActivityBuilder Then(this IBuilder builder, Action activity) => + builder.Then(x => x.Function = RunInline(activity)); + + private static Func> RunInline( + Func> activity) => + async context => + { + await activity(context); + return new OutcomeResult(); + }; + + private static Func> RunInline( + Func activity) => + async context => + { + await activity(context); + return new OutcomeResult(); + }; + + private static Func> RunInline( + Action activity) => + context => + { + activity(context); + return new ValueTask(new OutcomeResult()); + }; + + private static Func> RunInline( + Func activity) => + async context => + { + await activity(context); + return new OutcomeResult(); + }; + + private static Func> RunInline(Action activity) => + context => + { + activity(); + return new ValueTask(new OutcomeResult()); + }; } } \ No newline at end of file diff --git a/src/core/Elsa.Core/Builders/ConnectionBuilder.cs b/src/core/Elsa.Core/Builders/ConnectionBuilder.cs index 975fc9630..e9f6d7a9a 100644 --- a/src/core/Elsa.Core/Builders/ConnectionBuilder.cs +++ b/src/core/Elsa.Core/Builders/ConnectionBuilder.cs @@ -18,6 +18,6 @@ namespace Elsa.Builders Outcome = outcome; } - public Connection BuildConnection() => new Connection(Source().Activity, Target().Activity, Outcome); + //public Connection BuildConnection() => new Connection(Source, Target().Activity, Outcome); } } \ No newline at end of file