diff --git a/.gitignore b/.gitignore index 9491a2f..2afa2e2 100644 --- a/.gitignore +++ b/.gitignore @@ -29,7 +29,6 @@ x86/ bld/ [Bb]in/ [Oo]bj/ -[Oo]ut/ [Ll]og/ [Ll]ogs/ @@ -58,11 +57,14 @@ dlldata.c # Benchmark Results BenchmarkDotNet.Artifacts/ -# .NET Core +# .NET project.lock.json project.fragment.lock.json artifacts/ +# Tye +.tye/ + # ASP.NET Scaffolding ScaffoldingReadMe.txt @@ -360,4 +362,93 @@ MigrationBackup/ .ionide/ # Fody - auto-generated XML schema -FodyWeavers.xsd \ No newline at end of file +FodyWeavers.xsd + +## +## Visual studio for Mac +## + + +# globs +Makefile.in +*.userprefs +*.usertasks +config.make +config.status +aclocal.m4 +install-sh +autom4te.cache/ +*.tar.gz +tarballs/ +test-results/ + +# Mac bundle stuff +*.dmg +*.app + +# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# JetBrains Rider +.idea/ +*.sln.iml + +## +## Visual Studio Code +## +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json diff --git a/MergeWorkflow/CommandGenerator.cs b/MergeWorkflow/CommandGenerator.cs index 86cca78..6566f30 100644 --- a/MergeWorkflow/CommandGenerator.cs +++ b/MergeWorkflow/CommandGenerator.cs @@ -12,18 +12,58 @@ namespace MergeWorkflow public class CommandGenerator : IWorkflowGenerator { private static void CreateAndAddTransitions(ProcessDefinition pd, ActivityDefinition firstActivity, - ActivityDefinition finalActivity, bool isSubprocess, bool isMerge = false, bool isSubProcessFinal = false) + ActivityDefinition finalActivity, bool isSubprocess = false, bool isMerge = false, bool isSubProcessFinal = false, + List conditions = null) { string TransistionName = firstActivity.Name + "To" + finalActivity.Name; - TransitionDefinition Transition = TransitionDefinition.Create(TransistionName, - TransitionClassifier.NotSpecified, - ConcatenationType.And, - ConcatenationType.And, - ConcatenationType.And, - firstActivity, - finalActivity, - TriggerDefinition.Auto, - null); + + TransitionDefinition Transition = TransitionDefinition.Create( + TransistionName, + TransitionClassifier.NotSpecified, + ConcatenationType.And, + ConcatenationType.And, + ConcatenationType.And, + firstActivity, + finalActivity, + TriggerDefinition.Auto, + null); + + if (conditions != null) + { + Transition.Conditions = conditions; + } + + if (isSubprocess) + { + Transition = Transition.SetSubprocessSettings( + TransistionName, + Guid.NewGuid().ToString(), + false, + false, + SubprocessInOutDefinition.Start, + SubprocessStartupType.AnotherThread, + SubprocessStartupParameterCopyStrategy.CopyAll, + SubprocessFinalizeParameterMergeStrategy.OverwriteSpecified, + null); + + Transition.IsFork = true; + } + + if (isSubProcessFinal) + { + Transition = Transition.SetSubprocessSettings(TransistionName, + Guid.NewGuid().ToString(), + false, + false, + SubprocessInOutDefinition.Finalize, + SubprocessStartupType.AnotherThread, + SubprocessStartupParameterCopyStrategy.CopyAll, + SubprocessFinalizeParameterMergeStrategy.OverwriteAllNulls, + null); + + Transition.IsFork = true; + } + pd.Transitions.Add(Transition); } @@ -32,10 +72,7 @@ private static void CreateCommandTransitions(ProcessDefinition pd, ActivityDefin { string TransistionName = firstActivity.Name + "To" + finalActivity.Name; var conditionList = new List(); - //ConditionDefinition Condition = ConditionDefinition.CreateActionCondition(ActionDefinitionReference.Create("CheckAllSubprocessesCompleted", "0", - // ""), false, null); - //Condition.Type = ConditionType.Action; - //conditionList.Add(Condition); + TransitionDefinition Transition = TransitionDefinition.Create(TransistionName, TransitionClassifier.NotSpecified, ConcatenationType.And, @@ -77,12 +114,9 @@ private static void CreateAndAddActivities(ProcessDefinition pd, String stageNam public XElement Generate(string schemeCode, Guid schemeId, IDictionary parameters) { var pd = ProcessDefinition.Create(schemeCode + "SimpleProcess", false, new List(), - new List(), new List() { CommandDefinition.Create("CheckAllSubprocessesCompleted") }, new List(), + new List(), new List(), new List(), new List(), new List(), new List(), - new List() - { - - }, DesignerSettings.Empty, new List()); + new List(), DesignerSettings.Empty, new List()); object stageInfoList; parameters.TryGetValue("StagesInfo", out stageInfoList); @@ -97,11 +131,24 @@ public XElement Generate(string schemeCode, Guid schemeId, IDictionary ActivitiesList = pd.Activities; - - CreateAndAddTransitions(pd, pd.Activities.First(x => x.Name == "Start"), pd.Activities.First(x => x.Name == "ResourceCheck"), false); - CreateCommandTransitions(pd, pd.Activities.First(x => x.Name == "ResourceCheck"), pd.Activities.First(x => x.Name == "BuildMDU"), true); - CreateAndAddTransitions(pd, pd.Activities.First(x => x.Name == "BuildMDU"), pd.Activities.First(x => x.Name == "BuildSeriesStructure"), false); - CreateAndAddTransitions(pd, pd.Activities.First(x => x.Name == "BuildSeriesStructure"), pd.Activities.First(x => x.Name == "MergeBuild"), false); + + var conditions = new List + { + ConditionDefinition.CreateActionCondition( + ActionDefinitionReference.Create( + "CheckAllSubprocessesCompleted", + "0", + "{\"Mode\":\"AllSubprocessesAndParent\"}"), + false, + null) + }; + + CreateAndAddTransitions(pd, pd.Activities.First(x => x.Name == "Start"), pd.Activities.First(x => x.Name == "ResourceCheck")); + CreateAndAddTransitions(pd, pd.Activities.First(x => x.Name == "ResourceCheck"), pd.Activities.First(x => x.Name == "BuildMDU"), true); + CreateAndAddTransitions(pd, pd.Activities.First(x => x.Name == "ResourceCheck"), pd.Activities.First(x => x.Name == "BuildSeriesStructure")); + CreateAndAddTransitions(pd, pd.Activities.First(x => x.Name == "BuildMDU"), pd.Activities.First(x => x.Name == "MergeBuild"), isSubProcessFinal: true); + CreateAndAddTransitions(pd, pd.Activities.First(x => x.Name == "BuildSeriesStructure"), pd.Activities.First(x => x.Name == "MergeBuild")); + CreateAndAddTransitions(pd, pd.Activities.First(x => x.Name == "MergeBuild"), pd.Activities.First(x => x.Name == "GetReadyStatus"), conditions: conditions); (bool success, List errors, string failedstep) = WorkflowInit.Runtime.Builder diff --git a/MergeWorkflow/ProcessingStagesActionProvider.cs b/MergeWorkflow/ProcessingStagesActionProvider.cs index c6067e2..1983b3e 100644 --- a/MergeWorkflow/ProcessingStagesActionProvider.cs +++ b/MergeWorkflow/ProcessingStagesActionProvider.cs @@ -1,26 +1,27 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Threading.Tasks; using System.Threading; -using OptimaJet.Workflow.Core.BPMN; using OptimaJet.Workflow.Core.Model; using OptimaJet.Workflow.Core.Runtime; using Task = System.Threading.Tasks.Task; -using System.Diagnostics; namespace MergeWorkflow { public class ProcessingStagesActionProvider : IWorkflowActionProvider { - private readonly Dictionary> _actions = new Dictionary>(); + private readonly Dictionary> _actions = + new Dictionary>(); - private readonly Dictionary> _asyncActions = new Dictionary>(); + private readonly Dictionary> _asyncActions = + new Dictionary>(); - private readonly Dictionary> _conditions = new Dictionary>(); + private readonly Dictionary> _conditions = + new Dictionary>(); - private readonly Dictionary>> _asyncConditions = new Dictionary>>(); + private readonly Dictionary>> + _asyncConditions = new Dictionary>>(); public ProcessingStagesActionProvider() { @@ -40,65 +41,76 @@ public ProcessingStagesActionProvider() //_actions.Add("MergeBuild", MergeBuild); //_actions.Add("MergeReady", MergeReady); //_actions.Add("PingConsole", PingConsole); - - _asyncActions.Add("ResourceCheck", PingConsole1); - _asyncActions.Add("BuildMDU", PingConsole1); - _asyncActions.Add("BuildSeriesStructure", PingConsole1); - _asyncActions.Add("BuildMDUAndSSStatus", PingConsole1); - _asyncActions.Add("GetReady", PingConsole1); - _asyncActions.Add("PulmoGetReady", PingConsole1); - _asyncActions.Add("GantryReady", PingConsole1); - _asyncActions.Add("CIRSGetReady", PingConsole1); - _asyncActions.Add("ResultEngineGetReady", PingConsole1); - _asyncActions.Add("InjectorGetReady", PingConsole1); - _asyncActions.Add("CardiacGetReady", PingConsole1); - _asyncActions.Add("GetReadyStatus", PingConsole1); - _asyncActions.Add("Start", PingConsole1); - _asyncActions.Add("MergeBuild", PingConsole1); - _asyncActions.Add("MergeReady", PingConsole1); - _asyncActions.Add("PingConsole", PingConsole1); - _conditions.Add("StopCondition", StopCondition); + + _asyncActions.Add("ResourceCheck", PingConsoleAsync); + _asyncActions.Add("BuildMDU", PingConsoleAsync); + _asyncActions.Add("BuildSeriesStructure", PingConsoleAsync); + _asyncActions.Add("BuildMDUAndSSStatus", PingConsoleAsync); + _asyncActions.Add("GetReady", PingConsoleAsync); + _asyncActions.Add("PulmoGetReady", PingConsoleAsync); + _asyncActions.Add("GantryReady", PingConsoleAsync); + _asyncActions.Add("CIRSGetReady", PingConsoleAsync); + _asyncActions.Add("ResultEngineGetReady", PingConsoleAsync); + _asyncActions.Add("InjectorGetReady", PingConsoleAsync); + _asyncActions.Add("CardiacGetReady", PingConsoleAsync); + _asyncActions.Add("GetReadyStatus", PingConsoleAsync); + _asyncActions.Add("Start", PingConsoleAsync); + _asyncActions.Add("MergeBuild", PingConsoleAsync); + _asyncActions.Add("MergeReady", PingConsoleAsync); + _asyncActions.Add("PingConsole", PingConsoleAsync); + _conditions.Add("StopCondition", StopCondition); _actions.Add("ResourceCheck", PingConsole); _actions.Add("BuildMDU", PingConsole); _actions.Add("BuildSeriesStructure", PingConsole); _actions.Add("BuildMDUAndSSStatus", PingConsole); _actions.Add("GetReady", PingConsole); - _actions.Add("PulmoGetReady", PingConsole); - _actions.Add("GantryReady", PingConsole); - _actions.Add("CIRSGetReady", PingConsole); - _actions.Add("ResultEngineGetReady", PingConsole); - _actions.Add("InjectorGetReady", PingConsole); - _actions.Add("CardiacGetReady", PingConsole); - _actions.Add("GetReadyStatus", PingConsole); - _actions.Add("Start", PingConsole); - _actions.Add("MergeBuild", PingConsole); - _actions.Add("MergeReady", PingConsole); + _actions.Add("PulmoGetReady", PingConsole); + _actions.Add("GantryReady", PingConsole); + _actions.Add("CIRSGetReady", PingConsole); + _actions.Add("ResultEngineGetReady", PingConsole); + _actions.Add("InjectorGetReady", PingConsole); + _actions.Add("CardiacGetReady", PingConsole); + _actions.Add("GetReadyStatus", PingConsole); + _actions.Add("Start", PingConsole); + _actions.Add("MergeBuild", PingConsole); + _actions.Add("MergeReady", PingConsole); _actions.Add("PingConsole", PingConsole); } - - private Task PingConsole1(ProcessInstance arg1, WorkflowRuntime arg2, string arg3, CancellationToken arg4) + + public static IWorkflowActionProvider GetActionProvider() { - return Task.Run(() => { - var commands = arg2.GetAvailableCommands(arg1.ProcessId, ""); - var activity = arg1.GetParameter("CurrentActivity"); - Console.WriteLine("CurrentActivity: " + arg1.CurrentActivity.Name); - }); + return new ProcessingStagesActionProvider(); + } - + private Task PingConsoleAsync(ProcessInstance arg1, WorkflowRuntime arg2, string arg3, CancellationToken arg4) + { + //For debug process + Console.WriteLine("Execution number: " + _counter); + Console.WriteLine("Current activity: " + arg1.CurrentActivity.Name); + Console.WriteLine("Current state: " + arg1.CurrentState); + Console.WriteLine("Executed activity: " + arg1.ExecutedActivity.Name); + Console.WriteLine("----------------------------------------"); + + _counter++; + + return Task.CompletedTask; + } private void PingConsole(ProcessInstance arg1, WorkflowRuntime arg2, string arg3) { - var activity = arg1.GetParameter("CurrentActivity"); Console.WriteLine("CurrentActivity: " + activity); + PingConsoleAsync(arg1, arg2, arg3, new CancellationToken()); } - public static IWorkflowActionProvider GetActionProvider() + private bool StopCondition(ProcessInstance processInstance, WorkflowRuntime runtime, string actionParameter) { - return new ProcessingStagesActionProvider(); - + return false; } - + + //Never used + #region Custom Actions + private void MergeReady(ProcessInstance arg1, WorkflowRuntime arg2, string arg3) { } @@ -114,26 +126,45 @@ private void ImageReceiver(ProcessInstance processInstance, WorkflowRuntime runt private void Strat(ProcessInstance arg1, WorkflowRuntime runtime, string arg3) { + + } + + public bool IsActionAsync(string name) + { + return _asyncActions.ContainsKey(name); } - private bool StopCondition(ProcessInstance processInstance, WorkflowRuntime runtime, string actionParameter) + public bool IsConditionAsync(string name) { - return false; + return _asyncConditions.ContainsKey(name); } + public List GetActions() + { + return _actions.Keys.Union(_asyncActions.Keys).ToList(); + } + + public List GetConditions() + { + return _conditions.Keys.Union(_asyncConditions.Keys).ToList(); + } + + #endregion + #region IWorkflowAction provider + public void ExecuteAction(string name, ProcessInstance processInstance, WorkflowRuntime runtime, - string actionParameter) - { + string actionParameter) + { if (_actions.ContainsKey(name)) _actions[name].Invoke(processInstance, runtime, actionParameter); else throw new NotImplementedException($"Action with name {name} isn't implemented"); } - public async Task ExecuteActionAsync(string name, ProcessInstance processInstance, WorkflowRuntime runtime, string actionParameter, CancellationToken token) + public async Task ExecuteActionAsync(string name, ProcessInstance processInstance, WorkflowRuntime runtime, string actionParameter, + CancellationToken token) { - if (_asyncActions.ContainsKey(name)) await _asyncActions[name].Invoke(processInstance, runtime, actionParameter, token); else @@ -149,35 +180,15 @@ public bool ExecuteCondition(string name, ProcessInstance processInstance, Workf throw new NotImplementedException($"Condition with name {name} isn't implemented"); } - public async Task ExecuteConditionAsync(string name, ProcessInstance processInstance, WorkflowRuntime runtime, string actionParameter, CancellationToken token) + public async Task ExecuteConditionAsync(string name, ProcessInstance processInstance, WorkflowRuntime runtime, + string actionParameter, CancellationToken token) { - if (_asyncConditions.ContainsKey(name)) return await _asyncConditions[name].Invoke(processInstance, runtime, actionParameter, token); throw new NotImplementedException($"Async Condition with name {name} isn't implemented"); } - public bool IsActionAsync(string name) - { - return _asyncActions.ContainsKey(name); - } - - public bool IsConditionAsync(string name) - { - return _asyncConditions.ContainsKey(name); - } - - public List GetActions() - { - return _actions.Keys.Union(_asyncActions.Keys).ToList(); - } - - public List GetConditions() - { - return _conditions.Keys.Union(_asyncConditions.Keys).ToList(); - } - public bool IsActionAsync(string name, string schemeCode) { return _asyncActions.ContainsKey(name); @@ -198,75 +209,8 @@ public List GetConditions(string schemeCode, NamesSearchType namesSearch return _conditions.Keys.Union(_asyncConditions.Keys).ToList(); } - public bool BuildSeriesStructureCondition(ProcessInstance processInstance, - WorkflowRuntime workflowRuntime, string parameter) - { - return true; - } - - public bool BuildMDUCondition(ProcessInstance processInstance, WorkflowRuntime workflowRuntime, string parameter) - { - return false; - } - - - public void BuildMDUAndSSStatus(ProcessInstance processInstance, WorkflowRuntime workflowRuntime, string parameter) - { - - } - - public void GetReady(ProcessInstance processInstance, WorkflowRuntime workflowRuntime, string parameter) - { - - - } - public void PulmoGetReady(ProcessInstance processInstance, WorkflowRuntime workflowRuntime, string parameter) - { - - } - - public void GantryReady(ProcessInstance processInstance, WorkflowRuntime workflowRuntime, string parameter) - { - - } - public void CIRSGetReady(ProcessInstance processInstance, WorkflowRuntime workflowRuntime, string parameter) - { - - } - - public void ResultEngineGetReady(ProcessInstance processInstance, WorkflowRuntime workflowRuntime, string parameter) - { - - } - - public void InjectorGetReady(ProcessInstance processInstance, WorkflowRuntime workflowRuntime, string parameter) - { - - } - public void CardiacGetReady(ProcessInstance processInstance, WorkflowRuntime workflowRuntime, string parameter) - { - - } - public void GetReadyStatus(ProcessInstance processInstance, WorkflowRuntime workflowRuntime, string parameter) - { - - } - public void BuildMDU(ProcessInstance processInstance, WorkflowRuntime workflowRuntime, string parameter) - { - - } - - public void BuildSeriesStructure(ProcessInstance processInstance, WorkflowRuntime workflowRuntime, string parameter) - { - - } - - public void ResourceCheck(ProcessInstance processInstance, WorkflowRuntime workflowRuntime, string parameter) - { - var commands = workflowRuntime.GetAvailableCommands(processInstance.ProcessId, String.Empty); - Debugger.Launch(); - } #endregion - } -} + private int _counter; + } +} \ No newline at end of file diff --git a/MergeWorkflow/Program.cs b/MergeWorkflow/Program.cs index 3d92246..85d8d4c 100644 --- a/MergeWorkflow/Program.cs +++ b/MergeWorkflow/Program.cs @@ -154,6 +154,12 @@ private static List GetPipeline() { Id = "BuildSeriesStructure", Stage = "BuildSeriesStructure", + }, + //To show you how CheckAllSubprocessesCompleted works + new StageInfo + { + Id = "GetReadyStatus", + Stage = "GetReadyStatus", } } diff --git a/MergeWorkflow/WorkflowInit.cs b/MergeWorkflow/WorkflowInit.cs index 299c25e..e848371 100644 --- a/MergeWorkflow/WorkflowInit.cs +++ b/MergeWorkflow/WorkflowInit.cs @@ -6,6 +6,7 @@ using OptimaJet.Workflow.Core.Model; using OptimaJet.Workflow.Core.Runtime; using OptimaJet.Workflow.DbPersistence; +using OptimaJet.Workflow.Plugins; namespace MergeWorkflow @@ -50,6 +51,8 @@ private static WorkflowRuntime InitWorkflowRuntime() var runtime = new WorkflowRuntime() .WithBuilder(builder) + //This plugin contains the CheckAllSubprocessesCompleted condition implementation + .WithPlugin(new BasicPlugin()) .WithPersistenceProvider(dbProvider) .EnableCodeActions() .SwitchAutoUpdateSchemeBeforeGetAvailableCommandsOn()