From 735e953dc508ab740e8ee435fe7db82d7de78116 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Thu, 13 Aug 2026 01:17:46 +0200 Subject: [PATCH] feat(bpmn): scaffold Elsa.Bpmn and Elsa.Bpmn.Interchange modules (#7938) Adds the valence-works/bpmn package feed and pins Bpmn.Model, Bpmn.Semantics and Bpmn.Interchange at 0.1.1-preview.19, then wires two new module projects consuming those libraries without reimplementing anything they provide (D12): Elsa.Bpmn for BPMN execution and Elsa.Bpmn.Interchange for XML import/export, kept as a separate package so hosts that only execute BPMN don't take the XML reader. Both are marked IsPackable=false until the Bpmn.* packages are published to nuget.org. Test projects are added for both, unit and integration, and all four are wired into Elsa.sln so PR CI discovers and runs them. This unblocks #7925 and the rest of the BPMN runtime work in #7909. Co-authored-by: Claude Opus 5 --- Directory.Packages.props | 3 + Elsa.sln | 93 +++++++++++++++++++ NuGet.Config | 4 + .../Elsa.Bpmn.Interchange.csproj | 20 ++++ .../Extensions/ModuleExtensions.cs | 23 +++++ .../Features/BpmnInterchangeFeature.cs | 18 ++++ .../Elsa.Bpmn.Interchange/FodyWeavers.xml | 3 + .../ShellFeatures/BpmnInterchangeFeature.cs | 22 +++++ src/modules/Elsa.Bpmn/Elsa.Bpmn.csproj | 22 +++++ .../Elsa.Bpmn/Extensions/ModuleExtensions.cs | 23 +++++ src/modules/Elsa.Bpmn/Features/BpmnFeature.cs | 15 +++ src/modules/Elsa.Bpmn/FodyWeavers.xml | 3 + .../Elsa.Bpmn/ShellFeatures/BpmnFeature.cs | 20 ++++ .../BpmnFeatureTests.cs | 29 ++++++ .../Elsa.Bpmn.IntegrationTests.csproj | 13 +++ .../BpmnInterchangeFeatureTests.cs | 30 ++++++ ...a.Bpmn.Interchange.IntegrationTests.csproj | 13 +++ .../BpmnInterchangeFeatureTests.cs | 20 ++++ .../BpmnInterchangeWiringTests.cs | 14 +++ .../Elsa.Bpmn.Interchange.UnitTests.csproj | 13 +++ .../Elsa.Bpmn.UnitTests/BpmnFeatureTests.cs | 20 ++++ .../BpmnSemanticsWiringTests.cs | 14 +++ .../Elsa.Bpmn.UnitTests.csproj | 13 +++ 23 files changed, 448 insertions(+) create mode 100644 src/modules/Elsa.Bpmn.Interchange/Elsa.Bpmn.Interchange.csproj create mode 100644 src/modules/Elsa.Bpmn.Interchange/Extensions/ModuleExtensions.cs create mode 100644 src/modules/Elsa.Bpmn.Interchange/Features/BpmnInterchangeFeature.cs create mode 100644 src/modules/Elsa.Bpmn.Interchange/FodyWeavers.xml create mode 100644 src/modules/Elsa.Bpmn.Interchange/ShellFeatures/BpmnInterchangeFeature.cs create mode 100644 src/modules/Elsa.Bpmn/Elsa.Bpmn.csproj create mode 100644 src/modules/Elsa.Bpmn/Extensions/ModuleExtensions.cs create mode 100644 src/modules/Elsa.Bpmn/Features/BpmnFeature.cs create mode 100644 src/modules/Elsa.Bpmn/FodyWeavers.xml create mode 100644 src/modules/Elsa.Bpmn/ShellFeatures/BpmnFeature.cs create mode 100644 test/integration/Elsa.Bpmn.IntegrationTests/BpmnFeatureTests.cs create mode 100644 test/integration/Elsa.Bpmn.IntegrationTests/Elsa.Bpmn.IntegrationTests.csproj create mode 100644 test/integration/Elsa.Bpmn.Interchange.IntegrationTests/BpmnInterchangeFeatureTests.cs create mode 100644 test/integration/Elsa.Bpmn.Interchange.IntegrationTests/Elsa.Bpmn.Interchange.IntegrationTests.csproj create mode 100644 test/unit/Elsa.Bpmn.Interchange.UnitTests/BpmnInterchangeFeatureTests.cs create mode 100644 test/unit/Elsa.Bpmn.Interchange.UnitTests/BpmnInterchangeWiringTests.cs create mode 100644 test/unit/Elsa.Bpmn.Interchange.UnitTests/Elsa.Bpmn.Interchange.UnitTests.csproj create mode 100644 test/unit/Elsa.Bpmn.UnitTests/BpmnFeatureTests.cs create mode 100644 test/unit/Elsa.Bpmn.UnitTests/BpmnSemanticsWiringTests.cs create mode 100644 test/unit/Elsa.Bpmn.UnitTests/Elsa.Bpmn.UnitTests.csproj diff --git a/Directory.Packages.props b/Directory.Packages.props index 23c80aa42..a3db88643 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -98,6 +98,9 @@ + + + diff --git a/Elsa.sln b/Elsa.sln index 60e0b80f5..e16d5814d 100644 --- a/Elsa.sln +++ b/Elsa.sln @@ -225,6 +225,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scheduling", "scheduling", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Scheduling", "src\modules\Elsa.Scheduling\Elsa.Scheduling.csproj", "{26849C37-2ACA-4DDE-83CD-B87939465791}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "bpmn", "bpmn", "{F3F9E35C-1A59-423F-BA04-B4BD8366E6DF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Bpmn", "src\modules\Elsa.Bpmn\Elsa.Bpmn.csproj", "{6326EFE4-A6B1-4306-8551-41103EC38755}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Bpmn.Interchange", "src\modules\Elsa.Bpmn.Interchange\Elsa.Bpmn.Interchange.csproj", "{E2408639-12D3-4A17-AD40-F8A097E27009}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Workflows.Runtime.Distributed", "src\modules\Elsa.Workflows.Runtime.Distributed\Elsa.Workflows.Runtime.Distributed.csproj", "{42CE3E10-BC73-4D29-B099-88F0D5319E57}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "persistence", "persistence", "{3D0A6C71-4B96-411B-80DB-DDFAFF77C748}" @@ -263,8 +269,16 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Expressions.UnitTests" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Scheduling.UnitTests", "test\unit\Elsa.Scheduling.UnitTests\Elsa.Scheduling.UnitTests.csproj", "{9AEE941A-3F23-4E4B-9B59-1A2F57FC762D}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Bpmn.UnitTests", "test\unit\Elsa.Bpmn.UnitTests\Elsa.Bpmn.UnitTests.csproj", "{C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Bpmn.Interchange.UnitTests", "test\unit\Elsa.Bpmn.Interchange.UnitTests\Elsa.Bpmn.Interchange.UnitTests.csproj", "{ECB546D5-8B38-47AF-87C1-70A0F03284D1}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Common.IntegrationTests", "test\integration\Elsa.Common.IntegrationTests\Elsa.Common.IntegrationTests.csproj", "{6C451CC5-280E-475E-B95E-23ADCF0CCBFD}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Bpmn.IntegrationTests", "test\integration\Elsa.Bpmn.IntegrationTests\Elsa.Bpmn.IntegrationTests.csproj", "{90D1A3F2-6A09-4E13-942C-6183D38C8E54}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Bpmn.Interchange.IntegrationTests", "test\integration\Elsa.Bpmn.Interchange.IntegrationTests\Elsa.Bpmn.Interchange.IntegrationTests.csproj", "{EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Dsl.ElsaScript", "src\modules\Elsa.Dsl.ElsaScript\Elsa.Dsl.ElsaScript.csproj", "{874F5A44-DB06-47AB-A18C-2D13942E0147}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Dsl.ElsaScript.IntegrationTests", "test\integration\Elsa.Dsl.ElsaScript.IntegrationTests\Elsa.Dsl.ElsaScript.IntegrationTests.csproj", "{4B5A9D32-58F2-47A9-8A1B-8A9E2D76C3F5}" @@ -1851,6 +1865,78 @@ Global {C6EFA89A-923E-4F7A-A63B-BC8DDF44A208}.Release|x64.Build.0 = Release|Any CPU {C6EFA89A-923E-4F7A-A63B-BC8DDF44A208}.Release|x86.ActiveCfg = Release|Any CPU {C6EFA89A-923E-4F7A-A63B-BC8DDF44A208}.Release|x86.Build.0 = Release|Any CPU + {6326EFE4-A6B1-4306-8551-41103EC38755}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6326EFE4-A6B1-4306-8551-41103EC38755}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6326EFE4-A6B1-4306-8551-41103EC38755}.Debug|x64.ActiveCfg = Debug|Any CPU + {6326EFE4-A6B1-4306-8551-41103EC38755}.Debug|x64.Build.0 = Debug|Any CPU + {6326EFE4-A6B1-4306-8551-41103EC38755}.Debug|x86.ActiveCfg = Debug|Any CPU + {6326EFE4-A6B1-4306-8551-41103EC38755}.Debug|x86.Build.0 = Debug|Any CPU + {6326EFE4-A6B1-4306-8551-41103EC38755}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6326EFE4-A6B1-4306-8551-41103EC38755}.Release|Any CPU.Build.0 = Release|Any CPU + {6326EFE4-A6B1-4306-8551-41103EC38755}.Release|x64.ActiveCfg = Release|Any CPU + {6326EFE4-A6B1-4306-8551-41103EC38755}.Release|x64.Build.0 = Release|Any CPU + {6326EFE4-A6B1-4306-8551-41103EC38755}.Release|x86.ActiveCfg = Release|Any CPU + {6326EFE4-A6B1-4306-8551-41103EC38755}.Release|x86.Build.0 = Release|Any CPU + {E2408639-12D3-4A17-AD40-F8A097E27009}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E2408639-12D3-4A17-AD40-F8A097E27009}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E2408639-12D3-4A17-AD40-F8A097E27009}.Debug|x64.ActiveCfg = Debug|Any CPU + {E2408639-12D3-4A17-AD40-F8A097E27009}.Debug|x64.Build.0 = Debug|Any CPU + {E2408639-12D3-4A17-AD40-F8A097E27009}.Debug|x86.ActiveCfg = Debug|Any CPU + {E2408639-12D3-4A17-AD40-F8A097E27009}.Debug|x86.Build.0 = Debug|Any CPU + {E2408639-12D3-4A17-AD40-F8A097E27009}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E2408639-12D3-4A17-AD40-F8A097E27009}.Release|Any CPU.Build.0 = Release|Any CPU + {E2408639-12D3-4A17-AD40-F8A097E27009}.Release|x64.ActiveCfg = Release|Any CPU + {E2408639-12D3-4A17-AD40-F8A097E27009}.Release|x64.Build.0 = Release|Any CPU + {E2408639-12D3-4A17-AD40-F8A097E27009}.Release|x86.ActiveCfg = Release|Any CPU + {E2408639-12D3-4A17-AD40-F8A097E27009}.Release|x86.Build.0 = Release|Any CPU + {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Debug|x64.ActiveCfg = Debug|Any CPU + {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Debug|x64.Build.0 = Debug|Any CPU + {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Debug|x86.ActiveCfg = Debug|Any CPU + {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Debug|x86.Build.0 = Debug|Any CPU + {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Release|Any CPU.Build.0 = Release|Any CPU + {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Release|x64.ActiveCfg = Release|Any CPU + {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Release|x64.Build.0 = Release|Any CPU + {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Release|x86.ActiveCfg = Release|Any CPU + {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Release|x86.Build.0 = Release|Any CPU + {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Debug|x64.ActiveCfg = Debug|Any CPU + {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Debug|x64.Build.0 = Debug|Any CPU + {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Debug|x86.ActiveCfg = Debug|Any CPU + {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Debug|x86.Build.0 = Debug|Any CPU + {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Release|Any CPU.Build.0 = Release|Any CPU + {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Release|x64.ActiveCfg = Release|Any CPU + {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Release|x64.Build.0 = Release|Any CPU + {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Release|x86.ActiveCfg = Release|Any CPU + {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Release|x86.Build.0 = Release|Any CPU + {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Debug|Any CPU.Build.0 = Debug|Any CPU + {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Debug|x64.ActiveCfg = Debug|Any CPU + {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Debug|x64.Build.0 = Debug|Any CPU + {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Debug|x86.ActiveCfg = Debug|Any CPU + {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Debug|x86.Build.0 = Debug|Any CPU + {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Release|Any CPU.ActiveCfg = Release|Any CPU + {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Release|Any CPU.Build.0 = Release|Any CPU + {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Release|x64.ActiveCfg = Release|Any CPU + {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Release|x64.Build.0 = Release|Any CPU + {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Release|x86.ActiveCfg = Release|Any CPU + {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Release|x86.Build.0 = Release|Any CPU + {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Debug|x64.ActiveCfg = Debug|Any CPU + {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Debug|x64.Build.0 = Debug|Any CPU + {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Debug|x86.ActiveCfg = Debug|Any CPU + {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Debug|x86.Build.0 = Debug|Any CPU + {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Release|Any CPU.Build.0 = Release|Any CPU + {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Release|x64.ActiveCfg = Release|Any CPU + {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Release|x64.Build.0 = Release|Any CPU + {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Release|x86.ActiveCfg = Release|Any CPU + {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1924,6 +2010,9 @@ Global {0125BC8D-C837-414C-BB53-FCEA62E3060F} = {B08B4E00-C2AB-48F3-8389-449F42AEF179} {7C038270-8BF7-4911-AC24-54D7BBE9BBF2} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} {26849C37-2ACA-4DDE-83CD-B87939465791} = {7C038270-8BF7-4911-AC24-54D7BBE9BBF2} + {F3F9E35C-1A59-423F-BA04-B4BD8366E6DF} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {6326EFE4-A6B1-4306-8551-41103EC38755} = {F3F9E35C-1A59-423F-BA04-B4BD8366E6DF} + {E2408639-12D3-4A17-AD40-F8A097E27009} = {F3F9E35C-1A59-423F-BA04-B4BD8366E6DF} {42CE3E10-BC73-4D29-B099-88F0D5319E57} = {B08B4E00-C2AB-48F3-8389-449F42AEF179} {3D0A6C71-4B96-411B-80DB-DDFAFF77C748} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} {B0EC08F9-8FEB-43DB-A06F-57E3D35FE090} = {3D0A6C71-4B96-411B-80DB-DDFAFF77C748} @@ -1943,7 +2032,11 @@ Global {20C75446-CAE0-48D1-85D9-459541C4D8B6} = {18453B51-25EB-4317-A4B3-B10518252E92} {67E1F0CC-C436-4D71-AD2C-AE42E3AA8A0B} = {18453B51-25EB-4317-A4B3-B10518252E92} {9AEE941A-3F23-4E4B-9B59-1A2F57FC762D} = {18453B51-25EB-4317-A4B3-B10518252E92} + {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE} = {18453B51-25EB-4317-A4B3-B10518252E92} + {ECB546D5-8B38-47AF-87C1-70A0F03284D1} = {18453B51-25EB-4317-A4B3-B10518252E92} {6C451CC5-280E-475E-B95E-23ADCF0CCBFD} = {1B8D5897-902E-4632-8698-E89CAF3DDF54} + {90D1A3F2-6A09-4E13-942C-6183D38C8E54} = {1B8D5897-902E-4632-8698-E89CAF3DDF54} + {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7} = {1B8D5897-902E-4632-8698-E89CAF3DDF54} {874F5A44-DB06-47AB-A18C-2D13942E0147} = {477C2416-312D-46AE-BCD6-8FA1FAB43624} {4B5A9D32-58F2-47A9-8A1B-8A9E2D76C3F5} = {1B8D5897-902E-4632-8698-E89CAF3DDF54} {2B7FB49D-E4B6-4AD5-981B-3D85B94F6F48} = {B08B4E00-C2AB-48F3-8389-449F42AEF179} diff --git a/NuGet.Config b/NuGet.Config index 36cf83e1b..587127e1b 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -7,6 +7,7 @@ + @@ -22,5 +23,8 @@ + + + diff --git a/src/modules/Elsa.Bpmn.Interchange/Elsa.Bpmn.Interchange.csproj b/src/modules/Elsa.Bpmn.Interchange/Elsa.Bpmn.Interchange.csproj new file mode 100644 index 000000000..a2e096221 --- /dev/null +++ b/src/modules/Elsa.Bpmn.Interchange/Elsa.Bpmn.Interchange.csproj @@ -0,0 +1,20 @@ + + + + + Provides BPMN XML interchange support by wiring the Bpmn.Interchange library into Elsa. + + elsa extension module bpmn interchange + + false + + + + + + + + + + + diff --git a/src/modules/Elsa.Bpmn.Interchange/Extensions/ModuleExtensions.cs b/src/modules/Elsa.Bpmn.Interchange/Extensions/ModuleExtensions.cs new file mode 100644 index 000000000..5d2b4fce4 --- /dev/null +++ b/src/modules/Elsa.Bpmn.Interchange/Extensions/ModuleExtensions.cs @@ -0,0 +1,23 @@ +using Elsa.Bpmn.Interchange.Features; +using Elsa.Features.Services; + +// ReSharper disable once CheckNamespace +namespace Elsa.Extensions; + +/// +/// Provides extension methods for instances. +/// +public static class ModuleExtensions +{ + /// + /// Enables the BPMN interchange feature. + /// + /// The module. + /// A delegate to configure the feature. + /// The module. + public static IModule UseBpmnInterchange(this IModule module, Action? configure = null) + { + module.Configure(configure); + return module; + } +} diff --git a/src/modules/Elsa.Bpmn.Interchange/Features/BpmnInterchangeFeature.cs b/src/modules/Elsa.Bpmn.Interchange/Features/BpmnInterchangeFeature.cs new file mode 100644 index 000000000..66a368b5c --- /dev/null +++ b/src/modules/Elsa.Bpmn.Interchange/Features/BpmnInterchangeFeature.cs @@ -0,0 +1,18 @@ +using Elsa.Bpmn.Features; +using Elsa.Features.Abstractions; +using Elsa.Features.Attributes; +using Elsa.Features.Services; + +namespace Elsa.Bpmn.Interchange.Features; + +/// +/// Provides BPMN XML interchange support to the system. +/// +[DependsOn(typeof(BpmnFeature))] +public class BpmnInterchangeFeature : FeatureBase +{ + /// + public BpmnInterchangeFeature(IModule module) : base(module) + { + } +} diff --git a/src/modules/Elsa.Bpmn.Interchange/FodyWeavers.xml b/src/modules/Elsa.Bpmn.Interchange/FodyWeavers.xml new file mode 100644 index 000000000..00e1d9a1c --- /dev/null +++ b/src/modules/Elsa.Bpmn.Interchange/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Bpmn.Interchange/ShellFeatures/BpmnInterchangeFeature.cs b/src/modules/Elsa.Bpmn.Interchange/ShellFeatures/BpmnInterchangeFeature.cs new file mode 100644 index 000000000..074179929 --- /dev/null +++ b/src/modules/Elsa.Bpmn.Interchange/ShellFeatures/BpmnInterchangeFeature.cs @@ -0,0 +1,22 @@ +using CShells.Features; +using Elsa.Bpmn.ShellFeatures; +using Elsa.Common.ShellFeatures; +using JetBrains.Annotations; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Bpmn.Interchange.ShellFeatures; + +/// +/// Provides BPMN XML interchange support to the system. +/// +[ShellFeature( + DisplayName = "BPMN Interchange", + Description = "Provides BPMN XML interchange (import/export) capabilities for workflows.", + DependsOn = [typeof(BpmnFeature)])] +[UsedImplicitly] +public class BpmnInterchangeFeature : IShellFeature +{ + public void ConfigureServices(IServiceCollection services) + { + } +} diff --git a/src/modules/Elsa.Bpmn/Elsa.Bpmn.csproj b/src/modules/Elsa.Bpmn/Elsa.Bpmn.csproj new file mode 100644 index 000000000..79d5dcd3a --- /dev/null +++ b/src/modules/Elsa.Bpmn/Elsa.Bpmn.csproj @@ -0,0 +1,22 @@ + + + + + Provides BPMN execution support by wiring the Bpmn.Model and Bpmn.Semantics libraries into Elsa. + + elsa extension module bpmn + + false + + + + + + + + + + + + + diff --git a/src/modules/Elsa.Bpmn/Extensions/ModuleExtensions.cs b/src/modules/Elsa.Bpmn/Extensions/ModuleExtensions.cs new file mode 100644 index 000000000..55ca7bf42 --- /dev/null +++ b/src/modules/Elsa.Bpmn/Extensions/ModuleExtensions.cs @@ -0,0 +1,23 @@ +using Elsa.Bpmn.Features; +using Elsa.Features.Services; + +// ReSharper disable once CheckNamespace +namespace Elsa.Extensions; + +/// +/// Provides extension methods for instances. +/// +public static class ModuleExtensions +{ + /// + /// Enables the BPMN feature. + /// + /// The module. + /// A delegate to configure the feature. + /// The module. + public static IModule UseBpmn(this IModule module, Action? configure = null) + { + module.Configure(configure); + return module; + } +} diff --git a/src/modules/Elsa.Bpmn/Features/BpmnFeature.cs b/src/modules/Elsa.Bpmn/Features/BpmnFeature.cs new file mode 100644 index 000000000..0d6841542 --- /dev/null +++ b/src/modules/Elsa.Bpmn/Features/BpmnFeature.cs @@ -0,0 +1,15 @@ +using Elsa.Features.Abstractions; +using Elsa.Features.Services; + +namespace Elsa.Bpmn.Features; + +/// +/// Provides BPMN execution support to the system. +/// +public class BpmnFeature : FeatureBase +{ + /// + public BpmnFeature(IModule module) : base(module) + { + } +} diff --git a/src/modules/Elsa.Bpmn/FodyWeavers.xml b/src/modules/Elsa.Bpmn/FodyWeavers.xml new file mode 100644 index 000000000..00e1d9a1c --- /dev/null +++ b/src/modules/Elsa.Bpmn/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Bpmn/ShellFeatures/BpmnFeature.cs b/src/modules/Elsa.Bpmn/ShellFeatures/BpmnFeature.cs new file mode 100644 index 000000000..f8c35cb80 --- /dev/null +++ b/src/modules/Elsa.Bpmn/ShellFeatures/BpmnFeature.cs @@ -0,0 +1,20 @@ +using CShells.Features; +using Elsa.Common.ShellFeatures; +using JetBrains.Annotations; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Bpmn.ShellFeatures; + +/// +/// Provides BPMN execution support to the system. +/// +[ShellFeature( + DisplayName = "BPMN", + Description = "Provides BPMN execution capabilities for workflows.")] +[UsedImplicitly] +public class BpmnFeature : IShellFeature +{ + public void ConfigureServices(IServiceCollection services) + { + } +} diff --git a/test/integration/Elsa.Bpmn.IntegrationTests/BpmnFeatureTests.cs b/test/integration/Elsa.Bpmn.IntegrationTests/BpmnFeatureTests.cs new file mode 100644 index 000000000..a1e884731 --- /dev/null +++ b/test/integration/Elsa.Bpmn.IntegrationTests/BpmnFeatureTests.cs @@ -0,0 +1,29 @@ +using Elsa.Extensions; +using Elsa.Features.Contracts; +using Elsa.Testing.Shared; +using Microsoft.Extensions.DependencyInjection; +using Xunit.Abstractions; + +namespace Elsa.Bpmn.IntegrationTests; + +public class BpmnFeatureTests +{ + private readonly ITestOutputHelper _testOutputHelper; + + public BpmnFeatureTests(ITestOutputHelper testOutputHelper) + { + _testOutputHelper = testOutputHelper; + } + + [Fact] + public void Build_WithUseBpmn_RegistersBpmnFeature() + { + var services = new TestApplicationBuilder(_testOutputHelper) + .ConfigureElsa(elsa => elsa.UseBpmn()) + .Build(); + + var registry = services.GetRequiredService(); + + Assert.NotNull(registry.Find("Elsa.Bpmn")); + } +} diff --git a/test/integration/Elsa.Bpmn.IntegrationTests/Elsa.Bpmn.IntegrationTests.csproj b/test/integration/Elsa.Bpmn.IntegrationTests/Elsa.Bpmn.IntegrationTests.csproj new file mode 100644 index 000000000..8ef2dbfba --- /dev/null +++ b/test/integration/Elsa.Bpmn.IntegrationTests/Elsa.Bpmn.IntegrationTests.csproj @@ -0,0 +1,13 @@ + + + + [Elsa.Bpmn]* + 1 + + + + + + + + diff --git a/test/integration/Elsa.Bpmn.Interchange.IntegrationTests/BpmnInterchangeFeatureTests.cs b/test/integration/Elsa.Bpmn.Interchange.IntegrationTests/BpmnInterchangeFeatureTests.cs new file mode 100644 index 000000000..1d1abdfb9 --- /dev/null +++ b/test/integration/Elsa.Bpmn.Interchange.IntegrationTests/BpmnInterchangeFeatureTests.cs @@ -0,0 +1,30 @@ +using Elsa.Extensions; +using Elsa.Features.Contracts; +using Elsa.Testing.Shared; +using Microsoft.Extensions.DependencyInjection; +using Xunit.Abstractions; + +namespace Elsa.Bpmn.Interchange.IntegrationTests; + +public class BpmnInterchangeFeatureTests +{ + private readonly ITestOutputHelper _testOutputHelper; + + public BpmnInterchangeFeatureTests(ITestOutputHelper testOutputHelper) + { + _testOutputHelper = testOutputHelper; + } + + [Fact] + public void Build_WithUseBpmnInterchange_RegistersBpmnInterchangeFeature() + { + var services = new TestApplicationBuilder(_testOutputHelper) + .ConfigureElsa(elsa => elsa.UseBpmnInterchange()) + .Build(); + + var registry = services.GetRequiredService(); + + Assert.NotNull(registry.Find("Elsa.Bpmn")); + Assert.NotNull(registry.Find("Elsa.BpmnInterchange")); + } +} diff --git a/test/integration/Elsa.Bpmn.Interchange.IntegrationTests/Elsa.Bpmn.Interchange.IntegrationTests.csproj b/test/integration/Elsa.Bpmn.Interchange.IntegrationTests/Elsa.Bpmn.Interchange.IntegrationTests.csproj new file mode 100644 index 000000000..590a317cd --- /dev/null +++ b/test/integration/Elsa.Bpmn.Interchange.IntegrationTests/Elsa.Bpmn.Interchange.IntegrationTests.csproj @@ -0,0 +1,13 @@ + + + + [Elsa.Bpmn.Interchange]* + 1 + + + + + + + + diff --git a/test/unit/Elsa.Bpmn.Interchange.UnitTests/BpmnInterchangeFeatureTests.cs b/test/unit/Elsa.Bpmn.Interchange.UnitTests/BpmnInterchangeFeatureTests.cs new file mode 100644 index 000000000..0262f1f07 --- /dev/null +++ b/test/unit/Elsa.Bpmn.Interchange.UnitTests/BpmnInterchangeFeatureTests.cs @@ -0,0 +1,20 @@ +using Elsa.Bpmn.Interchange.Features; +using Elsa.Extensions; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Bpmn.Interchange.UnitTests; + +public class BpmnInterchangeFeatureTests +{ + [Fact] + public void UseBpmnInterchange_ConfiguresBpmnInterchangeFeature() + { + var services = new ServiceCollection(); + var module = services.CreateModule(); + + module.UseBpmnInterchange(); + module.Apply(); + + Assert.True(module.HasFeature()); + } +} diff --git a/test/unit/Elsa.Bpmn.Interchange.UnitTests/BpmnInterchangeWiringTests.cs b/test/unit/Elsa.Bpmn.Interchange.UnitTests/BpmnInterchangeWiringTests.cs new file mode 100644 index 000000000..3aa16f17f --- /dev/null +++ b/test/unit/Elsa.Bpmn.Interchange.UnitTests/BpmnInterchangeWiringTests.cs @@ -0,0 +1,14 @@ +using Bpmn.Interchange; + +namespace Elsa.Bpmn.Interchange.UnitTests; + +public class BpmnInterchangeWiringTests +{ + [Fact] + public void BpmnXmlReader_IsReachable() + { + var reader = new BpmnXmlReader(); + + Assert.NotNull(reader); + } +} diff --git a/test/unit/Elsa.Bpmn.Interchange.UnitTests/Elsa.Bpmn.Interchange.UnitTests.csproj b/test/unit/Elsa.Bpmn.Interchange.UnitTests/Elsa.Bpmn.Interchange.UnitTests.csproj new file mode 100644 index 000000000..a46a37138 --- /dev/null +++ b/test/unit/Elsa.Bpmn.Interchange.UnitTests/Elsa.Bpmn.Interchange.UnitTests.csproj @@ -0,0 +1,13 @@ + + + + [Elsa.Bpmn.Interchange]* + 1 + + + + + + + + diff --git a/test/unit/Elsa.Bpmn.UnitTests/BpmnFeatureTests.cs b/test/unit/Elsa.Bpmn.UnitTests/BpmnFeatureTests.cs new file mode 100644 index 000000000..3346c890e --- /dev/null +++ b/test/unit/Elsa.Bpmn.UnitTests/BpmnFeatureTests.cs @@ -0,0 +1,20 @@ +using Elsa.Bpmn.Features; +using Elsa.Extensions; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Bpmn.UnitTests; + +public class BpmnFeatureTests +{ + [Fact] + public void UseBpmn_ConfiguresBpmnFeature() + { + var services = new ServiceCollection(); + var module = services.CreateModule(); + + module.UseBpmn(); + module.Apply(); + + Assert.True(module.HasFeature()); + } +} diff --git a/test/unit/Elsa.Bpmn.UnitTests/BpmnSemanticsWiringTests.cs b/test/unit/Elsa.Bpmn.UnitTests/BpmnSemanticsWiringTests.cs new file mode 100644 index 000000000..772727bb5 --- /dev/null +++ b/test/unit/Elsa.Bpmn.UnitTests/BpmnSemanticsWiringTests.cs @@ -0,0 +1,14 @@ +using Bpmn.Semantics; + +namespace Elsa.Bpmn.UnitTests; + +public class BpmnSemanticsWiringTests +{ + [Fact] + public void CreateDefault_ReturnsInterpreter() + { + var interpreter = BpmnInterpreter.CreateDefault(); + + Assert.NotNull(interpreter); + } +} diff --git a/test/unit/Elsa.Bpmn.UnitTests/Elsa.Bpmn.UnitTests.csproj b/test/unit/Elsa.Bpmn.UnitTests/Elsa.Bpmn.UnitTests.csproj new file mode 100644 index 000000000..064d2eb20 --- /dev/null +++ b/test/unit/Elsa.Bpmn.UnitTests/Elsa.Bpmn.UnitTests.csproj @@ -0,0 +1,13 @@ + + + + [Elsa.Bpmn]* + 1 + + + + + + + +