Update namespaces and decorate activities with attributes

This commit is contained in:
Sipke Schoorstra 2022-03-24 12:18:14 +01:00
parent b23ebdaddd
commit a6e288fdd7
55 changed files with 121 additions and 83 deletions

View file

@ -1,6 +1,6 @@
using Elsa.Activities.Primitives;
using Elsa.Api.ApiResults;
using Elsa.Contracts;
using Elsa.Modules.Activities.Activities.Primitives;
using Elsa.Runtime.Models;
using Microsoft.AspNetCore.Http;

View file

@ -5,6 +5,9 @@ using Elsa.Models;
namespace Elsa.Activities;
/// <summary>
/// A base class for activities that control a collection of activities.
/// </summary>
public abstract class Container : Activity, IContainer
{
protected Container()

View file

@ -12,6 +12,7 @@ public enum ForOperator
GreaterThanOrEqual
}
[Activity("Elsa", "Control Flow", "Iterate over a sequence of steps between a start and an end number.")]
public class For : Activity
{
public For()

View file

@ -4,12 +4,25 @@ using Elsa.Models;
namespace Elsa.Activities;
[Activity("Elsa", "Control Flow", "Iterate over a set of values.")]
public class ForEach : Activity
{
[Input] public Input<ICollection<object>> Items { get; set; } = new(Array.Empty<object>());
[Outbound] public IActivity? Body { get; set; }
public Variable CurrentValue { get; set; } = new();
private const string CurrentIndexProperty = "CurrentIndex";
/// <summary>
/// The set of values to iterate.
/// </summary>
[Input] public Input<ICollection<object>> Items { get; set; } = new(Array.Empty<object>());
/// <summary>
/// The activity to execute for each iteration.
/// </summary>
[Outbound] public IActivity? Body { get; set; }
/// <summary>
/// The current value being iterated.
/// </summary>
public Variable CurrentValue { get; set; } = new();
protected override void Execute(ActivityExecutionContext context)
{

View file

@ -5,9 +5,17 @@ using Elsa.Models;
namespace Elsa.Activities;
[Activity("Elsa", "Control Flow", "Branch execution into multiple branches.")]
public class Fork : Activity
{
/// <summary>
/// Controls when this activity yields control back to its parent activity.
/// </summary>
[Input] public JoinMode JoinMode { get; set; } = JoinMode.WaitAny;
/// <summary>
/// The branches to schedule.
/// </summary>
[Outbound] public ICollection<IActivity> Branches { get; set; } = new List<IActivity>();
protected override void Execute(ActivityExecutionContext context) => context.PostActivities(Branches.Reverse(), CompleteChildAsync);

View file

@ -1,11 +1,14 @@
using System.Text.Json.Serialization;
using Elsa.Attributes;
using Elsa.Contracts;
using Elsa.Models;
namespace Elsa.Activities;
[Activity("Elsa", "Control Flow", "Evaluate a Boolean condition to determine which path to execute next.")]
public class If : Activity
{
[JsonConstructor]
public If()
{
}
@ -14,8 +17,19 @@ public class If : Activity
public If(Func<ExpressionExecutionContext, bool> condition) => Condition = new Input<bool>(condition);
public If(Func<bool> condition) => Condition = new Input<bool>(condition);
/// <summary>
/// The condition to evaluate.
/// </summary>
[Input] public Input<bool> Condition { get; set; } = new(new Literal<bool>(false));
/// <summary>
/// The activity to execute when the condition evaluates to true.
/// </summary>
[Outbound] public IActivity? Then { get; set; }
/// <summary>
/// The activity to execute when the condition evaluates to false.
/// </summary>
[Outbound] public IActivity? Else { get; set; }
protected override void Execute(ActivityExecutionContext context)
@ -27,8 +41,5 @@ public class If : Activity
context.PostActivity(nextNode, OnChildCompletedAsync);
}
private ValueTask OnChildCompletedAsync(ActivityExecutionContext context, ActivityExecutionContext childContext)
{
return ValueTask.CompletedTask;
}
private ValueTask OnChildCompletedAsync(ActivityExecutionContext context, ActivityExecutionContext childContext) => ValueTask.CompletedTask;
}

View file

@ -1,3 +1,4 @@
using Elsa.Attributes;
using Elsa.Models;
namespace Elsa.Activities;
@ -5,6 +6,7 @@ namespace Elsa.Activities;
/// <summary>
/// Represents an inline code activity that can be used to execute arbitrary .NET code from a workflow.
/// </summary>
[Activity("Elsa", "Primitives", "Evaluate a Boolean condition to determine which path to execute next.")]
public class Inline : Activity
{
private readonly Func<ActivityExecutionContext, ValueTask> _activity;

View file

@ -4,6 +4,7 @@ using Elsa.Models;
namespace Elsa.Activities;
[Activity("Elsa", "Control Flow", "Schedule an activity for each item in parallel.")]
public class ParallelForEach<T> : Activity
{
private const string CollectedCountProperty = nameof(CollectedCountProperty);

View file

@ -6,7 +6,7 @@ using Elsa.Models;
namespace Elsa.Activities;
[Category("Workflows")]
[Activity("Elsa", "Workflows", "Execute a set of activities in sequence")]
[Activity("Elsa", "Workflows", "Execute a set of activities in sequence.")]
public class Sequence : Container
{
private const string CurrentIndexProperty = "CurrentIndex";

View file

@ -1,8 +1,11 @@
using System.ComponentModel;
using Elsa.Attributes;
using Elsa.Models;
namespace Elsa.Activities;
[Browsable(false)]
[Activity("Elsa", "Primitives", "Set a workflow variable to a given value.")]
public class SetVariable<T> : Activity
{
public SetVariable()
@ -37,6 +40,7 @@ public class SetVariable<T> : Activity
}
}
[Activity("Elsa", "Primitives", "Set a workflow variable to a given value.")]
public class SetVariable : Activity
{
[Input] public Input<object?> Value { get; set; } = new(default(object));

View file

@ -9,6 +9,7 @@ namespace Elsa.Activities;
/// The Switch activity is an approximation of the `switch` construct in C#.
/// When a case evaluates to true, the associated activity is then scheduled for execution.
/// </summary>
[Activity("Elsa", "Control Flow", "Evaluate a set of case conditions and schedule the activity for a matching case.")]
public class Switch : Activity
{
[Input(UIHint = "switch-editor")] public ICollection<SwitchCase> Cases { get; set; } = new List<SwitchCase>();

View file

@ -1,11 +1,14 @@
using System.Text.Json.Serialization;
using Elsa.Attributes;
using Elsa.Contracts;
using Elsa.Models;
namespace Elsa.Activities;
[Activity("Elsa", "Primitives", "Execute an activity while a given condition evaluates to true.")]
public class While : Activity
{
[JsonConstructor]
public While(IActivity? body = default)
{
Body = body!;

View file

@ -1,5 +1,9 @@
namespace Elsa.Contracts;
/// <summary>
/// A node resolver inspects a given activity and returns its outbound "ports". A port is an activity that this activity connects to.
/// Node resolvers are used to inspect a workflow structure and build a graph of nodes from it for easy node traversal.
/// </summary>
public interface IActivityNodeResolver
{
int Priority { get; }

View file

@ -2,9 +2,7 @@ namespace Elsa.Helpers;
public static class TypeNameHelper
{
private static readonly string[] WellknownNamespaces = { "Elsa.Activities", "Elsa.Triggers" };
public static string? GenerateNamespace(Type activityType) => GenerateTypeNamespace(activityType);
public static string? GenerateNamespace(Type activityType) => activityType.Namespace;
public static string GenerateTypeName(Type type, string? ns)
{
@ -29,16 +27,4 @@ public static class TypeNameHelper
return index < 0 ? ns : ns[(index + 1)..];
}
private static string? GenerateTypeNamespace(Type type)
{
if (type.Namespace == null)
return null;
foreach (var wellknownNamespace in WellknownNamespaces)
if (type.Namespace.StartsWith(wellknownNamespace))
return type.Namespace[(wellknownNamespace.Length + 1)..];
return type.Namespace;
}
}

View file

@ -1,7 +1,7 @@
using Elsa.Activities.Extensions;
using Elsa.ActivityNodeResolvers;
using Elsa.Contracts;
using Elsa.Expressions;
using Elsa.Modules.Activities.Extensions;
using Elsa.Options;
using Elsa.Persistence.Extensions;
using Elsa.Pipelines.ActivityExecution;

View file

@ -175,7 +175,7 @@ export class FlowchartComponent implements ContainerActivityComponent {
}
return {
typeName: 'Workflows.Flowchart',
typeName: 'Elsa.Flowchart',
activities: remainingActivities,
connections: remainingConnections,
id: this.rootId,

View file

@ -1,7 +1,9 @@
using Elsa.Attributes;
using Elsa.Models;
namespace Elsa.Activities.Console;
namespace Elsa.Modules.Activities.Activities.Console;
[Activity("Elsa", "Console", "Read a line of text from the console.")]
public class ReadLine : Activity<string>
{
public ReadLine()

View file

@ -1,8 +1,10 @@
using System.ComponentModel;
using Elsa.Attributes;
using Elsa.Models;
namespace Elsa.Activities.Console;
namespace Elsa.Modules.Activities.Activities.Console;
[Activity("Elsa", "Console", "Write a line of text to the console.")]
public class WriteLine : Activity
{
public WriteLine()

View file

@ -2,8 +2,9 @@ using Elsa.Attributes;
using Elsa.Contracts;
using Elsa.Models;
namespace Elsa.Activities.Primitives;
namespace Elsa.Modules.Activities.Activities.Primitives;
[Activity("Elsa", "Primitives", "Wait for an event to be triggered.")]
public class Event : Activity
{
public Event()

View file

@ -1 +0,0 @@
namespace Elsa.Activities.Workflows;

View file

@ -4,12 +4,12 @@ using Elsa.Persistence.Models;
using Elsa.Runtime.Contracts;
using Microsoft.Extensions.Logging;
namespace Elsa.Activities.Workflows;
namespace Elsa.Modules.Activities.Activities.Workflows;
/// <summary>
/// Creates a new workflow instance of the specified workflow and dispatches it for execution.
/// </summary>
[Activity("Elsa", "Create a new workflow instance of the specified workflow and dispatches it for execution.")]
[Activity("Elsa", "Workflows","Create a new workflow instance of the specified workflow and dispatches it for execution.")]
public class DispatchWorkflow : Activity
{
public Input<string> WorkflowDefinitionId { get; set; } = new("");

View file

@ -1,13 +1,13 @@
using System.ComponentModel;
using Elsa.Attributes;
using Elsa.Contracts;
using Elsa.Models;
using Container = Elsa.Activities.Container;
namespace Elsa.Activities.Workflows;
namespace Elsa.Modules.Activities.Activities.Workflows;
public record Connection(IActivity Source, IActivity Target, string? SourcePort, string TargetPort);
[Category("Workflows")]
[Activity("Elsa", "Workflows", "A flowchart is a collection of activities and connections between them.")]
public class Flowchart : Container
{
[Node] public IActivity? Start { get; set; } = default!;

View file

@ -3,13 +3,13 @@ using Elsa.Attributes;
using Elsa.Models;
using Elsa.Runtime.Middleware;
namespace Elsa.Activities.Workflows;
namespace Elsa.Modules.Activities.Activities.Workflows;
/// <summary>
/// Sets a transient property on the workflow execution context the specified name value.
/// This value is used by the <see cref="PersistWorkflowInstanceMiddleware"/> component to update the name of the workflow instance.
/// </summary>
[Activity("Elsa", "Set the name of the workflow instance to a specified value.")]
[Activity("Elsa", "Workflows", "Set the name of the workflow instance to a specified value.")]
public class SetName : Activity
{
internal static readonly object WorkflowInstanceNameKey = new();

View file

@ -1,10 +1,10 @@
using System.Text.Json;
using System.Text.Json.Serialization;
using Elsa.Activities.Converters;
using Elsa.Management.Contracts;
using Elsa.Modules.Activities.Converters;
using Microsoft.Extensions.DependencyInjection;
namespace Elsa.Activities.Configurators;
namespace Elsa.Modules.Activities.Configurators;
/// <summary>
/// Add additional <see cref="JsonConverter"/> objects.

View file

@ -1,9 +1,9 @@
using System.Text.Json;
using System.Text.Json.Serialization;
using Elsa.Activities.Workflows;
using Elsa.Contracts;
using Elsa.Modules.Activities.Activities.Workflows;
namespace Elsa.Activities.Converters;
namespace Elsa.Modules.Activities.Converters;
public class ConnectionJsonConverter : JsonConverter<Connection>
{

View file

@ -1,9 +1,9 @@
using System.Text.Json;
using System.Text.Json.Serialization;
using Elsa.Activities.Workflows;
using Elsa.Contracts;
using Elsa.Modules.Activities.Activities.Workflows;
namespace Elsa.Activities.Converters;
namespace Elsa.Modules.Activities.Converters;
public class FlowchartJsonConverter : JsonConverter<Flowchart>
{

View file

@ -10,8 +10,4 @@
<ProjectReference Include="..\..\runtime\Elsa.Runtime\Elsa.Runtime.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Activities\ControlFlow" />
</ItemGroup>
</Project>

View file

@ -1,10 +1,10 @@
using Elsa.Activities.Configurators;
using Elsa.Activities.Resolvers;
using Elsa.Contracts;
using Elsa.Management.Contracts;
using Elsa.Modules.Activities.Configurators;
using Elsa.Modules.Activities.Resolvers;
using Microsoft.Extensions.DependencyInjection;
namespace Elsa.Activities.Extensions;
namespace Elsa.Modules.Activities.Extensions;
public static class ServiceCollectionExtensions
{

View file

@ -1,6 +1,7 @@
using Elsa.Activities;
using Elsa.Contracts;
namespace Elsa.Activities.Resolvers;
namespace Elsa.Modules.Activities.Resolvers;
/// <summary>
/// Returns a list of outbound activities for a given <see cref="Switch"/> activity's branches.

View file

@ -1,8 +1,8 @@
using System.Threading.Tasks;
using Elsa.Activities;
using Elsa.Activities.Console;
using Elsa.Attributes;
using Elsa.Models;
using Elsa.Modules.Activities.Activities.Console;
namespace Elsa.Samples.Web1.Activities;

View file

@ -1,12 +1,12 @@
using Elsa.Activities;
using Elsa.Activities.Console;
using Elsa.Activities.Workflows;
using Elsa.Api.Extensions;
using Elsa.Extensions;
using Elsa.Jobs.Extensions;
using Elsa.Management.Contracts;
using Elsa.Management.Extensions;
using Elsa.Mediator.Extensions;
using Elsa.Modules.Activities.Activities.Console;
using Elsa.Modules.Activities.Activities.Workflows;
using Elsa.Modules.AzureServiceBus.Activities;
using Elsa.Modules.AzureServiceBus.Extensions;
using Elsa.Modules.Hangfire.Services;

View file

@ -1,7 +1,7 @@
using Elsa.Activities;
using Elsa.Activities.Console;
using Elsa.Contracts;
using Elsa.Models;
using Elsa.Modules.Activities.Activities.Console;
using Elsa.Runtime.Contracts;
using Elsa.Samples.Web1.Activities;

View file

@ -1,9 +1,9 @@
using System.Collections.Generic;
using System.Net;
using Elsa.Activities;
using Elsa.Activities.Console;
using Elsa.Contracts;
using Elsa.Models;
using Elsa.Modules.Activities.Activities.Console;
using Elsa.Modules.Http;
using Elsa.Runtime.Contracts;
using Microsoft.AspNetCore.Http;

View file

@ -1,7 +1,7 @@
using System;
using Elsa.Activities;
using Elsa.Activities.Console;
using Elsa.Contracts;
using Elsa.Modules.Activities.Activities.Console;
using Elsa.Modules.Scheduling.Triggers;
using Elsa.Runtime.Contracts;

View file

@ -1,5 +1,5 @@
using Elsa.Activities.Console;
using Elsa.Contracts;
using Elsa.Modules.Activities.Activities.Console;
using Elsa.Runtime.Contracts;
namespace Elsa.Samples.Web1.Workflows;

View file

@ -1,9 +1,9 @@
using System.Collections.Generic;
using System.Net;
using Elsa.Activities;
using Elsa.Activities.Console;
using Elsa.Contracts;
using Elsa.Models;
using Elsa.Modules.Activities.Activities.Console;
using Elsa.Modules.Http;
using Elsa.Runtime.Contracts;

View file

@ -1,7 +1,7 @@
using Elsa.Activities;
using Elsa.Activities.Console;
using Elsa.Contracts;
using Elsa.Models;
using Elsa.Modules.Activities.Activities.Console;
using Elsa.Modules.AzureServiceBus.Activities;
using Elsa.Runtime.Contracts;

View file

@ -1,7 +1,7 @@
using Elsa.Activities;
using Elsa.Activities.Console;
using Elsa.Contracts;
using Elsa.Models;
using Elsa.Modules.Activities.Activities.Console;
using Elsa.Modules.JavaScript.Activities;
using Elsa.Runtime.Contracts;

View file

@ -1,7 +1,7 @@
using Elsa.Activities;
using Elsa.Activities.Console;
using Elsa.Contracts;
using Elsa.Models;
using Elsa.Modules.Activities.Activities.Console;
using Elsa.Modules.WorkflowContexts.Abstractions;
using Elsa.Modules.WorkflowContexts.Extensions;
using Elsa.Runtime.Contracts;

View file

@ -1,5 +1,5 @@
using Elsa.Activities.Console;
using Elsa.Contracts;
using Elsa.Modules.Activities.Activities.Console;
using Elsa.Runtime.Contracts;
namespace Elsa.Samples.Web2.Workflows;

View file

@ -1,9 +1,9 @@
using System.Collections.Generic;
using Elsa.Activities;
using Elsa.Activities.Console;
using Elsa.Activities.Primitives;
using Elsa.Contracts;
using Elsa.Models;
using Elsa.Modules.Activities.Activities.Console;
using Elsa.Modules.Activities.Activities.Primitives;
namespace Elsa.Samples.Console1.Workflows;

View file

@ -1,7 +1,7 @@
using Elsa.Activities;
using Elsa.Activities.Console;
using Elsa.Activities.Primitives;
using Elsa.Contracts;
using Elsa.Modules.Activities.Activities.Console;
using Elsa.Modules.Activities.Activities.Primitives;
namespace Elsa.Samples.Console1.Workflows;

View file

@ -1,7 +1,7 @@
using Elsa.Activities;
using Elsa.Activities.Console;
using Elsa.Contracts;
using Elsa.Models;
using Elsa.Modules.Activities.Activities.Console;
namespace Elsa.Samples.Console1.Workflows;

View file

@ -1,5 +1,5 @@
using Elsa.Activities.Console;
using Elsa.Contracts;
using Elsa.Modules.Activities.Activities.Console;
namespace Elsa.Samples.Console1.Workflows;

View file

@ -1,8 +1,8 @@
using Elsa.Activities;
using Elsa.Activities.Console;
using Elsa.Activities.Workflows;
using Elsa.Contracts;
using Elsa.Models;
using Elsa.Modules.Activities.Activities.Console;
using Elsa.Modules.Activities.Activities.Workflows;
namespace Elsa.Samples.Console1.Workflows;

View file

@ -1,8 +1,8 @@
using System.Collections.Generic;
using Elsa.Activities;
using Elsa.Activities.Console;
using Elsa.Contracts;
using Elsa.Models;
using Elsa.Modules.Activities.Activities.Console;
namespace Elsa.Samples.Console1.Workflows;

View file

@ -1,7 +1,7 @@
using Elsa.Activities;
using Elsa.Activities.Console;
using Elsa.Contracts;
using Elsa.Models;
using Elsa.Modules.Activities.Activities.Console;
namespace Elsa.Samples.Console1.Workflows;

View file

@ -1,7 +1,7 @@
using Elsa.Activities;
using Elsa.Activities.Console;
using Elsa.Activities.Primitives;
using Elsa.Contracts;
using Elsa.Modules.Activities.Activities.Console;
using Elsa.Modules.Activities.Activities.Primitives;
namespace Elsa.Samples.Console1.Workflows;

View file

@ -1,7 +1,7 @@
using Elsa.Activities;
using Elsa.Activities.Console;
using Elsa.Contracts;
using Elsa.Models;
using Elsa.Modules.Activities.Activities.Console;
namespace Elsa.Samples.Console1.Workflows;

View file

@ -1,6 +1,6 @@
using Elsa.Activities;
using Elsa.Activities.Console;
using Elsa.Contracts;
using Elsa.Modules.Activities.Activities.Console;
namespace Elsa.Samples.Console1.Workflows;

View file

@ -1,5 +1,5 @@
using Elsa.Activities.Console;
using Elsa.Contracts;
using Elsa.Modules.Activities.Activities.Console;
namespace Elsa.Samples.Console1.Workflows;

View file

@ -1,8 +1,8 @@
using System.Collections.Generic;
using Elsa.Activities;
using Elsa.Activities.Console;
using Elsa.Contracts;
using Elsa.Models;
using Elsa.Modules.Activities.Activities.Console;
namespace Elsa.Samples.Console1.Workflows;

View file

@ -1,7 +1,7 @@
using Elsa.Activities;
using Elsa.Activities.Console;
using Elsa.Contracts;
using Elsa.Models;
using Elsa.Modules.Activities.Activities.Console;
namespace Elsa.Samples.Console1.Workflows;

View file

@ -1,8 +1,8 @@
using Elsa.Activities;
using Elsa.Activities.Console;
using Elsa.Activities.Primitives;
using Elsa.Contracts;
using Elsa.Models;
using Elsa.Modules.Activities.Activities.Console;
using Elsa.Modules.Activities.Activities.Primitives;
namespace Elsa.Samples.Console1.Workflows;

View file

@ -2,13 +2,13 @@
using System.IO;
using System.Reflection;
using Elsa.Activities;
using Elsa.Activities.Console;
using Elsa.Contracts;
using Elsa.Dsl.Abstractions;
using Elsa.Dsl.Contracts;
using Elsa.Dsl.Extensions;
using Elsa.Extensions;
using Elsa.Models;
using Elsa.Modules.Activities.Activities.Console;
using Elsa.Modules.Http;
using Elsa.Modules.Scheduling.Triggers;
using Elsa.Persistence.InMemory.Extensions;