From d0b60e18d1408a699dcbd91d7df9a678dd2e5c56 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Sun, 14 Oct 2018 20:16:15 +0200 Subject: [PATCH] WIP --- .../Handlers/ActivityHandler.cs | 117 ++++++++++++++++++ .../Handlers/IActivityHandler.cs | 65 ++++++++++ src/Flowsharp.Core/Handlers/IfElseHandler.cs | 7 ++ .../{Activities => Models}/Workflow.cs | 0 .../ActivateEndpointResult.cs | 0 .../ActivityExecutionResult.cs | 0 .../FinishWorkflowResult.cs | 0 .../HaltResult.cs | 0 .../IActivityExecutionResult.cs | 0 .../NoopResult.cs | 0 .../ReturnValueResult.cs | 0 .../ScheduleActivityResult.cs | 0 12 files changed, 189 insertions(+) create mode 100644 src/Flowsharp.Core/Handlers/ActivityHandler.cs create mode 100644 src/Flowsharp.Core/Handlers/IActivityHandler.cs create mode 100644 src/Flowsharp.Core/Handlers/IfElseHandler.cs rename src/Flowsharp.Core/{Activities => Models}/Workflow.cs (100%) rename src/Flowsharp.Core/{ActivityResults => Results}/ActivateEndpointResult.cs (100%) rename src/Flowsharp.Core/{ActivityResults => Results}/ActivityExecutionResult.cs (100%) rename src/Flowsharp.Core/{ActivityResults => Results}/FinishWorkflowResult.cs (100%) rename src/Flowsharp.Core/{ActivityResults => Results}/HaltResult.cs (100%) rename src/Flowsharp.Core/{ActivityResults => Results}/IActivityExecutionResult.cs (100%) rename src/Flowsharp.Core/{ActivityResults => Results}/NoopResult.cs (100%) rename src/Flowsharp.Core/{ActivityResults => Results}/ReturnValueResult.cs (100%) rename src/Flowsharp.Core/{ActivityResults => Results}/ScheduleActivityResult.cs (100%) diff --git a/src/Flowsharp.Core/Handlers/ActivityHandler.cs b/src/Flowsharp.Core/Handlers/ActivityHandler.cs new file mode 100644 index 000000000..a6e1fe6ab --- /dev/null +++ b/src/Flowsharp.Core/Handlers/ActivityHandler.cs @@ -0,0 +1,117 @@ +using System.Threading; +using System.Threading.Tasks; +using Flowsharp.Activities; +using Flowsharp.ActivityResults; +using Flowsharp.Models; + +namespace Flowsharp.Handlers +{ + public abstract class ActivityHandler : IActivityHandler where T : IActivity + { + public virtual Task CanExecuteAsync(WorkflowExecutionContext workflowContext, ActivityExecutionContext activityContext, CancellationToken cancellationToken) + { + return Task.FromResult(CanExecute(workflowContext, activityContext)); + } + + public virtual Task ExecuteAsync(WorkflowExecutionContext workflowContext, ActivityExecutionContext activityContext, CancellationToken cancellationToken) + { + return Task.FromResult(Execute(workflowContext, activityContext)); + } + + public virtual Task ResumeAsync(WorkflowExecutionContext workflowContext, ActivityExecutionContext activityContext, CancellationToken cancellationToken) + { + return Task.FromResult(Resume(workflowContext, activityContext)); + } + + public virtual Task OnActivityExecutedAsync(WorkflowExecutionContext workflowContext, ActivityExecutionContext activityContext, CancellationToken cancellationToken) + { + OnActivityExecuted(workflowContext, activityContext); + return Task.CompletedTask; + } + + public virtual Task OnActivityExecutingAsync(WorkflowExecutionContext workflowContext, ActivityExecutionContext activityContext, CancellationToken cancellationToken) + { + OnActivityExecuting(workflowContext, activityContext); + return Task.CompletedTask; + } + + public virtual Task ReceiveInputAsync(WorkflowExecutionContext workflowContext, Variables input, CancellationToken cancellationToken) + { + ReceiveInput(workflowContext, input); + return Task.CompletedTask; + } + + public virtual Task WorkflowResumedAsync(WorkflowExecutionContext workflowContext, CancellationToken cancellationToken) + { + WorkflowResumed(workflowContext); + return Task.CompletedTask; + } + + public virtual Task WorkflowResumingAsync(WorkflowExecutionContext workflowContext, CancellationToken cancellationToken) + { + WorkflowResuming(workflowContext); + return Task.CompletedTask; + } + + public virtual Task WorkflowStartedAsync(WorkflowExecutionContext workflowContext, CancellationToken cancellationToken) + { + WorkflowStarted(workflowContext); + return Task.CompletedTask; + } + + public virtual Task WorkflowStartingAsync(WorkflowExecutionContext workflowContext, CancellationToken cancellationToken) + { + WorkflowStarting(workflowContext); + return Task.CompletedTask; + } + + protected virtual ActivityExecutionResult Execute(WorkflowExecutionContext workflowContext, ActivityExecutionContext activityContext) + { + return ActivateEndpoint(); + } + + protected virtual ActivityExecutionResult Resume(WorkflowExecutionContext workflowContext, ActivityExecutionContext activityContext) + { + return ActivateEndpoint(); + } + + protected virtual bool CanExecute(WorkflowExecutionContext workflowContext, ActivityExecutionContext activityContext) => true; + protected virtual void OnActivityExecuted(WorkflowExecutionContext workflowContext, ActivityExecutionContext activityContext) {} + protected virtual void OnActivityExecuting(WorkflowExecutionContext workflowContext, ActivityExecutionContext activityContext) {} + protected virtual void ReceiveInput(WorkflowExecutionContext workflowContext, Variables input) {} + protected virtual void WorkflowResumed(WorkflowExecutionContext workflowContext) {} + protected virtual void WorkflowResuming(WorkflowExecutionContext workflowContext) {} + protected virtual void WorkflowStarted(WorkflowExecutionContext workflowContext) {} + protected virtual void WorkflowStarting(WorkflowExecutionContext workflowContext) {} + + protected HaltResult Halt() + { + return new HaltResult(); + } + + protected ActivateEndpointResult ActivateEndpoint(string name = null) + { + return new ActivateEndpointResult(new SourceEndpoint(this, name)); + } + + protected ScheduleActivityResult ScheduleActivity(IActivity activity) + { + return new ScheduleActivityResult(activity); + } + + protected ReturnValueResult SetReturnValue(object value) + { + return new ReturnValueResult(value); + } + + protected FinishWorkflowResult Finish() + { + return new FinishWorkflowResult(); + } + + protected NoopResult Noop() + { + return new NoopResult(); + } + } +} \ No newline at end of file diff --git a/src/Flowsharp.Core/Handlers/IActivityHandler.cs b/src/Flowsharp.Core/Handlers/IActivityHandler.cs new file mode 100644 index 000000000..9be3cad3e --- /dev/null +++ b/src/Flowsharp.Core/Handlers/IActivityHandler.cs @@ -0,0 +1,65 @@ +using System.Threading; +using System.Threading.Tasks; +using Flowsharp.Activities; +using Flowsharp.ActivityResults; +using Flowsharp.Models; + +namespace Flowsharp.Handlers +{ + public interface IActivityHandler + { + } + + public interface IActivityHandler : IActivityHandler where T:IActivity + { + /// + /// Returns a value of whether the specified activity can execute. + /// + Task CanExecuteAsync(WorkflowExecutionContext workflowContext, T activity, CancellationToken cancellationToken); + + /// + /// Executes the specified activity. + /// + Task ExecuteAsync(WorkflowExecutionContext workflowContext, T activity, CancellationToken cancellationToken); + + /// + /// Resumes the specified activity. + /// + Task ResumeAsync(WorkflowExecutionContext workflowContext, T activity, CancellationToken cancellationToken); + + /// + /// Executes before a workflow starts or resumes, giving activities an opportunity to read and store any values of interest. + /// + Task ReceiveInputAsync(WorkflowExecutionContext workflowContext, Variables input, CancellationToken cancellationToken); + + /// + /// Executes when a workflow is about to start. + /// + Task WorkflowStartingAsync(WorkflowExecutionContext workflowContext, CancellationToken cancellationToken); + + /// + /// Executes when a workflow has started. + /// + Task WorkflowStartedAsync(WorkflowExecutionContext context, CancellationToken cancellationToken); + + /// + /// Executes when a workflow is about to be resumed. + /// + Task WorkflowResumingAsync(WorkflowExecutionContext context, CancellationToken cancellationToken); + + /// + /// Executes when a workflow is resumed. + /// + Task WorkflowResumedAsync(WorkflowExecutionContext context, CancellationToken cancellationToken); + + /// + /// Executes when an activity is about to be executed. + /// + Task OnActivityExecutingAsync(WorkflowExecutionContext workflowContext, T activity, CancellationToken cancellationToken = default(CancellationToken)); + + /// + /// Called on each activity when an activity has been executed. + /// + Task OnActivityExecutedAsync(WorkflowExecutionContext workflowContext, T activity, CancellationToken cancellationToken); + } +} \ No newline at end of file diff --git a/src/Flowsharp.Core/Handlers/IfElseHandler.cs b/src/Flowsharp.Core/Handlers/IfElseHandler.cs new file mode 100644 index 000000000..bda46e498 --- /dev/null +++ b/src/Flowsharp.Core/Handlers/IfElseHandler.cs @@ -0,0 +1,7 @@ +namespace Flowsharp.Handlers +{ + public class IfElseHandler + { + + } +} \ No newline at end of file diff --git a/src/Flowsharp.Core/Activities/Workflow.cs b/src/Flowsharp.Core/Models/Workflow.cs similarity index 100% rename from src/Flowsharp.Core/Activities/Workflow.cs rename to src/Flowsharp.Core/Models/Workflow.cs diff --git a/src/Flowsharp.Core/ActivityResults/ActivateEndpointResult.cs b/src/Flowsharp.Core/Results/ActivateEndpointResult.cs similarity index 100% rename from src/Flowsharp.Core/ActivityResults/ActivateEndpointResult.cs rename to src/Flowsharp.Core/Results/ActivateEndpointResult.cs diff --git a/src/Flowsharp.Core/ActivityResults/ActivityExecutionResult.cs b/src/Flowsharp.Core/Results/ActivityExecutionResult.cs similarity index 100% rename from src/Flowsharp.Core/ActivityResults/ActivityExecutionResult.cs rename to src/Flowsharp.Core/Results/ActivityExecutionResult.cs diff --git a/src/Flowsharp.Core/ActivityResults/FinishWorkflowResult.cs b/src/Flowsharp.Core/Results/FinishWorkflowResult.cs similarity index 100% rename from src/Flowsharp.Core/ActivityResults/FinishWorkflowResult.cs rename to src/Flowsharp.Core/Results/FinishWorkflowResult.cs diff --git a/src/Flowsharp.Core/ActivityResults/HaltResult.cs b/src/Flowsharp.Core/Results/HaltResult.cs similarity index 100% rename from src/Flowsharp.Core/ActivityResults/HaltResult.cs rename to src/Flowsharp.Core/Results/HaltResult.cs diff --git a/src/Flowsharp.Core/ActivityResults/IActivityExecutionResult.cs b/src/Flowsharp.Core/Results/IActivityExecutionResult.cs similarity index 100% rename from src/Flowsharp.Core/ActivityResults/IActivityExecutionResult.cs rename to src/Flowsharp.Core/Results/IActivityExecutionResult.cs diff --git a/src/Flowsharp.Core/ActivityResults/NoopResult.cs b/src/Flowsharp.Core/Results/NoopResult.cs similarity index 100% rename from src/Flowsharp.Core/ActivityResults/NoopResult.cs rename to src/Flowsharp.Core/Results/NoopResult.cs diff --git a/src/Flowsharp.Core/ActivityResults/ReturnValueResult.cs b/src/Flowsharp.Core/Results/ReturnValueResult.cs similarity index 100% rename from src/Flowsharp.Core/ActivityResults/ReturnValueResult.cs rename to src/Flowsharp.Core/Results/ReturnValueResult.cs diff --git a/src/Flowsharp.Core/ActivityResults/ScheduleActivityResult.cs b/src/Flowsharp.Core/Results/ScheduleActivityResult.cs similarity index 100% rename from src/Flowsharp.Core/ActivityResults/ScheduleActivityResult.cs rename to src/Flowsharp.Core/Results/ScheduleActivityResult.cs